平滑滤波器总结

平滑滤波器总结

本质:对像素点领域的像素值施于某种算法,以其结果替代锚点处对应的像素值。
平滑(模糊)目的:减少噪声和伪影。
opencv一共提供了5种平滑操作。

1.均值滤波器

算法原理:以邻域像素点的平均值代替像素点的值。

void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor = Point(-1,-1),
                        int borderType = BORDER_DEFAULT );
参数:src:源图像。
dst:目标图像。
ksize:核尺寸大小。
anchor:锚点相对于核的位置。如果是负值则为核中心位置。
borderType:边界填充类型

可单独对X方向和Y方向进行模糊处理。例X方式:Size(10,1)。

2. 方框型滤波器

算法原理:简单模糊是方框型滤波器的特例。区别仅仅在于boxFilter可以控制输出图像的深度。

void boxFilter( InputArray src, OutputArray dst, int ddepth,
                             Size ksize, Point anchor = Point(-1,-1),
                             bool normalize = true,
                             int borderType = BORDER_DEFAULT );

3. 中值滤波器

算法原理:以邻域像素点的中值代替像素点的值。
中值滤波器对于消除少量较大或较小的孤立异常值非常有效,例如椒盐噪声,前提是核的Size要稍大孤立值(噪声)。

void medianBlur( InputArray src, OutputArray dst, int ksize );
参数:src:源图像。
dst:目标图像。
ksize:核尺寸大小,必须是正数而且必须是大于1,如:3、5、7等。

4 高斯滤波器

高斯滤波器顾名思义就是针对高斯噪声的(可以理解为随机噪声)。在讲高斯滤波器之前先温习几个相关的重要概念。

  • 正态分布

正态分布像一只倒扣的钟。两头低,中间高,左右对称。大部分数据集中在平均值附近,小部分在两端。

在这里插入图片描述
概率密度函数:
在这里插入图片描述
标准正态分布即:μ=0,且σ=1,即
f(x)=1/√2π e(x2/2)
一个重要事实
有68.2%数值位于平均值1个标准差的范围之内
有95.4%的数值位于2个标准差的范围以内
还有99.7%的数值位于3个标准差的范围以内
对于二维标准正态分布
在这里插入图片描述
概率密度函数:
在这里插入图片描述

  • 高斯核产生

对于图像处理来说,为了方便处理将u取1,p=1,两个方向标准差相等。则概率密度函数简化为:
g(x,y)=1/(2πσ^2 ) e(-(x2+y2)/(2σ2 ))
在之前我们提到过了均值滤波器, 就是说某像素的颜色, 由以邻域的像素平均值来决定. 在这个基础上又发展成了带权的平均滤波器, 这里的高斯平滑或者说滤波器就是这样一种带权的平均滤波器. 那么这些权重如何分布呢?
说到这里想必你已经知道,高斯滤波权重的分布就是符合高斯分布的,即这些权重的设定满足了越近权重越大的规律。
核计算方式:假设需要的高斯核尺寸为(2k+1)×(2k+1) 模板中各个元素值的计算公式如下:
在这里插入图片描述
h(x,y)=1/(2πσ^2 ) e(-(〖(x-k-1)〗2+〖(y-k-1)〗2)/(2σ2 ))
其中:(x,y)即为相对于核锚点的位置坐标。
最后进行归一化的过程,使用模板左上角的系数的倒数作为归一化的系数(左上角的系数值被归一化为1),模板中的每个系数都乘以该值(左上角系数的倒数),然后将得到的值取整,就得到了整数型的高斯滤波器模板。
故需要生成一个高斯核所需要的参数就是核尺寸大小(2k+1)和标准差σ。
不难发现,高斯滤波器模板的生成最重要的参数就是高斯分布的标准差σ。标准差代表着数据的离散程度,如果σ较小,那么生成的模板的中心系数较大,而周围的系数较小,这样对图像的平滑效果就不是很明显;反之,σ较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显。
反应到图形中:σ越大,则图形越宽,尖峰越小,图形较为平缓;σ越小,则图形越窄,越集中,中间部分也就越尖,图形变化比较剧烈。
OpenCv中的高斯滤波

void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );
参数:src:源图像。
dst:目标图像。
ksize:核尺寸大小。此参数决定模糊程度,Size(x, y)其中x, y取值越大表现模糊程度越深,而且X与Y的值为奇数。
sigmaX:X方向标准差。
sigmaY:Y方向标准差。
borderType:添加边界类型。

如果sigmaX和sigmaY,都为默认值(0),则二者值取:
σ_x=((n_x-1)/2)*0.3+0.8,n_x=ksize-1

5. 双边滤波器

高斯模糊的过程是减缓像素在空间上变化,因此与邻域的关系紧密而随机噪声在像素间的变化幅度又会非常的大(噪声不是空间相关的)。基于这种前提高斯平滑很好的减弱了噪声并且保留了小信号,不幸的是,这种方式破坏了边缘信息,把边缘也模糊了。
双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。
简单说来就是:高斯滤波的核只考虑了距离方面的权重,没有考虑实际灰度值方面的权重。
双边滤波器之所以能够做到在平滑去噪的同时还能够很好的保存边缘(Edge Preserve),是由于其滤波器的核由两个函数生成:
一个函数由像素欧式距离决定滤波器模板的系数
另一个函数由像素的灰度差值决定滤波器的系数

高斯系数计算方式就不做介绍。这里假设为
d(i,j,k,l)=e(-(〖(i-k)〗2+〖(j-l)〗2)/(2σ_d2 ))
像素的灰度差值决定滤波器的系数计算方式为:s
r(i,j,k,l)=e(-〖|f(i,j)-f(k.l)|〗2/(2σ_r^2 ))
其中,函数f(x,y)表示要处理的图像,f(x,y)表示图像在点(x,y)处的像素值;(k,l)为模板窗口的中心坐标;(i,j)为模板窗口的其他系数的坐标;σ^2标准差,取值看具体情况。
将上述两个模板相乘就得到了双边滤波器的模板:
d(i,j,k,l)* r(i,j,k,l)=e(-(〖(i-k)〗2+〖(j-l)〗2)/(2σ_d2 )-〖|f(i,j)-f(k.l)|〗2/(2σ_r2 ))

void bilateralFilter( InputArray src, OutputArray dst, int d,
                                   double sigmaColor, double sigmaSpace,
                                   int borderType = BORDER_DEFAULT );
参数:src:源图像。
dst:目标图像。
d:核尺寸大小。
sigmaColor:颜色滤波器标准差。
sigmaSpace:高斯空间滤波器标准差。
borderType:添加边界类型

  • 6
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值