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 来获取图像的某些特定部分并将其添加到另一幅图像以获得最终图像。
相关文章
Mac 中 Python 没有名为 CV2 的模块
发布时间:2023/06/01 浏览次数:83 分类:Python
-
我们将通过示例介绍如何在Python中正确安装和导入OpenCV模块。在 Python 的 Mac 中没有名为 CV2 的模块 首先,我们必须了解什么是 OpenCV 以及为什么在 Python 中使用它。
用 Python 发送带附件的电子邮件
发布时间:2023/06/01 浏览次数:83 分类:Python
-
本篇文章将介绍如何使用Python发送带附件的邮件。 为此,我们不需要外部库来发送邮件。 相反,我们导入一个名为 smtplib 的模块并使用它,因为邮件是通过 SMTP 协议发送的。 让我们看看我们该
在 Python 中验证电子邮件地址
发布时间:2023/06/01 浏览次数:76 分类:Python
-
有一些内置功能(例如正则表达式)和库(例如 dnspython)可以帮助完成这些过程。 本文将解释如何使用这些功能和库在 Python 中验证电子邮件。在 Python 中使用正则表达式验证电子邮件
使用 Python 向多个地址发送电子邮件
发布时间:2023/06/01 浏览次数:124 分类:Python
-
在本文中,我们将演示如何使用 Python 编程语言向使用不同电子邮件地址的不同收件人发送电子邮件。 具体来说,我们将向许多不同的人发送电子邮件。使用 Python 向多个地址发送电子邮件
Python 中的 SendGrid
发布时间:2023/06/01 浏览次数:129 分类:Python
-
SendGrid 是一家 SMTP 服务提供商,提供 Web API 以允许客户处理集成信息。 通过该服务提供的 API 密钥,可以在很短的时间内轻松发送各种电子邮件。
Python 线程优先级
发布时间:2023/06/01 浏览次数:159 分类:Python
-
使用 Python 线程,我们可以同时运行程序的不同部分,使您的程序设计更容易。 如果您了解一些 Python,我们将向您展示如何使用线程来加速您的 Python 程序。Python 中的线程
Python 线程队列
发布时间:2023/06/01 浏览次数:65 分类:Python
-
本篇文章将介绍限制 Python 中的活动线程数。Python 中的线程 Python 中的线程允许多个执行线程在单个进程中同时运行。
在 Python 中实现最小堆
发布时间:2023/06/01 浏览次数:181 分类:Python
-
本篇文章将介绍最小堆及其在 Python 中的实现。Python 中的最小堆 每个父节点都小于或等于最小堆中的子节点。 它遵循升序,优先级总是与较小的节点。
Python Heapq 窥视
发布时间:2023/06/01 浏览次数:54 分类:Python
-
我们可以使用 heap[0] 表示法、heappop() 函数和 nsmallest() 函数来查看 Python 中堆的最小元素。