OpenCV - 将蒙版应用于彩色图像

新手上路,请多包涵

如何在最新的 python 绑定 (cv2) 中将蒙版应用于彩色图像?在以前的 python 绑定中,最简单的方法是使用 cv.Copy 例如

cv.Copy(dst, src, mask)

但是这个功能在cv2绑定中是不可用的。有没有不使用样板代码的解决方法?

原文由 pzo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 745
2 个回答
import cv2 as cv

im_color = cv.imread("lena.png", cv.IMREAD_COLOR)
im_gray = cv.cvtColor(im_color, cv.COLOR_BGR2GRAY)

此时你有一个彩色和一个灰色图像。我们正在处理 8-bit , uint8 图片。这意味着图像的像素值可以在 [0, 255] 范围内,并且值必须是整数。

左色右灰

让我们做一个二进制阈值操作。它创建一个黑白蒙版图像。黑色区域有值 0 和白色区域 255

 _, mask = cv.threshold(im_gray, thresh=180, maxval=255, type=cv.THRESH_BINARY)
im_thresh_gray = cv.bitwise_and(im_gray, mask)

面具可以在下面的左边看到。右边的图像是应用 bitwise_and 灰度图像和蒙版之间的操作的结果。发生的事情是,蒙版的像素值为零(黑色)的空间位置在结果图像中变为像素值零。蒙版像素值为 255(白色)的位置,生成的图像保留其原始灰度值。

左掩码,右按位_and_with_mask

要将此蒙版应用于我们的原始彩色图像,我们需要将蒙版转换为 3 通道图像,因为原始彩色图像是 3 通道图像。

 mask3 = cv.cvtColor(mask, cv.COLOR_GRAY2BGR)  # 3 channel mask

然后,我们可以使用相同的 bitwise_and 函数将这个 3 通道蒙版应用于我们的彩色图像。

 im_thresh_color = cv.bitwise_and(im_color, mask3)

mask3 从代码中看左边的图像, im_thresh_color 在它的右边。

left-mask-3channel,right-bitwise_and_with_3channel-mask

您可以绘制结果并亲自查看。

 cv.imshow("original image", im_color)
cv.imshow("binary mask", mask)
cv.imshow("3 channel mask", mask3)
cv.imshow("im_thresh_gray", im_thresh_gray)
cv.imshow("im_thresh_color", im_thresh_color)
cv.waitKey(0)

原始图像是我在 这里 找到的 lenacolor.png

原文由 Sounak 发布,翻译遵循 CC BY-SA 4.0 许可协议

在这里,如果您已经有了蒙版图像,则可以使用 cv2.bitwise_and 函数。

检查以下代码:

 img = cv2.imread('lena.jpg')
mask = cv2.imread('mask.png',0)
res = cv2.bitwise_and(img,img,mask = mask)

lena 图像和矩形蒙版的输出如下所示。

在此处输入图像描述

原文由 Abid Rahman K 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题