Opencv(图像处理)-基于Python-图像的基本运算-给图片加水印

news2024/10/7 14:27:01

在这里插入图片描述

  • 1. 图像运算概念
  • 2. 图像运算
    • 2.1 add()
    • 2.2 substract()
    • 部分代码示例:
  • 2.3 multiply()/divide()
  • 2.4 addWeighted()
    • 部分代码展示
  • 2.5 与/或/非
    • bitwise_and()
    • bitwise_or()
    • bitwise_not()
    • bitwise_xor
    • 部分代码展示
  • 3.给一幅图像添加水印

1. 图像运算概念

在计算机的世界里,图像由一个个像素点组成,每个像素点代表一个数字,并且数字的大小代表像素点的颜色,所有像素点的颜色组成了一个图像。因此,使用矩阵可以很好的表示图像。
OpenCV提供的运算方法就是基于矩阵的运算。

2. 图像运算

2.1 add()

将两张图片相加(矩阵的各个像素点分别对应相加)
result = cv2.add(img1,img2)
参数:两张大小完全相同的图片。
返回值计算过后的图片(深拷贝)

在这里插入图片描述

把lina图4的左上角部分截取了在图1中,然后与girl图2相加,得到如图3的结果

2.2 substract()

将两个图片做差(矩阵的各个像素点分别对应相减)
result = cv2.subtract(img1,img2)
参数:img1-img2
结果保存在一个新参数中(深拷贝)

在这里插入图片描述

图像1和2作差后,亮度降低

部分代码示例:

import cv2
import numpy as np


img1 = cv2.imread('./image/girl.png')
img2 = cv2.imread('./image/lina.jpg')
# 打印两个图片的参数
print(img1.shape)
print(img2.shape)

# 创建像素点为1的矩阵,并且每个像素点都乘50
img3 = np.ones((185, 185, 3), np.uint8)*100

# img2过大,我们截取部分图像,让region与img1一样大
# 截取为深拷贝,对截取的图像运算,并不改变原图像
region = img2[0:185, 0:185]
# 将两个图像运算
result = cv2.add(img1, region)
# 降低图片的亮度
low_light_result = cv2.subtract(result, img3)
# 展示图片
# cv2.imshow("img1", img1)
# cv2.imshow("img2", img2)
# cv2.imshow("region", region)
cv2.imshow('result', result)
cv2.imshow('img3', img3)
cv2.imshow('low_light_result', low_light_result)

cv2.waitKey(0)

2.3 multiply()/divide()

矩阵乘法(将两个矩阵各个像素点分别相乘)
result = cv2.multiply(img1,img2)
矩阵除法(将两个矩阵的各个像素点分别相除)
result = cv2.divide()

2.4 addWeighted()

图像融合,按权重相加
result = cv2.addWeighted(A,alpha,B,bate,gamma)
参数:alpha:A的权重;bate:B的权重;gamma:静态权重(运算完以后再加gamma)

在这里插入图片描述

在这里插入图片描述
将图1按0.2,图2按0.8的权重相加得到图3

部分代码展示

import cv2
import numpy as np


img1 = cv2.imread('./image/girl.png')
img2 = cv2.imread('./image/lina.jpg')
# 打印两个图片的参数
print(img1.shape)
print(img2.shape)

# img2过大,我们截取部分图像,让region与img1一样大
# 截取为深拷贝,对截取的图像运算,并不改变原图像
region = img2[0:185, 0:185]


# 展示图片
cv2.imshow("img1", img1)
cv2.imshow("region", region)

# 图像融合
result = cv2.addWeighted(region, 0.2, img1, 0.8, 0)

cv2.imshow('result', result)

cv2.waitKey(0)

2.5 与/或/非

这里的逻辑运算和我们熟知的其他语言的逻辑运算是一致的。是将矩阵的各个像素点分别进行逻辑运算。

bitwise_and()

图像的按位与运算
result = cv2.bitwise_and(img1,img2)

bitwise_or()

图像的按位或运算
result = cv2.bitwise_or(img1,img2)

bitwise_not()

图像的非运算
result = cv2.bitwise_not(img)

bitwise_xor

图像的按位异或运算(相同为0,相异为1)
result = cv2.bitwise_xor(img1,img2)

部分代码展示

import cv2
import numpy as np

# 创建一个全0图像
img1 = np.zeros((400, 400, 3), np.uint8)
img2 = np.zeros((400, 400, 3), np.uint8)

# 将两幅图部分变成白色
img1[100:200, 100:200] = [255, 255, 255]
img2[150:250, 150:250] = [255, 255, 255]
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)

# 位运算
img_and = cv2.bitwise_and(img1, img2)
cv2.imshow('img_and', img_and)
img_or = cv2.bitwise_or(img1, img2)
cv2.imshow('img_or', img_or)
img_not = cv2.bitwise_not(img1)
cv2.imshow('img_not', img_not)
img_xor = cv2.bitwise_xor(img1, img2)
cv2.imshow('img_xor', img_xor)



cv2.waitKey(0)

代码结果如下所示:
在这里插入图片描述

3.给一幅图像添加水印

下面将展示给图片添加水印的大致步骤:

  1. 引入一幅图片lina
  2. 要准备一个logo,自己创建
  3. 计算在图片的什么地方添加,把添加的地方变成黑色
  4. 利用add,将logo与图片叠加在一起
import cv2
import numpy as np

img = cv2.imread('./image/lina.jpg')
col, row, chanles = img.shape

# 创建logo
logo = np.zeros((80, 80, 3), np.uint8)
mask1 = np.zeros((80, 80), np.uint8)# 只有一通道,是灰度图
# 画logo
logo[10:40, 10:40] = [0, 0, 255]
logo[30:70, 30:70] = [0, 255, 0]
# 为了将图片中的部分截取下来,把logo的地方给弄黑
mask1[10:40, 10:40] = 255
mask1[30:70, 30:70] = 255
mask1 = cv2.bitwise_not(mask1)
# 截取图像部分
region_img = img[0:80, 0:80]
# 单通道图像与三通道图像运算,智能这样运算。
mask1 = cv2.bitwise_and(region_img, region_img, mask = mask1)

finish_logo = cv2.add(logo, mask1)
# 将处理好的mask1与原图像赋值(添加成功)
img[0:80, 0:80] = finish_logo

cv2.imshow('img', img)
# cv2.imshow('logo', logo)
# cv2.imshow('mask1', mask1)
# cv2.imshow('fin_logo',finish_logo)

cv2.waitKey(0)

如图,在左上角添加了一个logo
在这里插入图片描述
以上就是关于图像运算的基本API,难免会有解释不清的地方,有问题欢迎在评论区讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git工作流实践

常见分支命名 远程仓库的分支:主干分支master, 开发分支dev,发布分支release 个人开发分支:特性分支feature, 缺陷修改分支bugfix, 热更新分支 hotfix 一般工作流如下 创建个人本地开发分支: git checkout -b feat…

Benewake(北醒) 快速实现TFmini-i-RS485与电脑通信操作说明

目录 一、前言二、工具准备1. USB-RS485 转接器2. TFmini-i-RS4853. 兆信直流电源4.连接线、绝缘胶带、螺丝刀5. PC:Windows 系统6. 串口助手软件 三、连接方式1. USB-RS485 转接板接口说明2. TFmini-i-RS485 引脚定义3. 连接图 四、TFmini-i-RS485 与电脑通信操作说…

cisp pte模拟题

1.信息搜集 本题共三个key 端口 1433 27689 存活ip 192.168.85.137 2.访问网站27689进行信息搜集 一个登录框,sql注入失败,暴力破解失败 扫描目录 发现三个文件robots.txt ,web.config 除了robots.txt,其他都访问不了 访问robots.txt,发现一个file参数…

ChatGPT实际上是如何工作的?

ChatGPT是如何工作的? 我们深入研究了广受欢迎的AI聊天机器人ChatGPT的内部运作方式。如果您想了解它是如何进行生成式人工智能魔术的,请继续阅读。 谷歌、Wolfram Alpha和ChatGPT都通过一个单行文本输入框与用户进行交互,并提供文本结果。谷…

Ubuntu18.04下搭建Ardupliot开发环境

本文参考的文章: -Ardupilot开发环境搭建(Ubuntu18.04,20190407) -Ardupilot环境搭建 1、下载文件 1.在GitHub上下载ardupilot文件,网速很慢的时候科学上网。 git clone https://github.com/ArduPilot/ardupilotcd ardupilotgit…

音乐推荐系统实战

文章目录 1. 项目背景2. 数据处理2.1 统计用户播放总量2.2 统计歌曲播放总量2.3 过滤出实验数据2.4 加入音乐详情信息2.5 查看音乐集情况2.6 查看用户播放量的分布 3. 推荐系统3.1 排行榜单排序3.2 基于歌曲相似度的推荐(协同过滤)3.3 基于矩阵分解&…

市面上流行的 5 大网页制作工具总结

这里是对市面上流行的 5 大网页制作工具的总结: 1. 即时设计 即时设计是一款国内新一代在线协作设计工具,具备原型、设计、交付、协作和资源管理等功能,适合个人用户和团队使用。它提供丰富的社区设计资源和原型模板,支持 UI/UX…

Python 的十大特性

摘要 在了解 Python 的特性之前,我们首先要了解 Python 编程语言是什么。Python 编程语言是世界上发展最快的编程语言。这一高级通用编程语言提供了广泛的实际应用,并且是一种非常流行的认证。 Python 可以让程序员更加高效地工作和集成系统。Python 的…

vue中如何通过iframe方式加载本地的vue页面

这个需求一般很少能遇到,只要说去了iframe,很多人就会唾弃。 但是有时候的确无法避免使用它,当iframe的特性带来的优势远远高于自己用div模拟的时候 啥时候需要用到iframe加载本地的vue文件呢 我在写一个demo,我需要demo效果模拟…

【接口测试】神器JMeter

‍1 JMeter是什么 Apache JMeter是Apache组织开发的一款开源软件,是一款非常好用的接口测试工具。它的特点是开源免费,简单好用。 我们在测试过程需要做接口测试的话就可以使用它,也可以用来批量造数据,接下来我们就来看看JMete…

Django框架之验证码简单实现

是一种方式防止csrf的策略。在用户注册、登录页面的时候使用;为了防止暴力请求,减轻服务器压力。 目录 安装pillow库 验证码显示 引入类库 视图方法 创建路由 创建表单 模板内容 模板路由 模板视图 视图验证 路由 引入 验证视图 效果 成功…

从7K到20K,在测试行业摸爬滚打的这5年,想个2023年还没找到工作的提个醒~

我是一名转IT测试人,我的专业是化学,去化工厂实习才发现这专业的坑人之处,化学试剂害人不浅,有毒,易燃易爆,实验室经常用丙酮,甲醇,四氯化碳,接触多了,吃个饭…

JMeter 接口测试教程,详解 HTTP Request 取样器和 fiddler 调试技巧!

目录 前言: 一、HTTP Request取样器介绍 二、使用HTTP Request取样器进行接口调试 1. 创建测试计划(Test Plan)和线程组(Thread Group) 2. 配置HTTP Request取样器参数 3. 添加断言 4. 运行接口测试 三、结合f…

Linux 企业级安全原理和防范技巧

Linux 企业级安全原理和防范技巧 1. 企业级Linux系统防护概述1.1 企业级Linux系统安全威胁1.2 企业级Linux系统安全立体式防范体系1.2.1 Linux文件系统访问安全1.2.2 Linux进程安全1. 进程的种类2. 进程管理方法 1.2.3 Linux用户管理安全1. 管理用户及组文件安全2. 用户密码管理…

【云计算】云存储是什么意思?与本地存储有什么区别?

云计算环境下,衍生了云存储、云安全、云资源、云管理、云支出等等概念。今天我们就来了解下什么是云存储?云存储与本地存储有什么区别? 云存储是什么意思? 云存储是一种新型的数据管理方式,它通过网络将大量不同类型、…

UGUI进阶知识[二十九]循环GridView

节省内存的常用滑动列表还有一种形式,上下滑动的GridView。这种格式的滑动列表可用于移动设备的背包,仓库,商店UI等数据可能海量从而导致产生特别多但又看不见的UI的情况。 于是基于 UGUI进阶知识[八]循环利用滑动列表的循环ListView工程做了…

普源1G带宽4通道10G采样率数字示波器MSO8104

超高性价比七合一 集成示波器在如今的集成设计领域,一款集成度较高的综合示波器已经成为设计工程师必不可少的得力工具。 MSO8000 系列数字示波器,它集 7 种独立仪器于一体,包括一台示波器、一台 16 通道逻辑分析仪、一台频谱分析仪、一台任…

煤矿电子封条建设实施方案算法 yolov7

煤矿电子封条建设实施方案算法通过yolov7网络模型深度学习技术,煤矿电子封条建设实施方案算法作为一种智能化安全新模式被广泛应用于各类场景中。YOLOv7 的发展方向与当前主流的实时目标检测器不同,研究团队希望它能够同时支持移动 GPU 和从边缘到云端的…

高完整性系统:Separation Logic for Automated Verification

目录 1. INTRODUCTION TO SEPARATION LOGIC 分离逻辑 1.1 霍尔推理(Hoare Reasoning) 1.2 堆指针的影响 1.3 全局和局部推理(Global and Local Reasoning) 1.4 组合推理(Compositional Reasoning) 1.…

chatgpt赋能python:Python中怎样输入数据以及数据类型

Python中怎样输入数据以及数据类型 Python是一种高级编程语言,常用于数据处理和分析、机器学习和Web开发等任务。输入数据是Python编程中的重要环节,因此本文将介绍Python中输入数据的方法和数据类型。 什么是数据输入? 数据输入是指将数据…