将Mask应用于OpenCV中的图像?

fdh*_*fdh 19 c++ opencv image mask image-processing

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

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

谢谢

Cha*_*_99 61

虽然@perrejba的答案是正确的,但它使用了传统的C风格函数.由于问题标记为C++,您可能希望使用方法:

inputMat.copyTo(outputMat, maskMat);

所有对象都是类型cv::Mat.

请注意,屏蔽是二进制的.掩码中的任何非零值都被解释为"do copy".即使蒙版是灰度图像.

还要注意.copyTo()函数在复制之前不会清除输出.

如果要永久更改原始映像,则必须执行其他复制/克隆/分配.未为重叠输入/输出图像定义copyTo()函数.所以你不能使用相同的图像作为输入和输出.

  • 然而,我刚刚想到因为copyTo没有清除掩码非零的值,使用它作为`m.copyTo(m,mask)`绝对不会做任何事情.所以道歉,你是对的.您需要创建一个新矩阵. (3认同)

SSt*_*eve 10

您不对图像应用二进制掩码.您(可选)在处理函数调用中使用二进制掩码来告诉函数您要处理的图像像素.如果我完全误解了你的问题,你应该添加更多细节来澄清.

  • 一些简单的例子会有所帮助 (13认同)

rud*_*ryk 6

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

import cv2

def apply_mask(frame, mask):
    """Apply binary mask to frame, return in-place masked image."""
    return cv2.bitwise_and(frame, frame, mask=mask)
Run Code Online (Sandbox Code Playgroud)

掩码和帧的大小必须相同,因此像素在掩码所在的位置保持原样,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);
Run Code Online (Sandbox Code Playgroud)


vol*_*ato 5

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

cvCopy(origImage,destImage,mask);
Run Code Online (Sandbox Code Playgroud)

其中mask应该是一个8位的单个通道阵列.

有关OpenCV文档的更多信息,请参阅