欢迎来到另一个带有Python的OpenCV教程,在本教程中,我们将介绍一些可以在图像上执行的简单算术运算,并说明它们的作用。 为此,我们将需要开始使用两个大小相等的图像,然后再使用较小的图像和较大的图像。 首先,我将使用:
和
首先,让我们看看一个简单的加法会做什么:
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,把它的内容替换到那个空白处的内容。
结果:
在下一篇教程中,我们将更深入地讨论阈值设置。