OpenCV 中的图像遮罩
如果我们想过滤掉图像的某些部分,然后将这个过滤掉的部分与另一幅图像结合起来,那么这可以使用遮罩来完成。 在 OpenCV 中,按位与运算符用于将两个不同的图像合并为一个,或者它可以将一个图像的某些部分合并为另一个。
按位与通常计算两个数组/标量/图像的每个元素的按位逻辑组合。 在本文中,我们将了解如何使用 OpenCV 库的按位与运算符对图像应用蒙版。
使用按位与运算符在 OpenCV 中执行掩码
OpenCV中使用位运算符,以便我们可以提取或过滤掉图像的一部分,描绘图像并使用非矩形ROI(感兴趣区域)进行操作。 要在 OpenCV 中执行按位与运算,我们使用 bitwise_and() 方法。
bitwise_and()
的语法如下。
cv.bitwise_and( img_array_1, img_array_2, destination_array, masking)
bitwise_and()
方法有四个参数:
- img_array_1:数组格式的图像 1 的数据。
- img_array_2:图像 2 的数组格式数据。
- destination_array:与输入数组具有相同大小和类型的输出图像。 这是一个可选参数。
- masking:这是对结果图像执行的掩码操作。 这是一个可选参数。
让我们在下面的示例的帮助下使用 bitwise_and()
看看掩码是如何工作的。
假设我们有两张图片,一张是徽标图片,另一张是汽车图片,我们需要在汽车图片的左上角添加徽标。 因此,为了实现这一点,我们将使用 OpenCV 在 Python 中编写以下代码。
首先,我们需要读取徽标和汽车图像的图像,然后分别将它们分配给 img1 和 img2 变量。 通过遮罩,我们将使用 ROI 在汽车图像的左上角应用或显示徽标。
为此,我们将从我们的徽标 img2 中提取行、列和通道数据。 因为我们想把这个标志放在汽车图像的左上角,我们将在 img1(0,0) 坐标上应用 img2 的行和列,如下所示。
代码片段:
# import opencv
import cv2 as cv
# Loading images
img1 = cv.imread('car.jpg')
img2 = cv.imread('logo.png')
# We want to put the logo on the top-left corner, so we create ROI
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
# Now create a mask of the logo and create its inverse mask, also
img2gray = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
# Now black out the area of the logo in ROI
img1_bg = cv.bitwise_and(roi, roi, mask=mask_inv)
# Take only the region of the logo from the logo image.
img2_fg = cv.bitwise_and(img2, img2, mask=mask)
# Put logo in ROI and modify the main image
dst = cv.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv.imshow('mask',mask)
cv.imshow('inv_mask',mask_inv)
cv.imshow('img1_bg',img1_bg)
cv.imshow('img2_fg',img2_fg)
cv.imshow('Final image', img1)
cv.waitKey(0)
cv.destroyAllWindows()
在此之后,我们必须创建徽标的掩码和反掩码。 为此,我们最初将徽标的背景色更改为灰色,并使用它来制作蒙版和逆蒙版图像作为蒙版和蒙版_inv。
要更改图像的背景颜色,我们将使用 cvtColor()
方法,而要创建遮罩,我们将使用 threshold()
方法。 最后,我们将使用 bitwise_not()
来反转图像。
我们还可以在 mask 和 mask_inv 图像上使用 imshow()
函数来检查在屏蔽过程中发生了什么变化。
现在我们将 ROI 中的徽标区域涂黑并执行 bitwise_and()
以获得徽标的背景,即 img2。 类似地,我们只从徽标图像中取出徽标并执行 bitwise_and()
以获得汽车图像的前景,即 img1。
在这里,我们还可以在 img1(汽车图像)和 img2(徽标图像)图像上使用 imshow()
函数来检查哪些内容已更改。
现在,我们同时添加了 img1 和 img2,因此我们在 ROI 中获得了带有汽车背景的徽标。 然后我们将这个输出图像放在 dst 中。
输出:
我们稍后将 dst 添加到整个汽车图像中,并使用 imshow()
获得最终输出。 这就是我们如何使用 ROI 来获取图像的某些特定部分并将其添加到另一幅图像以获得最终图像。
相关文章
Pandas DataFrame DataFrame.shift() 函数
发布时间:2024/04/24 浏览次数:133 分类:Python
-
DataFrame.shift() 函数是将 DataFrame 的索引按指定的周期数进行移位。
Python pandas.pivot_table() 函数
发布时间:2024/04/24 浏览次数:82 分类:Python
-
Python Pandas pivot_table()函数通过对数据进行汇总,避免了数据的重复。
Pandas read_csv()函数
发布时间:2024/04/24 浏览次数:254 分类:Python
-
Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。
Pandas 多列合并
发布时间:2024/04/24 浏览次数:628 分类:Python
-
本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。
Pandas loc vs iloc
发布时间:2024/04/24 浏览次数:837 分类:Python
-
本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。
在 Python 中将 Pandas 系列的日期时间转换为字符串
发布时间:2024/04/24 浏览次数:894 分类:Python
-
了解如何在 Python 中将 Pandas 系列日期时间转换为字符串