opencv-python 3 图像的算术运算

发布时间 2023-03-24 17:38:37作者: 一枚码农

图像的加法

你可以使用OpenCV的cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res = img1 + img2。两个图像应该具有相同的大小和类型,或者第二个图像可以是标量值。
注意:OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算。
参见下面代码:
image
这种差别在你对两幅图像进行加法时会更加明显。OpenCV 的结果会更好一点。所以我们尽量使用 OpenCV 中的函数。

图像的混合

这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉。图像混合的计算公式如下:
g(x) = (1−α)f0(x) + αf1(x)
通过修改 α 的值(0 → 1),可以实现非常炫酷的混合。
现在我们把两幅图混合在一起。第一幅图的权重是0.7,第二幅图的权重是0.3。函数cv2.addWeighted()可以按下面的公式对图片进行混合操作。
dst = α⋅img1 + β⋅img2 + γ
这里γ取为零。 参考以下代码:
image

图像按位操作

这里包括的按位操作有:AND,OR,NOT,XOR 等。当我们提取图像的一部分,选择非矩形ROI时这些操作会很有用。
img1
image

img2
image

把img2放到img1的左上角。如果我使用图像的加法,图像的颜色会改变,如果使用图像的混合,会得到一个透明的效果,但是我不希望它透明。如果它是矩形我可以像上一章那样使用ROI。但是OpenCV标志不是矩形。所以我们可以通过下面的按位运算实现:

img1 = cv.imread(r'C:\\Users\\yuyalong\\Pictures\\Camera Roll\\15.jpg')
img2 = cv.imread(r'C:\Users\yuyalong\Pictures\Saved Pictures\logo.jpg')

cv.imshow('img1', img1)
cv.imshow('img2', img2)

# I want to put logo on top-left corner, So I create a ROI
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]

# Now create a mask of logo and create its inverse mask also
# 现在创建一个徽标的掩膜,并创建其反向掩膜
# 变成灰度图像
img2gray = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)
# 图像二值化
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
cv.imshow('mask', mask)
# 按位取反
mask_inv = cv.bitwise_not(mask)
cv.imshow('mask_inv', mask_inv)

# Now black-out the area of logo in ROI
# 现在将ROI中的徽标区域涂黑
img1_bg = cv.bitwise_and(roi, roi, mask=mask_inv)
cv.imshow('img1_bg', img1_bg)

# Take only region of logo from logo image.
# 只从徽标图像中提取徽标区域。
img2_fg = cv.bitwise_and(img2, img2, mask=mask)
cv.imshow('img2_fg', img2_fg)

# Put logo in ROI and modify the main image
# 在ROI中放置徽标并修改主图像
dst = cv.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst

cv.imshow('res', img1)
cv.waitKey(0)
cv.destroyAllWindows()

结果展示
mask
image

mask_inv
image

img1_bg
image

img2_fg
image

res
image

mask(掩膜):
数字图像处理中的掩膜的概念是借鉴于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形“底片”称为掩膜(也称作“掩模”),其作用是:在硅片上选定的区域中对一个不透明的图形模板遮盖,继而下面的腐蚀或扩散将只影响选定的区域以外的区域
图像掩膜与其类似,用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程
数字图像处理中,掩模为二维矩阵数组,有时也用多值图像,图像掩模主要用于:
①提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0
②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计
③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征

mask就是位图啊,来选择哪个像素允许拷贝,哪个像素不允许拷贝。如果mask像素的值是非0的,我就拷贝它,否则不拷贝。