所谓的滤波即是平滑图像,模糊图像和图像特征提取的方法。滤波又可以分为线性滤波(linear filter)和非线性滤波(non-linear filter)。
线性滤波(linear filter),即通过线性算子来实现的滤波方法。输出图像f(x,y)= T[ filter(x,y) ],T是线性算子,即:输出图像上每个像素点的值都是由输入图像各像素点值加权求和的结果。
1. 方框滤波(Box Filter)
方框滤波是均值滤波的一般形式,在均值滤波中,将滤波器中所有的像素值求和后的平均值作为滤波后结果,方框滤波也是求滤波器内所有像素值的之和,但是方框滤波可以选择不进行归一化,就是将所有像素值的和作为滤波结果,而不是所有像素值的平均值。
用公式表达为:
可以看到,如果归一化后操作和均值滤波相同。如果没有归一化可能会产生结果溢出(矩阵数值超过255),所以会使得画面过白。
方框滤波的作用:常用来模糊图像。
2. 均值滤波(Mean Filter)
均值滤波顾名思义,就是对其周围一定区域(感受野)的像素进行相加平均的滤波方法。
公式表达:
公式表达在方框滤波中已经介绍过。
优点和缺点:
操作简单,原理易懂,可以得到物体的粗略描述。
无法很好的保留细节,在给图像去噪的同时忽略了原图像的细节。
同时,用在图像去噪的效果不佳,特别是椒盐噪声。
均值滤波的作用:常用于平滑,模糊图像,获取图像大致特征。
3. 高斯滤波(Gauss Filter)
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值用。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。
高斯滤波又分为低通滤波和高通滤波,低通滤波也被称为高斯模糊,高通滤波即为高斯锐化。
公式表达:
1维高斯公式:
2维高斯公式:
他们的图像分别如下:
高斯滤波常用于先验方法的滤波中,即假设图像的二维信号符合高斯函数的特征,即函数值随着某种距离(自变量)而产生线性变化。一般的,某个像素B距离我们需要滤波的像素B越远,则我们认为B对A的滤波的结果影响越小,这一点在高斯函数上也可以体现。
步骤:
确定我们需要滤波的像素A。
围绕它一周,生成N*N的感受野
对感受野中的像素(B1, B2, ... Bn)根据某一条件(例如和A的欧式距离等)求出数值X=(x1,x2,... xn)。
将X带入高斯函数,求出函数值Y=(y1, y2, ... y3)。
Y即为(B1, B2, ... Bn)对被滤波像素A的贡献(权重)。
计算机用于计算的高斯函数:
这里高斯函数不需要取指数函数前面的系数,应为我们会做归一化,同样也不需要关注μ的值我们取1。这里主要是σ的取值,故,一般的高斯函数API会有σ的参数要求用户规定。一般使用的高斯函数如下图所示:
一般实现的伪代码:
for each i in input_img:
all_weights = all_weighted_values = 0.0
for each j around i:
weight_ij = Gauss(any_distance(i, j), sigma)
all_weighted_values += weight_ij * input_img[j]
all_weights += weight_ij
output_img[i] = all_weighted_values / all_weights
这里记录了所有的像素i周围像素j对i的贡献(权重)值即all_weighted_values,和所有的权值all_weights,用于之后的归一化,这也意味着对于选定的高斯函数,我们只需要关心其形状即可。
用途:高斯滤波用途广泛,多用于先验方法滤波,假定滤波窗口规定的曲面是高斯曲面。而且非线性滤波也有其身影。
非线性滤波:
区别于线性滤波:输出图像上每个像素点的值不是由输入图像各像素点值加权求和的结果。是根据某些信息生成替换得到的结果。
1.中值滤波(Median Filter)
是一种采用中值代替中心位置的滤波方法,求出一个滤波窗口中所有像素值(可以是亮度,可以说RGB分量等)的中位数。然后将位于窗口中心的数用该中位数替换。
中值滤波原理简单,是一种常见的滤波方法。
2.双边滤波(Bilateral Filter)
双边滤波是一种改进的滤波方法,上述的滤波方法都有这同样的问题,它们均是不识别物体的,即物体与物体的边缘也会被模糊。为了解决这样的问题,双边滤波就被提了出来。他的原理是使用辅助的图像来引导滤波的范围。
辅助图像可以是深度图,颜色图,灰度图等等,具体的问题选择具体的图像,它是高斯滤波的衍生,即依据深度,颜色,灰度等来确定高斯函数的值,然后用其值替代之。
同时,伴随有高斯滤波方式,即在确定权重时,多乘一次权重系数,上文中的代码:
weight_ij = Gauss(any_distance(i, j), sigma)
在双边滤波时可以改写为:
weight_ij = Gauss(any_distance(i, j), sigma) * Gauss(any_color(i, j), sigma_color)
3.联合双边滤波(Joint Bilateral Filter)
联合双边滤波是对双边滤波的拓展,它在考虑单一辅助图像的基础上,联合了多个辅助图像,常见的用途是在光线追踪渲染图像去噪时的G-Buffer数据,比如,深度图,法线图,漫反射图像等。这里注意,使用辅助图像时,却不可对其做抗锯齿处理。
通过以上介绍,我们可以容易的写出联合双边滤波的权重确定代码:
weight_ij = Gauss(any_distance(i, j), sigma) * Gauss(any_color(i, j), sigma_color) *Gauss(any_depth(i,j), sigma_depth)
可以看到,所用的辅助特征主要用来确定权重,有多少特征可以继续与其相乘。