将遮罩应用于OpenCV中的图像?
c++
image
image-processing
opencv
5
0

我有一个二进制蒙版,我希望将其永久地应用于彩色图像,我该怎么做?最好是永久性的二进制掩码,因为我不想每次调用函数时都将掩码重新应用于图像。

基本代码示例将不胜感激。如果您使用代码,请解释代码而不是仅仅发布代码。

谢谢

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

好吧,这个问题出现在搜索结果的顶部,所以我相信我们需要这里的代码示例。这是Python代码:

import cv2

def apply_mask(frame, mask):
    """Apply binary mask to frame, return masked image.
    """
    return cv2.bitwise_and(frame, frame, mask=mask)

遮罩和框架的大小必须相同,因此在遮罩为1的情况下像素保持原样,而在遮罩像素为0下将像素设置为零。

对于C++则有所不同:

cv::Mat inFrame; // Original (non-empty) image
cv::Mat mask; // Original (non-empty) mask

// ...

cv::Mat outFrame;  // Result output
inFrame.copyTo(outFrame, mask);
收藏
评论

您不对图像应用二进制掩码。您(可选)在处理函数调用中使用二进制掩码,以告诉函数要处理图像的哪些像素。如果我完全误解了您的问题,则应添加更多详细信息进行澄清。

收藏
评论

@perrejba的答案正确无误,但它使用了传统的C样式函数。由于该问题被标记为C ++,因此您可能需要使用一种方法:

inputMat.copyTo(outputMat, maskMat);

所有对象的类型均为cv::Mat

请注意,屏蔽是二进制的。掩码中的任何非零值都将被解释为“执行复制”。即使蒙版是灰度图像。

另请注意,.copyTo()函数在复制之前不会清除输出。

如果要永久更改原始图像,则必须执行其他复制/克隆/分配。没有为复制的输入/输出图像定义copyTo()函数。因此,您不能使用与输入和输出相同的图像。

收藏
评论

您可以使用遮罩将原始图像的感兴趣区域仅复制到目标区域:

cvCopy(origImage,destImage,mask);

其中mask应该是8位单通道数组。

OpenCV文档中查看更多

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号