如何在OpenCV中的图像上应用非二进制掩码?

时间:2018-04-17 13:29:55

标签: c++ opencv image-processing mask smoothing

我正在使用OpenCV,我的灰度图像是二进制掩码平滑操作的结果:

mask

我想将此蒙版应用于给定的RGB图像,但使用带掩码选项的copyTo方法会考虑蒙版的所有非零像素。但是,我感兴趣的是获得一个输出图像,其RGB像素值是由灰度掩模给出的因子按像素方式“缩放”的输入值。

我觉得这可以通过使用OpenCV的内置函数来实现,但到目前为止我找不到任何方法来做我想要的。

我知道如何以蛮力的方式从头开始,但我更愿意 - 如果可能的话 - 使用内置功能。<​​/ p>

提前谢谢!

1 个答案:

答案 0 :(得分:0)

正如@ api55指出的,我的问题的解决方案是:

  1. 通过函数cv::normalize
  2. 规范化蒙版
  3. 通过函数cv::multiply
  4. 将规范化遮罩与输入图像相乘

    特别是,规范化掩码的类型必须设置为CV_32F(否则它将不起作用)。因此,输入图像也必须被转换(例如,使用convertTo)。

    示例代码:

    cv::normalize(mask,mask,0.,1.,cv::NORM_MINMAX,CV_32F);
    image.convertTo(image,CV_32F);
    cv::multiply(image,mask,image);
    image.convertTo(image,CV_8U); // Convert back the input image to the original type