【问题标题】:How to apply a non-binary mask on an image in OpenCV?如何在 OpenCV 中的图像上应用非二进制掩码?
【发布时间】:2018-09-27 12:02:05
【问题描述】:

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

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

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

我会知道如何以蛮力的方式从头开始,但如果可能的话,我更喜欢使用内置函数。

提前谢谢你!

【问题讨论】:

  • cv::addWeighted 怎么样?
  • 你会如何使用它? addWeighted 考虑单个标量值,而不是我需要的标量矩阵...
  • 将掩码矩阵归一化为0-1 (cv::normalize(maskImg, dstMask, 0., 1., cv::NORM_MINMAX, CV_32F) 然后与图像相乘
  • @api55 我什至不会费心规范化,一个简单的convertTo CV_32F 规模为 1./255 就可以了。
  • @DanMašek true,这样会更好,如果没有最大值(0 或 255),规范化可能会更改掩码值#

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


【解决方案1】:

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

  1. 通过函数cv::normalize对掩码进行归一化
  2. 通过函数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

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 2022-01-09
    • 2015-10-11
    • 2018-07-21
    • 2015-04-15
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多