空间域图像增强:OpenCV边缘保留滤波算法
0.综述
之前的几种常用图像卷积处理之后图像的边缘信息会丢失,所谓图像的边缘信息,不是指的图像四个边的那一部分的信息,而是图像在像素层面上,像素值跃迁,差异值比较大的地方。而边缘保留滤波算法(EPF Edge Preserving Filter
)则可以解决这个问题,滤波之后的输出可以完整的保存图像整体边缘的信息。常见的边缘保留滤波算法有:
- 高斯双边滤波
Mean-shift
均值迁移滤波- 局部均方差滤波
1.高斯双边滤波
在上一篇 [空间域图像增强:OpenCV中常用的图像卷积(滤波)操作] 中说过,高斯滤波考虑了图像空间位置对权重的影响,离中心点越近权重越大,但是高斯滤波没有考虑图像中的像素分布对图像卷积输出的影响。而高斯双边滤波则充分考虑了这一点,对像素值空间分布差异较大的进行保留从而可以完整地保留图像的边缘信息。
图像一定区域内的像素分布是有一定规律的,要保留边缘信息,就应当只让像素值相近的参与计算,对于差异较大的则不参与卷积计算。所谓双边滤波,就是指同时考虑了空间位置和像素值分布这两点。
C++
接口的函数原型:
void bilateralFilter( InputArray src,
OutputArray dst,
int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );
其中d
表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace
计算该值,一般情况下取0。sigmaColor
越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域,即色差多大范围之内才参与计算,一般取一个大一点的值。 sigmaSpace
:该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d
>0时,d
指定了邻域大小且与sigmaSpace
无关,否则d
正比于sigmaSpace
。
举个栗子:
bilateralFilter(input_image, result, 0,100, 10, 4);
结果:
2.Mean-shift均值迁移滤波
Mean-shift
均值迁移滤波是图像边缘保留滤波算法中的一种,经常用来对图像进行分水岭分割之前进行去噪。同时在目标跟踪、图像对比、视频分析等图像处理任务中均有应用,因此均值迁移滤波是一个应用非常广泛的滤波算法。
均值迁移滤波算法充分考虑了像素值空间范围分布,只有符合分布的像素点才会参与计算,计算得到像素均值(RGB
三个值)与空间位置(像素点坐标X,Y
)均值,使用新的均值位置作为窗口中心位置继续基于给定的像素值空间分布来计算均值与均值位置,如此不断迁移中心位置直到位置不再变化(
d
x
=
d
y
=
0
dx=dy=0
dx=dy=0),但是实际情况下像素分布一般不会特别理想,所以会人为的设定迁移停止条件(比如迁移的次数),这也就可以把最后的RGB
均值赋给中心位置像素点。
C++
接口的函数原型:
void pyrMeanShiftFiltering( InputArray src, OutputArray dst,
double sp, double sr,
int maxLevel = 1,
TermCriteria termcrit
=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1) );
其中sp
就是窗口大小,sr
是色彩空间半径大小,TermCriteria
指定迁移停止条件,默认迁移五次且连续两次
d
x
+
d
y
dx+dy
dx+dy不大于1。
举个栗子:
pyrMeanShiftFiltering(input_image, result, 15, 50, 1,
TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 5, 1)
);
结果: