边缘保留滤波算法
高斯双边滤波
高斯滤波考虑了图像空间位置对权重的影响,离中心点越近权重越大。但是高斯滤波没有考虑图像中的像素分布对图像卷积输出的影响。而高斯双边滤波则充分考虑了这一点,对像素值空间分布差异较大的进行保留从而可以完整地保留图像的边缘信息。
图像一定区域内的像素分布是有一定规律的,要保留边缘信息,就应当只让像素值相近的参与计算,对于差异较大的则不参与卷积计算。所谓双边滤波,就是指同时考虑了空间位置和像素值分布这两点。
opencv API:
void bilateralFilter( InputArray src,
OutputArray dst,
int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );
. InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
. OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。
. int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。一般为0。
. double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。 尽量取大。
. double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace. 尽量取小。
. int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.
Mat image = imread("E:\\picture\\dot.png");
imshow("原始图", image);
Mat dstimg;
bilateralFilter(image, dstimg, 0, 100, 10);
imshow("bilateral", dstimg);
imwrite("E:\\picture\\dotout.png", dstimg);
waitKey(0);
Mean-shift均值迁移滤波
Mean-shift均值迁移滤波是图像边缘保留滤波算法中的一种,经常用来对图像进行分水岭分割之前进行去噪。同时在目标跟踪,图像对比,视频分析等图像处理任务中均有应用,因此均值迁移滤波是一个应用非常广泛的滤波算法。
均值迁移滤波算法充分考虑了像素值空间范围分布,只有符合分布的像素点才会参与计算,计算得到像素均值(RGB三个值)与空间位置(像素点坐标X,Y)均值,使用新的均值位置作为窗口中心位置继续基于给定的像素值空间分布来计算均值与均值位置,如此不断迁移中心位置直到位置不再变化(dx=dy=0dx=dy=0),但是实际情况下像素分布一般不会特别理想,所以会人为的设定迁移停止条件(比如迁移的次数),这也就可以把最后的RGB均值赋给中心位置像素点。
在某些情况下均值迁移滤波会比高斯双边滤波效果更加明显。
opencv API:
void pyrMeanShiftFiltering( InputArray src, OutputArray dst,
double sp, double sr,
int maxLevel = 1,
TermCriteria termcrit
=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1) );
. InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
. OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。
. sp: 窗口大小。
. sr : 色彩空间半径大小。
. TermCriteria: 指定迁移停止条件,默认迁移五次且连续两次dx+dy dx+dy不大于1。
Mat image = imread("E:\\picture\\dot.png");
imshow("原始图", image);
//Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat dstimg;
pyrMeanShiftFiltering(image, dstimg, 15, 50, 1);
imshow("bilateral", dstimg);
imwrite("E:\\picture\\dotout.png", dstimg);
waitKey(0);