前提需知
执行图像运算时,图像的shape值要保持一致
一、加法运算
前诉
加法运算符“ + ”和cv2.add()函数可用于执行图像加法运算
用“+”执行图像加法时,若两个像素相加大于256,按256取模;用cv2.add()执行图像加法时,若两个像素相加大于256,则按255取模。
测试代码
import cv2
img=cv2.imread('img.png',cv2.IMREAD_REDUCED_COLOR_2) # 读图像,尺寸减小为1/2
img2=cv2.imread('img2.png',cv2.IMREAD_REDUCED_COLOR_2) # 读图像,尺寸减小为1/2
# 合并图像
img3=img+img2
img4=cv2.add(img,img2)
# 显示原图像、+运算结果图像、add()运算结果图像
cv2.imshow('Rem',img)
cv2.imshow('ice',img2)
cv2.imshow('Rem+ice',img3)
cv2.imshow('Rem add ice',img4)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果
二、加权加法运算
前诉
cv2.addWeighted(),用于将两个图像按照给定的权重进行加权合成,实现图像融合
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
参数说明:
- src1和src2是要合成的两个输入图像。
- alpha是第一个输入图像(src1)的权重。
- beta是第二个输入图像(src2)的权重。
- gamma是一个可选的参数,表示在合成过程中添加到每个像素上的常数值,不修正设置为0
权重越高,图像叠加显示效果越好,当权重为1时,相当于用叠加原图
函数会返回合成后的图像dst,其数学表达式为:dst = src1 * alpha + src2 * beta + gamma
测试代码
import cv2
img1 = cv2.imread('img.png', cv2.IMREAD_REDUCED_COLOR_2) # 读图像,尺寸减小为1/2
img2 = cv2.imread('img2.png', cv2.IMREAD_REDUCED_COLOR_2) # 读图像,尺寸减小为1/2
img3 = cv2.addWeighted(img1, 0.8, img2, 0.2, 0)
cv2.imshow('Rem', img1) # 显示img1
cv2.imshow('ice', img2) # 显示img2
cv2.imshow('Rem AW ice', img3) # 显示加权加法运算后的图像
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果
总结
权重越高,图像叠加后显示效果越好。当权重为1时,相当于用原图进行叠加
三、位运算
前诉
图像由若干像素点组成,每个像素点在计算机中是用一个字节储存,用二进制表示。而位运算是二进制的操作,所以图像可以进行位运算。计算机中0为假,1(非0)为真。
例子:两张shape值相同图像的相同相对位置的像素点值分别为42,127,转化为二进制=分别为00101010,01111111,分别进行下列位运算:
与运算:全真为真,一假为假
或运算:全假为假,一真为真
取反运算:真变假,假变真
异或运算:不同为真,相同为假
测试代码
import cv2
src1 = cv2.imread('img.png', cv2.IMREAD_REDUCED_COLOR_2) # 读三通道彩图,尺寸减小为1/2
src2 = cv2.imread('HB.png', cv2.IMREAD_REDUCED_COLOR_2) # 读三通道黑白图,尺寸减小为1/2
# 封装函数,局部变量不会影响初始数据
def s1ands2(img1,img2):
img = cv2.bitwise_and(img1, img2) # 按位与
cv2.imshow('Rem and ice', img) # 显示与运算图片
return 0
def s1ors2(img1,img2):
img = cv2.bitwise_or(img1, img2) # 按位或
cv2.imshow('Rem or ice', img) # 显示或运算图片
return 0
def s1nots2(img1):
img = cv2.bitwise_not(img1) # 按位取反
cv2.imshow('Rem not ice', img) # 显示取反运算与图片
return 0
def s1xors2(img1,img2):
img = cv2.bitwise_xor(img1, img2) # 按位异或
cv2.imshow('Rem xor ice', img) # 显示异或运算图片
return 0
cv2.imshow('Rem1', src1) # 显示三通道彩图
cv2.imshow('HB', src2) # 显示三通道黑白图
# 调用位运算函数
s1ands2(src1,src2)
s1ors2(src1,src2)
s1nots2(src1)
s1xors2(src1,src2)
cv2.waitKey(0) # 等待按键输入任意键
cv2.destroyAllWindows() # 销毁所有窗口
运行结果
OpenCV学习笔记,雨声伴我入眠
2023/07/29/1:51