opencv入门到精通——图像上的算术运算
目录
?
目标
-
学习图像的几种算术运算,例如加法,减法,按位运算等。
-
您将学习以下功能:cv.add,cv.addWeighted等。
图像加法
您可以通过OpenCV函数cv.add()
或仅通过numpy操作res = img1 + img2
添加两个图像。两个图像应具有相同的深度和类型,或者第二个图像可以只是一个标量值。
注意
OpenCV加法和Numpy加法之间有区别。OpenCV加法是饱和运算,而Numpy加法是模运算。
例如,考虑以下示例:
>>>?x?=?np.uint8([250])
>>>?y?=?np.uint8([10])
>>>?print(?cv.add(x,y)?)?#?250+10?=?260?=>?255
[[255]]
>>>?print(?x+y?)??????????#?250+10?=?260?%?256?=?4
[4]
当添加两个图像时,它将更加可见。OpenCV功能将提供更好的结果。因此,始终最好坚持使用OpenCV功能。
图像融合
这也是图像加法,但是对图像赋予不同的权重,以使其具有融合或透明的感觉。根据以下等式添加图像:
G(x)= (1 - \alpha)f_0(x)+ \alpha f_1
通过从?α?从?0→1?更改,您可以在一个图像到另一个图像之间执行很酷的过渡。
在这里,我拍摄了两个图像,将它们融合在一起。第一幅图像的权重为0.7,第二幅图像的权重为0.3。cv.addWeighted()
在图像上应用以下公式。
在这里γ?被视为零。
img1?=?cv.imread('ml.png')
img2?=?cv.imread('opencv-logo.png')
dst?=?cv.addWeighted(img1,0.7,img2,0.3,0)
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()
检查以下结果:
按位运算
这包括按位?AND
、?OR
、NOT
?和?XOR
?操作。它们在提取图像的任何部分(我们将在后面的章节中看到)、定义和处理非矩形 ROI 等方面非常有用。?下面我们将看到一个例子,如何改变一个图像的特定区域。
我想把 OpenCV 的标志放在一个图像上面。如果我添加两个图像,它会改变颜色。如果我混合它,我得到一个透明的效果。但我希望它是不透明的。如果是一个矩形区域,我可以使用 ROI,就像我们在上一章中所做的那样。但是 OpenCV 的 logo 不是长方形的。所以你可以使用如下的按位操作来实现:
我想在图像上方放置OpenCV徽标。如果添加两个图像,它将改变颜色。如果混合它,我将获得透明效果。但我希望它不透明。如果是矩形区域,则可以像上一章一样使用ROI。但是OpenCV徽标不是矩形。因此,您可以按如下所示进行按位操作:
#?加载两张图片
img1?=?cv.imread('messi5.jpg')
img2?=?cv.imread('opencv-logo-white.png')
#?我想把logo放在左上角,所以我创建了ROI
rows,cols,channels?=?img2.shape
roi?=?img1[0:rows,?0:cols?]
#?现在创建logo的掩码,并同时创建其相反掩码
img2gray?=?cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret,?mask?=?cv.threshold(img2gray,?10,?255,?cv.THRESH_BINARY)
mask_inv?=?cv.bitwise_not(mask)
#?现在将ROI中logo的区域涂黑
img1_bg?=?cv.bitwise_and(roi,roi,mask?=?mask_inv)
#?仅从logo图像中提取logo区域
img2_fg?=?cv.bitwise_and(img2,img2,mask?=?mask)
#?将logo放入ROI并修改主图像
dst?=?cv.add(img1_bg,img2_fg)
img1[0:rows,?0:cols?]?=?dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()
请看下面的结果。左图显示了我们创建的mask。右图显示最终结果。为了更好地理解,显示上面代码中的所有中间映像,特别是 img1_bg 和 img2_fg。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!