本次要整理记录的是关于图像边缘保留滤波算法(EPF)的相关内容,主要有高斯双边模糊、均值迁移模糊和快速边缘保留滤波算法。这些算法在OpenCV中都提供了完善的API可以调用,我只是对其基本原理做了些许了解,并在此基础上学习各个参数的调教,下面就逐一来进行整理。
- 高斯双边模糊
说到高斯双边模糊感觉有些高大上,但是说到高斯模糊就显得接地气多了,之前曾经整理过,高斯模糊就是利用一个不断移动的窗口来获取该区域中各个像素点的值,并根据高斯分布来为中心像素点邻域的各个像素点赋予权重,最后根据这个权重来加权求和,从而得出中心像素点的新的像素值。在高斯模糊的权重中,主要是以邻域像素点与中心像素点的空间距离来计算的,这样子的话呢,如果是同样在这一个领域里,出现了像素值差异很大的像素点,那这些像素点很有可能是属于边缘的,可是高斯模糊计算权重并没有把这些考虑进去,所以这些很可能属于边缘的像素点仍然被模糊掉了。所以为了解决这个问题,就出现了高斯双边模糊,不仅考虑领域中其他像素点在空间分布上对中心像素点的影响,同时考虑邻域中其他像素点的RGB三通道像素值的影响。也就是说普通的高斯模糊,只从(x,y)两个维度计算邻域像素点权重,只在空间上使用了一个滤波器;而高斯双边模糊呢,管的多一点,不仅仅是x、y两个维度,还考虑了RGB的影响,所以是从(x,y,R,G,B)五个维度来计算权重,既在空间上使用了一个滤波器,又在色彩空间上使用了一个滤波器,所以被称为双边滤波。
说白了,高斯双边模糊就是:不仅考虑空间分布权重,同时考虑像素值分布权重,将像素值差异过大的区域(即边缘)进行保留。
这一看起来五个维度,就知道代码实现一定非常困难,还好OpenCV已经封装好了针对这种算法的API,我们可以直接进行调用(否则要die)。下面看下代码:
Mat test_image;
test_image = imread("D:\\opencv_c++\\opencv_tutorial\\data\\images\\example.png");
Mat bila_image;
bilateralFilter(test_image, bila_image, 0, 100, 10, 4);
imshow("bila_image", bila_image);
imshow("test_image", test_image);
//合并显示
Mat mergeImage_bila = Mat::zeros(test_image.rows, test_image.cols * 2, test_image.type());
Rect left_rect(0, 0