使用OpenCV和Python将遮罩区域(黑色或白色像素)复制到BGR图像区域

4
在OpenCV Python中,假设我们使用cv2.imread读取图像并得到一个BGR的numpy数组。接下来,我们使用cv2.inRange命令生成一个掩膜(mask)。该掩膜具有相同的宽度/高度,并且每个掩膜像素要么是黑色要么是白色。
我想从掩膜中复制一个区域(作为黑白像素图像)到彩色图像的一个区域上。
如何实现?以下方式无法实现:
img[10:20,10:20] = mask[10:20,10:20]

我需要先将掩码转换为BGR图像吗?如果需要,应该如何操作?
编辑:我不想像将掩码应用于彩色图像中所示的那样将整个掩码应用于图像。换句话说,我希望将掩码视为黑白图像。我想要复制该图像的一个区域(作为一组黑色或白色像素)到另一个图像上。结果图像将是一个彩色图像,除了一个只包含黑色或白色像素的较小矩形区域。结果将类似于在Photoshop中将黑白图像的矩形区域复制并粘贴到彩色图像的区域中。
(我对OpenCV很新)

“从掩码中复制一个区域”是什么意思?您能用图像展示一下吗? - Håken Lid
1
可能是将掩码应用于彩色图像的重复问题。 - Håken Lid
ColorConversionCodes 列表中,我应该使用哪个代码?我找不到名为mask2bgr或类似名称的代码。 - cv2asker
我认为COLOR_GRAY2BGR应该可以工作,假设掩码是一个标准的单通道图像。 - Håken Lid
很高兴听到这个消息。如果您的问题已得到解答,可以将我的回答标记为已接受。 - Håken Lid
显示剩余7条评论
1个回答

0

如果您尝试直接使用单通道(灰度)掩码进行操作,那么数组切片的形状将不相同,操作将失败。

>>> img[10:20,10:20] = mask[10:20,10:20]

ValueError: could not broadcast input array from shape (10,10) into shape (10,10,3)

你需要将遮罩转换为BGR,这样它就会变成3个通道,就像原始图像一样。
>>> bgr_mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
>>> img[10:20,10:20] = bgr_mask[10:20,10:20]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接