平滑滤波器的演化

去噪,在图像分析中,很常见。值得注意的是,去噪不一定是使用平滑,但平滑在去噪的路上频频被采用。前段时间随意浏览,看了些新算法,从原理上作点总结,解构别人的设计思路,也是一件乐事。

远亲不如近邻,在图像滤波器中,体现得淋漓尽致。邻域操作在图像处理中比比皆是。从微积分的角度上看,对任意给定区域,定制一个划分规则,在足够小的子域内,完全可以认定为相同或相似。图像处理中的很多模板操作其实都是基于此点展开。
对图像而言,最小划分就是每个象素。而在 X=X 的恒等式内,无法进行其他运算,很自然的,会扩大他,比如取3X3或其他,于是就有了很多模板。然而问题是,在划分的子域(一个模板大小)内,并非完全满足相同或相似这个原则。所以,有了缺陷,于是有了改进空间,结果幻化了很多有意思的算法。

平滑操作,本质来说无法去噪;但他本身绕开去噪问题,更注重于模糊噪声,进而达到降噪目的。有点考不到第一,先及格再说的味道。当然,代价也很明显,就是会把有效细节也一起消弱。这就是平滑了。

均值滤波(mean)
很显然,就是在给定子域内取平均的操作。
在追求平等的年代,很理想主义。现实告诉我们,平等很多时候只是口号!在图像的均值中就是这样,模板越大,满足子域相似的条件就越脆弱,于是就越模糊,如果化妆中,去痘要与淡化五官轮廓为代价(很有鬼片的感觉),很显然,很多人不接受。所以,在一些特殊的场合,特别是工业上,他比较流行,在其他图像的修复上,他往往只能是辅助的一个操作。很难独立来实现一些功能。

高斯滤波(gauss)
平等已然只能理想,现实显然还要继续的情况下。参考子域的空间理论,很自然地会想重要性问题,自己亲人到邻居,分开对待,人不为己,天诛地灭的自我中心思想开始在这里展现。主次的概念,也叫权重引入,而各方向等同的Gauss函数备受关注并盛行起来,成了一个重要的滤波器。其最大的贡献性在于提供一种权值的简单计算方法。在图像的子域里,Gauss通过空间距离给出权值,自身的权值最大,以此加权滤波。好处是比均值更保留的五官信息,虽然也有一定程度的模糊。但同时也看到在降噪上其实力度比均值差一些。在Gauss操作中,设想当中心点恰巧是噪声的时候,Gauss还是尽力地维持其为噪声的权利。

双边高斯(bilateral filter)
这个东西可能比较少见了,我也是前些月子才看到。
Gauss函数中通过Sigma值和半径大小控制着平滑力度。双边高斯很显然引入2次Gauss概念。更代码点讲就是给了2个Sigma值,一个叫spatial sigma,一个叫intersity sigma加上一个半径来控制。第一个Sigma跟原来的Gauss一致,后一个就是一个亮度的变化信息的参考。
回到子域的模型上,抛开噪声问题,当一个子域里面相近时,其实采用什么的平滑都无所谓。当子域出现不相近时,设想一张有黑白对半的图,当子域包含一半白一半黑的时候,均值会把这点变成灰,Gauss没均值力度大单也作了改变。双边高斯这时引进intersity,意思就是把要参与运算的点跟当前点(模板中心点,前面叫的自身)作差,由这个差值产生另一套权值,原则是,差越大,计算的权值越小。把这个权值与原始Gauss定义的空间权值作乘来作为平滑的权值计算。这样就解决了模糊问题。
双边Gauss适合降低弱噪声(就是噪声跟非噪声点相差不大的噪声)。通过双重权值的引入,可以在平滑和保留上实现合适的双赢。再解释一下其适用性,皮肤上有个刚起不久的粉刺,此时粉刺上的肤色跟皮肤比较相近,在双边高斯作用下可以比较好的修复,当粉刺张得成熟,跟皮肤相差得大时,此时等同于毛发跟皮肤的差别,该滤波无法消除它,但也基本保留,不加伤害。这就是双边高斯带来的思想。
通过调整其中参数,可以控制平滑力度。Intersity Sigma可以理解为细节保留的一个参数。

非局部均值(non local means)
这个在我看双边高斯的时候看过,当时一个数据说它很慢让我没兴趣了解。前些日子才对其作了原理性解析。因为GPU的兴起让它成为实用。
这个滤波基本可以理解为去噪声设计的平滑滤波器。特别针对那种椒盐/粉刺类的噪声。
去噪滤波器的设计必须满足最基本的2条件,一是好的地方(毛发细节,轮廓信息等)不能变模糊,二是噪点要消除。
于是,我们很希望有判断是不是噪声点的判据出现。很希望在细节上有双边高斯的优点,在噪声点上有均值或高斯滤波的力度。但怎么去判定是噪点还是细节,站在计算机的角度,很难(这也是我老喜欢叫人工愚蠢原因)。
在人口日益膨胀的时代,一家人会分家,分家之后很难保证住所相邻。这个滤波器很现实的考虑了这个问题,对子域作了相应修正,所以取名(non-local)。
它给出了点的有效性判断,原则模仿双边高斯,相似的点有效。不同在于它改进了判定范围,它定义了一个自家区域A,就是以自身为中心的一个设定半径(Block Radius)的子域,相似性等同于跟区域A里的所有象素的相似性之和。注意,双边高斯里这个也是这个思想,只是其自家子域是1X1;这里修正为可以任意大小的方块(当然也可以是其他图形,只是方块好编程)。什么好处呢,当模板处在噪声点上,而周围都是好的点时,在双边高斯里,因为周围点跟中心点相差都大,平滑力度很弱,该点基本保留下来。而通过子域计算,假设是3X3,此时相似性就变为9个像素的差值比较,这样平滑力度可以很大,而完全把噪点消除。
其他思路跟其他滤波一样,定义一个(Windows Radius)在这个窗口(假设是NXN,N=2*Windows Radius+1)里移动A子域大小,计算权值,然后利用这些来计算结果。此时权值大的点不一定就靠近自身,只要满足子域A匹配度,其权值都大。
可以看到,单就计算而言,他有NXN个子域比较,随着参数的变大,会变得很慢。而当噪点比较大,比如粉刺,我们只有提高子域A的尺寸,才能得到有效匹配值。该算法是可行去噪算法。原理上,对任意一点可以在全图寻找所有相似点来平滑,只是这样时间不允许。

 

过程的复杂需要时间来平抚,没有硬件系统的支持很多复杂算法不会出现。而多样的操作,其实就是对不足的修修补补,无他,仅此而已。
好了,就这样,累了,收手!

阅读更多
想对作者说点什么? 我来说一句

平滑滤波Matlab实现

2013年06月03日 13KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭