opencv图像处理学习(二十七)——空间平滑与滤波

1.基本概念

空间平滑是指直接对源图像数据做空间变换以达到平滑的目的。它是一种邻域运算,即输出图像中任何像素的值是根据输入图像中对应像素周围一定邻域内像素的值重新计算得到的。图像平滑也称为模糊或滤波,是图像处理中常用的技术之一,进行平滑处理时需要用到滤波器核,根据滤波器核函数来实现不同滤波技术。图像中高频是图像中灰度变化剧烈点,低频是图像中灰度变化不大(平坦)的点,根据图像的高低频特性,可以设计相应的高低通滤波器来滤除相应的噪声。

2.滤波方法

(1)盒滤波

盒滤波器的实现借鉴了积分图像的原理思想,在快速积分图像求解中,将计算某个矩阵像素间的和值运算转换为求矩阵对应边角点的求和差值运算。盒滤波器的实现最关键的步骤就是初始化起始数组S,数组S的每个值是存在的像素邻域内的像素和值,在求解某矩形块中的像素和时,只需要索引对应区域的位置存放的和值就可以完成计算。

opencv提供boxFilter函数来实现图像盒滤波操作,参数ksize表示定义内核大小,参数anchor指定描点位置,参数normalize表示核因子归一化标志位borderTyp表示用于推断像素以外的边界模式。

(2)均值滤波

均值滤波是指用模板核算子覆盖区域内所有像素值的加权平均,它用一个点邻域内像素的平均灰度值来代替该点的灰度。模板区域内的元素有9个,均值滤波是指将当前中心像素点的值用\frac{1}{9}\sum_{k=1}^{9}a_{i}来更新替代。均值滤波算法比较简单,计算速度较快,但是均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。

Opencv提供blur函数来实现图像均值滤波,也称为归一化滤波器,参数Size(w,h)用于内核大小(w是像素宽度,h是像素高度),Point(-1,-1)用于指定描点位置(被平滑点),如果是负值,取核的中心为描点。应用Opencv库函数blur完成中值平滑的代码如下所示。

blur(srcImage,resBlurMat,cv::Size(5,5),cv::Point(-1,-1));

均值滤波的实现可以看到,其核心思想是盒滤波器,两种滤波器是典型的线性滤波器,均值滤波对周期性的干扰噪声有很好的抑制作用。

(3)中值滤波

中值滤波是指用模板核算子覆盖区域内所有像素值的排序,位置处在中间的像素值用来更新当前像素点值。中值滤波在边界的保存方面优于均值滤波,是经常使用的一种滤波器,但是在模板逐渐变大时,依然会存在一定的边界模糊,画面的清晰度基本保持,中值滤波对处理椒盐噪声非常有效。中值滤波能减弱或消除傅立叶空间的高频分量,同时也影响低频分量。

中值滤波去除噪声的效果依赖于两个要素:邻域的空间范围和中值计算中涉及的像素值。一般说来,小于滤波器面积一半的亮或暗的物体基本上会被滤除,而较大的物体几乎会原封不动地保存下来,因此中值滤波器的空间尺寸必须根据现有的问题来进行调整。中值滤波是非线性滤波,线性滤波易于实现,且易于从频率响应的角度分析,但如果噪声是颗粒噪声而非高斯噪声时,线性滤波不能去除噪声。如图像出现极值点,线性滤波只是将噪声转换为平缓但仍可见的散粒,最佳的解决方式是通过非线性滤波来滤波噪声。

Opencv提供了medianBlur函数来实现图像的中值滤波,其实现原理可通过基于常数时间优化算法得到。后续经过改进与发展,提出了速度更快的中值滤波实现算法。需要注意的是,核算子操作区域是正方形,medianBlur执行中值滤波操作的内核大小参数i需要设定为边长,要求必须设置为奇数。

(4)高斯滤波

高斯滤波是将输入数组的每一个像素点与高斯内核进行卷积运算,将卷积和当作输出像素值。高斯滤波后图像被平滑的程度取决于标准差。她的输出是邻域像素的加权平均,同时离中心越近的像素权重越高,因此,相对于均值滤波(blur),它的平滑效果更柔和,而且边缘保留得也更好。在图像处理中,高斯滤波一般有两种实现方式,一是离散化窗口滑窗卷积,另一种是利用傅立叶变换。最常见的就是第一种滑窗实现,只有当离散化的窗口非常大时,用滑窗计算量非常大(即使用可分离滤波器的实现)的情况下,可能会考虑基于傅立叶变化的实现方法。高斯函数是最有用的滤波器,具有下面这些性质:

<1>高斯函数是单值函数,高斯滤波用像素邻域加权均值来代替该点的像素值,像素权重会随着距离的变化而单调递减,以减少失真。

<2>高斯函数具有选择对称性,高斯滤波在各个方向上的平滑程度是相同的,对于存在的噪声很难估计其方向性,保证平滑性能不会偏向任何方向。

<3>高斯函数的傅立叶变换频谱是单瓣的,高斯滤波使得平滑图像不会被不需要的高频信号所影响,同时保留了大部分所需信号。

<4>高斯滤波平滑成都是由方差\sigma决定的,\sigma越大,频带越宽,平滑程度越好,对于图像中的噪声有可控参数可设置。

<5>高斯函数具有可分离性,二维高斯函数卷积可以分两步来进行,首先将图像与一维高斯函数进行卷积运算,然后将卷积结果与方向垂直的相同一维高斯函数卷积。

Opencv提供了GaussianBlur函数来实现图像高斯滤波,Size(w,h)用于定义核大小(需要考虑的邻域范围),w和h必须是正奇数,否则将使用\sigma _{x}\sigma _{y},参数来计算内核大小;\sigma _{x}表示x方向标准方差,如果是0,则\sigma _{x}使用内核大小计算得到;\sigma _{y}表示y方向标准方差,如果是0,则\sigma _{y}使用内核大小计算得到。

在Opencv库中完成高斯平滑:

GaussianBlur(srcImage, resGauMat,cv::size(3,3),0,0);

(5)双边滤波

双边滤波是一种非线性的滤波处理方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保留图像的同时弱消噪声的效果。双边滤波器也给每一个邻域像素值分配了一个加权系数。这些加权系数包含两个部分,第一部分加权方式与高斯滤波一样,第二部分的权重则取决于该邻域像素与当前像素的灰度差值。由于保存了过多的高频信息,双边滤波器不能够干净地滤掉彩色图像里的高频噪声,只能够对低频信息进行较好的滤波。对于脉冲噪声,双边滤波会把它当成边缘从而不能去除。

双边滤波实现的原理是在图像值域进行空域变换,空域变换对空间内邻域进行加权平均,加权系数会随着中心距离变化而调整。低通空域滤波器设计如下,对于输入源图像f(x),输出图像g(x)满足下式:

g(x)=k_{d}^{-1}(x)\int_{-\infty }^{\infty}\int_{-\infty }^{\infty}f(\zeta )c(\zeta ,c)d\zeta

其中c(\zeta ,x)表示邻域中心点x与邻近点的几何邻近度,k_{d}为归一化参数。结合空域与值域滤波,同时考虑几何位置与光度大小,组合后的滤波即为双边滤波器,如下式:

g(x)=k^{-1}(x)\int_{-\infty }^{\infty }\int_{-\infty }^{\infty }f(\zeta )s(f(\zeta ),f(x))d\zeta

对于二维图像,双边滤波输出像素的值依赖于邻域像素的值的加权组合,即满足下式:

g(i,j)=\frac{\sum_{\zeta ,\tau } w(i,j,\zeta ,\tau )f(\zeta ,\tau )}{w(i,j,\zeta ,\tau )}

其中加权权重因子w(i,j,\zeta ,\tau )取决于定义域核与值域核分布:

w_{d}(i,j,\zeta ,\tau )=e^{-\frac{(i-\zeta )^{2}+(j-\tau )}{2\sigma _{r}^{2}}}

w_{r}(i,j,\zeta ,\tau )=e^{-\frac{||(i-j)+(\zeta -\tau ||)}{2\sigma _{r}^{2}}}

应用Opencv库函数完成双边滤波操作:

bilateralFilter(srcImage,resBilMat radius,maxk,space_ofs,space_weight,color_weight);

(6)导向滤波

导向滤波不仅能实现双边滤波的边缘平滑,而且在检测到边缘附近有很好的表现,可应用在图像增强、HDR压缩、图像抠图及图像去雾等场景中。

其实现步骤如下:<1>利用boxfilter滤波器完成均值计算,其中均值包括导向滤波均值,原始均值,互相关均值及自相关均值;<2>根据均值计算相关系数参数,包括自相关与互相关方差;<3>计算窗口线性变换参数系数a、b;<4>根据公式计算参数a、b的均值。<5>利用参数得到导向滤波输出矩阵S

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值