OpenCV Python教程:图像算术运算与逻辑运算-演道网
和
首先,让我们看看一个简单的加法会做什么:
import cv2
import numpy as np
# 800 x 500
img1 = cv2.imread('linuxidc.png')
img2 = cv2.imread('linuxidc.com.png')
add = img1+img2
cv2.imshow('www.linuxidc.com',add)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果:
您不太可能想要这种凌乱的添加。 OpenCV有一个“添加”方法,让我们看看它的作用,将以前的“添加”替换为:
add = cv2.add(img1,img2)
结果:
在这里也可能不是理想的选择。 我们可以看到很多图像非常“白”。 这是因为颜色是0-255,其中255是“全光”。 因此,例如:(155,211,79) + (50, 170, 200) = 205, 381, 279…转换为 (205, 255,255).
接下来,我们可以添加图像,并且可以说每个图像都带有不同的“权重”。 这可能是这样的:
import cv2
import numpy as np
img1 = cv2.imread('linuxidc.png')
img2 = cv2.imread('linuxidc.com.png')
weighted = cv2.addWeighted(img1, 0.6, img2, 0.4, 0)
cv2.imshow('weighted',weighted)
cv2.waitKey(0)
cv2.destroyAllWindows()
对于addWeighted方法,参数是第一个图像,权重,第二个图像,权重,最后是伽玛,它是光的度量。我们暂时将其保留为零。
结果:
这些是一些附加选项,但是如果您确实想将一个图像添加到另一个图像中,而最新图像与第一个图像重叠,该怎么办?在这种情况下,您将从最大的图像开始,然后添加较小的图像。为此,我们将使用相同的linuxidc.png图像,但使用一个新的Linux公社LOGO:
现在,我们可以使用此徽标,并将其放置在原始图像上。这将非常容易(基本上使用与上一教程中使用的相同的代码,其中我们用新代码替换了图像区域(ROI)),但是如果我们只想要LOGO部分而不是白色背景怎么办? ?我们可以使用与以前用于ROI替换相同的原理,但是我们需要一种“去除”LOGO背景的方法,以使白色不会不必要地阻挡更多的背景图像。首先来看看完整的代码,然后说明:
import cv2
import numpy as np
# Load two images
img1 = cv2.imread('linuxidc.png')
img2 = cv2.imread('linuxidclogo.png')
# 我想把LOGO放在左上角,所以我创造一个ROI
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
# 现在创建LOGO遮罩并创建其反遮罩
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
# 添加阈值
ret, mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV)
mask_inv = cv2.bitwise_not(mask)
# 现在将ROI中LOGO的区域涂黑
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)
# 从LOGO图像中只提取LOGO的区域。
img2_fg = cv2.bitwise_and(img2,img2,mask = mask)
dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv2.imshow('www.linuxidc.com',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
这里发生了不少事情,出现了一些新情况。我们看到的第一个新东西,是一个阈值的应用:ret, mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV)。
我们将在下一篇教程中,我们将进一步介绍阈值,因此请继续关注,但是基本上它的工作方式是根据阈值将所有像素转换为黑色或白色。在本例中,阈值为220,但是我们可以使用其他值,甚至可以动态选择一个值,这就是ret变量的作用。接下来,我们看到:mask_inv = cv2.bitwise_not(mask)。这是一个按位操作。基本上,这些运算符与Python中的典型运算符非常相似,除了一个运算符外,我们在这里不会涉及它。在这种情况下,不可见部分就是黑色所在的位置。然后,可以说我们要在第一个图像中将该区域涂黑,然后取图2,把它的内容替换到那个空白处的内容。
结果:
在下一篇教程中,我们将更深入地讨论阈值设置。
更多Python相关信息见Python 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=17
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx
本文永久更新链接地址:<a href="../../Linux
转载自演道,想查看更及时的互联网产品技术热点文章请点击http://go2live.cn