OpenCV Python教程:图像算术运算与逻辑运算-演道网

欢迎来到另一个带有Python的OpenCV教程,在本教程中,我们将介绍一些可以在图像上执行的简单算术运算,并说明它们的作用。 为此,我们将需要开始使用两个大小相等的图像,然后再使用较小的图像和较大的图像。 首先,我将使用:

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

这些是一些附加选项,但是如果您确实想将一个图像添加到另一个图像中,而最新图像与第一个图像重叠,该怎么办?在这种情况下,您将从最大的图像开始,然后添加较小的图像。为此,我们将使用相同的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,把它的内容替换到那个空白处的内容。

结果:

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

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

更多Python相关信息见Python 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=17

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址:<a href="../../Linux

转载自演道,想查看更及时的互联网产品技术热点文章请点击http://go2live.cn