是否有任何算法可以删除异常值,但不会模糊图像的其他部分?
仅举例来说,当我们使用opencv中的cv::StereoBM/SBGM
或cv::gpu::StereoConstantSpaceBP
时,我们可能会有异常值,如相关问题所示:opencv sgbm produces outliers on object edges此外,我们可以获得大量的强度爆发具有相似颜色的图像局部区域(强烈变化):
还有很多其他案例......
最简单的解决方案是使用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
答案 0 :(得分:1)
也许您正在寻找双边滤镜?
OpenCV说:
我们已经解释了一些主要目标是平滑输入的过滤器 图片。但是,有时过滤器不仅会溶解噪音, 但也平滑了边缘。为了避免这种情况(在某种程度上, 至少),我们可以使用双边滤波器。
OpenCV有这个内置的:http://docs.opencv.org/modules/imgproc/doc/filtering.html?highlight=bilateralfilter#bilateralfilter