c++ - 在 OpenCV 中去除噪声以创建掩码

标签 c++ opencv image-processing noise-reduction

我需要创建一个 mask 以根据两张相关图像检索对象(前景对象)。

图 1:

[![在此处输入图片描述]

图 2:

[![在此处输入图片描述]

图像包含前景对象和带纹理的背景。 这两张图片除了 image2 中的前景对象可能发生了一点变化(它可能已经旋转、平移或/和缩放)外,大部分是相同的。

使用 OpenCV,我做了以下事情:

  • 执行图像对齐(使用 findTransformECC 和参数 cv::MOTION_AFFINE)以获得前景的转换;
  • 根据变换对图像 1 进行变换(使用 cv::warpAffine 和参数 cv::INTER_LINEAR + cv::WARP_INVERSE_MAP)上面的矩阵;
  • 在 image2 和已经转换的 image1 之间做绝对差异(cv::absdiff & cv::threshold with param cv::THRESH_BINARY_INV) .

我认为我已经接近我的目标,但由于背景区域残留的噪音,我仍然无法获得干净的前景物体蒙版。

enter image description here

消除 image_absdiff_invert.png(上图)上的所有噪声以创建前景对象的干净蒙版的解决方案是什么?

最佳答案

刚刚试过了

使用形态学操作通常有点棘手(反复试验)并给了我这个结果:

enter image description here

虽然使用中值滤波器可能是一个很好的预处理(或者甚至足以进行轮廓提取)并给出这个结果(这只是输入图像的中值模糊,还没有形态学操作):

enter image description here

这是测试代码:

int main(int argc, char* argv[])
{
    cv::Mat input = cv::imread("C:/StackOverflow/Input/maskNoise.png", CV_LOAD_IMAGE_GRAYSCALE);

    cv::Mat mask = input.clone();

    cv::dilate(mask, mask, cv::Mat());
    cv::dilate(mask, mask, cv::Mat());
    cv::erode(mask, mask, cv::Mat());
    cv::erode(mask, mask, cv::Mat());

    cv::erode(mask, mask, cv::Mat());
    cv::erode(mask, mask, cv::Mat());
    //cv::erode(mask, mask, cv::Mat());
    //cv::erode(mask, mask, cv::Mat());
    //cv::dilate(mask, mask, cv::Mat());
    //cv::dilate(mask, mask, cv::Mat());
    cv::dilate(mask, mask, cv::Mat());
    cv::dilate(mask, mask, cv::Mat());

    cv::Mat median;
    cv::medianBlur(input, median, 7);

    cv::Mat resizedIn;
    cv::Mat resizedMask;
    cv::Mat resizedMedian;
    cv::resize(mask, resizedMask, cv::Size(), 0.5, 0.5);
    cv::resize(median, resizedMedian, cv::Size(), 0.5, 0.5);
    cv::resize(input, resizedIn, cv::Size(), 0.5, 0.5);

    cv::imshow("input", resizedIn);
    cv::imshow("mask", resizedMask);
    cv::imshow("median", resizedMedian);

    cv::imwrite("C:/StackOverflow/Output/maskNoiseMorph.png", mask);
    cv::imwrite("C:/StackOverflow/Output/maskNoiseMedian.png", median);
    cv::waitKey(0);
    return 0;
}

关于c++ - 在 OpenCV 中去除噪声以创建掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36738315/

相关文章:

python - 循环保存生成的多个帧

python - Node js vs Django vs Flask用于从python流式传输多个视频

opencv - 这个使用OpenCV中GaussianBlur函数的subtract_gaussian_blur函数是做什么的?

c++ - 管道 ppm 图像到 eog 图像查看器不起作用

c++ - 如何找到字符串的所有排列?

C++ 抛硬币百分比

c++ - 看不懂逗号表达

c++ - 从 int 转换为 int32

iphone - 在iPhone ios 4上显示来自opencv的关键点

c# - 从位图中删除一种颜色的所有色调