【OpenCV学习】(五)图像运算
背景
图像本质就是矩阵,对图像的处理往往就是矩阵的运算;常见的运算有加法、减法和位运算等,一些进阶的滤波等操作,也是基于这些简单运算而来的,只是修改了一些参数而已;
一、加法运算
实际上就是像素值的相加,起到一个调节亮度(曝光)的效果;
案例代码:
org = cv2.imread('./org.jpg')
# 创建一个相同大小的背景图
img = np.ones((1200, 1920, 3), np.uint8) * 30
# 像素值相加
result = cv2.add(org, img)
cv2.imshow('result', result)
cv2.waitKey(0)
深度思考一下,在具体项目中,对于数据的预处理也可以用加法的操作;通过两张图像相加并且设置一定权重,可以生成一张新的图像,扩展数据集的同时也提高了泛化能力;
二、减法运算
函数原型:
subtract(A,B):代表A减B
案例代码:
result = cv2.subract(org, img)
效果就是使图片变暗,也就是降低亮度;
三、图像融合
之前介绍加法操作时提及到可以设定权重,实际上opencv中有给定这样的函数addWeighted(A,alpha,B,bate,gamma),其中alpha和beta是代表AB图像的权重,gamma表示静态权重;
案例代码:
A = cv2.imread('A.jpg')
B = cv2.imread('B.jpg')
result = cv2.addWeighted(A, 0.7, B, 0.3, 0)
注意:不管做任何运算,需要确保两张图像的大小一致;
四、位运算
1、非运算
bitwise_not(图像):也就是把黑的变白,白的变黑;
2、与运算
bitwise_and(图像A,图像B):也就是像素值相同的部分为白,不同部分为黑;(求交集)
3、或运算
bitwise_or(图像A,图像B):也就是像素值为白的部分全部为白,其余部分为黑;(求并集)
4、异或运算
bitwise_xor(图像A,图像B):也就是像素值相同部分为黑,其余部分不变;(并集减去交集)
五、添加水印案例
主要步骤:
1、引入原始图像;
2、设计一个LOGO图像;
3、计算添加位置,将原始图像中该区域设置成黑色;
4、将LOGO图像与处理后图像用add叠加;
代码示例:
dog = cv2.imread('./dog.jpeg')
# 创建LOGO和mask
logo = np.zeros((200,200,3), np.uint8)
mask = np.zeros((200,200), np.uint8)
# 绘制图形
logo[10:110,10:110] = [0, 255, 0]
logo[90:190, 90:190] = [0, 0, 255]
mask[10:110,10:110] = 255
mask[90:190, 90:190] = 255
# 对mask求反
mask = cv2.bitwise_not(mask)
# 选择图像的一个区域
roi = dog[0:200, 0:200]
# 与mask进行操作
tmp = cv2.bitwise_and(roi, roi, mask)
# 叠加操作(由于图像过大,这里进行了缩放)
dst = cv2.add(tmp, logo)
dog[0:200,0:200] = dst
dog = cv2.resize(dog, (500,500), interpolation = cv2.INTER_AREA)
# 显示图像
cv2.imshow('dog', dog)
cv2.waitKey(0)
总结
图像的运算基本上都是用函数实现了,从使用上看起来比较简单,但其内在的原理相对会复杂一些;并且对于一些分割任务需要设置掩码的,本质上就是一种图像的运算,在后续会深入再运用;