算法,可以删除异常值,但不会模糊图像的其他部分

时间:2015-06-17 14:40:06

标签: c++ algorithm opencv image-processing filtering

是否有任何算法可以删除异常值,但不会模糊图像的其他部分?

仅举例来说,当我们使用opencv中的cv::StereoBM/SBGMcv::gpu::StereoConstantSpaceBP时,我们可能会有异常值,如相关问题所示:opencv sgbm produces outliers on object edges此外,我们可以获得大量的强度爆发具有相似颜色的图像局部区域(强烈变化):enter image description here

还有很多其他案例......

最简单的解决方案是使用cv::medianBlur(),但它会平滑所有图像,而不仅仅是异常值:Median filter example video

是否有任何算法只能平滑异常值,而且它不会影响图像的其余部分?

还有什么比这更好的吗?

// get cv::Mat src_frame ...
int outliers_size = 10;
int outliers_intensive = 100;
int ksize = outliers_size*2 + 1; // smooth all outliers smaller than 11x11
cv::Mat smoothed;
cv::medianBlur( src_frame, smoothed, ksize  );
cv::Mat diff;
cv::absdiff( src_frame, smoothed, diff );
cv::Mat mask = diff > Scalar( outliers_intensive );

smoothed.copyTo( src_frame, mask );
// we have smoothed only small outliers areas in src_frame

1 个答案:

答案 0 :(得分:1)

也许您正在寻找双边滤镜?

OpenCV说:

  

我们已经解释了一些主要目标是平滑输入的过滤器   图片。但是,有时过滤器不仅会溶解噪音,   但也平滑了边缘。为了避免这种情况(在某种程度上,   至少),我们可以使用双边滤波器。

Here's what it looks like on a depth image

OpenCV有这个内置的:http://docs.opencv.org/modules/imgproc/doc/filtering.html?highlight=bilateralfilter#bilateralfilter