如何在 OpenCV 中的图像上应用非二进制掩码?
How to apply a non-binary mask on an image in OpenCV?
我正在使用 OpenCV,我有一张灰度图像,它是对二进制掩码进行平滑操作的结果:
我想将此蒙版应用于给定的 RGB 图像,但使用带有蒙版选项的 copyTo
方法会考虑蒙版的所有非零像素。然而,我感兴趣的是获得一个输出图像,其 RGB 像素值是输入值 'scaled' 像素级由灰度掩码给出的因子。
我觉得这可以通过使用 OpenCV 的内置函数来实现,但到目前为止我找不到任何方法来做我想做的事情。
我知道如何以蛮力方式从头开始,但我更愿意——如果可能的话——使用内置函数。
提前致谢!
正如@api55 所指出的,我的问题的解决方案是:
- 通过函数
cv::normalize
归一化mask
- 通过函数
cv::multiply
将归一化掩码与输入图像相乘
特别是归一化掩码的类型必须设置为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
我正在使用 OpenCV,我有一张灰度图像,它是对二进制掩码进行平滑操作的结果:
我想将此蒙版应用于给定的 RGB 图像,但使用带有蒙版选项的 copyTo
方法会考虑蒙版的所有非零像素。然而,我感兴趣的是获得一个输出图像,其 RGB 像素值是输入值 'scaled' 像素级由灰度掩码给出的因子。
我觉得这可以通过使用 OpenCV 的内置函数来实现,但到目前为止我找不到任何方法来做我想做的事情。
我知道如何以蛮力方式从头开始,但我更愿意——如果可能的话——使用内置函数。
提前致谢!
正如@api55 所指出的,我的问题的解决方案是:
- 通过函数
cv::normalize
归一化mask
- 通过函数
cv::multiply
将归一化掩码与输入图像相乘
特别是归一化掩码的类型必须设置为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