【OpenCV学习】(五)图像运算

【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)

【OpenCV学习】(五)图像运算

总结

图像的运算基本上都是用函数实现了,从使用上看起来比较简单,但其内在的原理相对会复杂一些;并且对于一些分割任务需要设置掩码的,本质上就是一种图像的运算,在后续会深入再运用;

上一篇:python面向对象之多态,类属性,类方法,静态方法


下一篇:Puppeteer-html2pdf工具