文章目录
OpenCV学习笔记 - 图像运算
图像算术运算
cv2.add(img1,img2)
-
功能:图像相加 (注意:img1,img2的图像的尺寸必须是一致的)
-
参数说明:
- img1 : 作矩阵相加的图像1(numpy类型)
- img2 : 作矩阵相加的图像2(numpy类型)
-
运算规则:
-
代码实例:
import cv2 import numpy as np # 读取图片 img1 = cv2.imread('./img/AI_Security.jpg') # 图的加法运算就是矩阵的加法运算 # 注意加法运算的两张图尺寸必须是一样的 img2 = np.ones(img1.shape,np.uint8) * 50 # 图像相加的结果 res = cv2.add(img1,img2) # 展示图片 cv2.imshow('img1',img1) cv2.imshow('img2',img2) cv2.imshow('res',res) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
-
实验效果:增加img1图像的亮度
cv2.subtract(img1,img2)
-
功能:图像相减 (注意:img1,img2的图像的尺寸必须是一致的)
-
参数说明:
- img1 : 作矩阵相减的图像1(numpy类型)
- img2 : 作矩阵相减的图像2(numpy类型)
-
运算规则:
-
代码实例:继图像相加的代码,将图像复原
# 图像相减 origin = cv2.subtract(res,img2) # 展示图片 cv2.imshow('origin',origin) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
-
实验效果:
-
补充:为了让图像相乘和相除更快可以用
cv2.multiply(img1,img2)
cv2.divide(img1,img2)
cv2.addWeighted(img1,alpha,img2,beta,gamma)
- 功能:实现图像融合
- 参数说明:
- img1:需要融合的图像1
- alpha:img1融合所占权重
- img2:需要融合的图像2
- beta:img2融合所占权重
- gamma:静态权重(简单理解为偏置项)
- 运算规则:
- 代码实例:
import cv2 import numpy as np ## 创建窗口 cv2.namedWindow('img1',cv2.WINDOW_NORMAL) cv2.namedWindow('img2',cv2.WINDOW_NORMAL) cv2.namedWindow('res',cv2.WINDOW_NORMAL) ## 设置展示窗口的大小 cv2.resizeWindow('img1',480,480) cv2.resizeWindow('img2',480,480) cv2.resizeWindow('res',480,480) ## 读取图片 img1 = cv2.imread('./img/AI_Security.jpg') img2 = cv2.imread('./img/TSU.jpg') ## 由于读入的两张图片尺寸是不一样的,因此我们需要将其尺寸保持一致 print(img1.shape) img2 = cv2.resize(img2,(img1.shape[1],img1.shape[0]),interpolation=cv2.INTER_CUBIC) print(img2.shape) ## 图片融合 res = cv2.addWeighted(img1,0.9,img2,0.1,0) ## 展示图片 cv2.imshow('img1',img1) cv2.imshow('img2',img2) cv2.imshow('res',res) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
- 实验效果:
图像位运算
cv2.bitwise_not(img)
-
功能:将图像进行像素的二进制值按位翻转
-
参数说明:
- img : 需要图像按位翻转的图像
-
代码实例:
import cv2 import numpy as np ## 初始化一张黑白单通道图片 img = np.ones((200,200),np.uint8) # 在图像中间挖一块白色的矩形 img[50:150,50:150] = 255 cv2.imshow('img',img) # 将图片翻转 img2 = cv2.bitwise_not(img) cv2.imshow('img2',img2) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
-
实验效果:
cv2.bitwise_and(img1,img2)
-
代码功能:将图像进行像素的二进制值按位与运算
-
参数说明:
- img1:需要作按位与运算的图像1
- img2:需要作按位与运算的图像2
-
实验效果:
cv2.bitwise_or(img1,img2) cv2.bitwise_xor(img1,img2)
-
代码功能:实现图像的按位或/异或运算,或or运算整合图像信息/异或xor运算实现重叠部分标暗
-
参数说明:
- img1:需要作按位与运算的图像1
- img2:需要作按位与运算的图像2
-
代码实例:
import cv2 import numpy as np img1 = np.zeros((200,200),np.uint8) img1[50:120,50:120] = 255 img2 = np.zeros((200,200),np.uint8) img2[80:150,80:150] = 255 cv2.imshow('img1',img1) cv2.imshow('img2',img2) ## 或:整合信息 img_or = cv2.bitwise_or(img1,img2) ## 异或:将重合部分标黑 img_xor = cv2.bitwise_xor(img1,img2) cv2.imshow('img_or',img_or) cv2.imshow('img_xor',img_xor) key = cv2.waitKey(0) if key & 0xFF == ord('q'): cv2.destroyAllWindows()
-
实验效果:
课程大作业 - 图像添加水印
基本步骤
引入一幅图片
# 导入图片
ai_security = cv2.imread('./img/AI_Security.jpg')
要有一个LOGO
# logo
tsu = cv2.imread('./img/TSU.jpg')
计算图片在什么地方添加,在添加的地方变成黑色
mask = np.full((200,200),255,np.uint8)
m = cv2.bitwise_not(mask)
# 选择AI_security添加logo的位置
roi = ai_security[0:200,0:200]
# 与m进行与操作(挖去需要添加logo的位置)
tmp = cv2.bitwise_and(roi,roi,mask=m)
利用add,将LOGO与图片叠加在一起
# 添加logo
dst = cv2.add(tmp,tsu)
ai_security[0:200,0:200] = dst
展示效果
## 展示图片
cv2.imshow('ai',ai_security)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
cv2.destroyAllWindows()