OpenCV Python教程:图像算术运算与逻辑运算

OpenCV Python教程:图像算术运算与逻辑运算

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 Python教程:图像算术运算与逻辑运算

您不太可能想要这种凌乱的添加。 OpenCV有一个“添加”方法,让我们看看它的作用,将以前的“添加”替换为:

add = cv2.add(img1,img2)

结果:

OpenCV Python教程:图像算术运算与逻辑运算

在这里也可能不是理想的选择。 我们可以看到很多图像非常“白”。 这是因为颜色是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方法,参数是第一个图像,权重,第二个图像,权重,最后是伽玛,它是光的度量。我们暂时将其保留为零。

结果:

OpenCV Python教程:图像算术运算与逻辑运算

现在,我们可以使用此徽标,并将其放置在原始图像上。这将非常容易(基本上使用与上一教程中使用的相同的代码,其中我们用新代码替换了图像区域(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,把它的内容替换到那个空白处的内容。

结果:

OpenCV Python教程:图像算术运算与逻辑运算

在下一篇教程中,我们将更深入地讨论阈值设置。

猜你喜欢

转载自www.linuxidc.com/Linux/2020-04/163027.htm