【问题标题】:OpenCV - Apply color mask to color imageOpenCV - 将颜色蒙版应用于彩色图像
【发布时间】:2023-03-04 22:51:02
【问题描述】:

我正在尝试将颜色蒙版应用于彩色图像。颜色蒙版是我要应用于彩色图像的轮廓。除了粉红色的轮廓(BGR = [180, 105,255])外,面具都是黑色的。奇怪的是,我可以使用以下方法应用青色[227,230,49] 的轮廓:

让彩色图像为imgColor,青色轮廓为maskCyan。同样,这个蒙版全是黑色的[0,0,0],除了属于轮廓一部分的像素[227,230,49]。然后我可以通过 imgColor_with_cyan_outline = cv2.bitwise_or(imgColor, maskCyan) 将其应用到图像上。当我对maskPink 使用imgColor_with_pink_outline = cv2.bitwise_or(imgColor, maskPink) 使用粉红色像素而不是青色像素执行相同操作时,我将返回原始图像,而没有应用任何蒙版或轮廓。我想我只是误解了cv2.bitwise_or() 的工作原理,但我不确定。

还有其他方法可以将颜色蒙版应用于彩色图像吗?

【问题讨论】:

  • 按位或 -> 获取每个位并与另一个图像中的相同位进行 OR。例如,如果您在一张图像中像素为 63,而在另一张图像中像素为 255,则结果为 255。如果您有 63 和 72,将给出 127(63 是 00111111,72 是二进制的 01001000)。您可以将掩码的反转作为二进制(白色和黑色)来“删除”像素,或将它们从图像中变为黑色。然后用青色添加它,你会在图像中得到青色,或者使用 numpy 替换为@DanMašek 链接

标签: python opencv


【解决方案1】:

我认为您误解了按位OR 操作的属性。 cv2.bitwise_or 需要两个源图像加上一个可选的蒙版。

cv2.bitwise_or(src1, src2, dst, mask)

所以如果src1 有一个值为1 的像素,src2 有一个值为2 的像素,那么src1 | src2 是:

0001 = src1
0010 = src2
0011 = src1 | src2

这使得合成像素值为 3。对于 8 位无符号字符图像,最大合成像素值为 255(135 | 235 为 255)。

【讨论】:

  • 这更有意义。我认为这意味着如果它不是 0,它将采用第二个值。所以如果你有 cv2.bitwise_or([255,255,255],[0,0,0]) = [255,255,255]cv2.bitwise_or([255,255,255],[126,122,0]) = [126,122,0]。这就是我真正需要的一些函数,它将用第二个参数中的非零像素替换第一张图像中的任何像素。
  • @greenthumbtack 你想要的是根据掩码将一个图像复制到另一个图像。为此,请参阅这篇出色的帖子:stackoverflow.com/questions/41572887/…
【解决方案2】:

如果您有过滤的障碍,您可以使用cv2.inrange 函数进行屏蔽。将以下代码修改为您的值。根据你的 opencv 版本检查语法

Pink=cv2.inrange(pink baundary)
Black=cv2.inrange(black baundary)
Mask= Pink+Black

更多信息可以阅读

https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html

【讨论】:

  • 我将如何使用它?面具上只有两种颜色,黑色和粉红色。我认为inrange 是在图像中寻找颜色,而不是应用蒙版。
猜你喜欢
  • 2012-05-15
  • 1970-01-01
  • 2015-07-09
  • 2017-11-16
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多