一种易于FPGA实现的椒盐噪声滤除算法
2021-11-19邹瑜
邹瑜
(广州科易光电技术有限公司,广东广州,510000)
0 引言
椒盐噪声又称脉冲噪声,是图像去噪处理中常见的一类噪声。所谓椒盐,椒就是黑,盐就是白,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或两者皆有)。椒盐噪声产生的原因复杂,主要是在成像过程中由于信号脉冲强度引起的,例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值,该噪声对图像的污染严重。另一方面附近有强电流设备,或者电机设备,对整个电源纹波造成影响,也会带来闪烁的椒盐噪声。针对椒盐噪声的去噪问题,众多学者已提出和设计了诸多方法,如经典的中值去噪法,自适应中值去噪法,取得了较好的效果。但是结合工程实际应用又存在一些不足,比如有些方法需要对窗口内的所有像素点进行移动处理,计算量较大;噪声点和信号点都用窗口内的中值代替,对噪声点而言可以去噪,但对信号点却使得图像失真;窗口设置的大小对去噪效果也有重要影响,若去噪窗口设置较小能较好保留图像细节,但噪声密度增大时图像去噪能力下降,若去噪窗口设置较大,则对图像细节信息易造成损失,图像清晰度下降。针对中值去噪法的不足,自适应中值法引入了噪声检测的步骤,根据噪声密度自适应地选择窗口,但自适应去噪法在噪声检测时存在漏判或误判,且方形窗口形状单一,不利于保留图像细节。上述两种方法随着噪声密度的加大,其去噪能力均下降。因此,针对椒盐噪声去噪问题和已有方法中的不足,改进或设计新的适用于椒盐噪声的去噪方法,提高图像清晰度,增强图像质量。
部分学者也进行改进,提出了不少改进的自适应中值去噪算法。针对自适应中值,无法正常使用在FPGA中对图像进行滤波。考虑到实时性和FPGA资源占用率,这种方法在自适应选择滤波窗口时,需要更多的FPGA资源。考虑到效果更好则需要更多的滤波窗口,随之会占用更多的资源。本文结合工程应用,利用项目已存的算法,经过一些特殊的处理,分时复用处理,可以在FPGA上实时滤除椒盐噪声。
1 几种常用的椒盐噪声滤除方法
椒盐噪声滤除方法有很多种,常便于工程实现的主要是中值滤波方法,极点标定法和自适应中值滤波方法。本文主要是描述在工程上易于实现且能解决实际问题的椒盐去噪去除方法。
1.1 标准的中值滤波方法[1]
标准中值滤波方法,是以图像内一个点P( i, j )为中心,取n×n大小的滤波窗口。在每个窗口里面,对数据进行排序,选择位于中间数值的像素点作为,滤除后的像素值。具体步骤如下:
首先,选择n×n的窗口,在软件上实现,一般会选择3x3、5x5、7x7等大小的窗口。
最后,继续滑动窗口,重复上面的步骤,一直将所有的图像数据处理完。
1.2 极点标定法[1]
极点标定法主要是针对图像的极大值和极小值进行判断,该方法会将图像中的最大值或者最小值作为噪点。在0-255的灰度图像中,该方法将像素值为0或者255的值认定为噪点,其它在0-255之间的数据,则认定为非噪声点。
其中X( i, j )表示像素(i,j)的数值,FindNoise(i, j)表示像素(i,j)为噪声像素,需要进行处理;
FindNoise(i, j)=1则表示像素(i,j)为非噪声像素,直接输出其原始值即可,不需要进行去噪处理。当FindNoise(i, j)=0,则需要采取3x3或者5x5的区域进行均值替换。这种标法简单方便,占用资源极小。非常适合FPGA定点运算。但是该方法有明显的缺点就在于有些椒盐噪声并不是极大值或者极小值,或者有些极大值或者极小值就是真实的数据,这些都会导致误判。会影响用户的视觉体验效果。
1.3 自适应中值滤波方法[1][2][3][4][5]
在噪声概率密度不高时,使用经典中值滤波的效果不错。但是当噪声出现的概率比较高时,采取常规的中值滤波算法的效果较差。采取更大的滤波器窗口尺寸,可以提高滤波效果。自适应中值滤波法,结合了中值滤波和定点检测的方法。在噪声点的判断检测进行适当的改进。使用自适应中值滤波器的目的就是,根据预设好的条件,动态地改变中值滤波器的窗口尺寸,以同时兼顾去噪声作用和保护细节的效果。
该方法分为两部分,第一步,判断该区域是否是噪声点,第二步,处理噪声点。不失一般性,假设滤波窗口大小为Wsize,允许的最大窗口为Wmax。Sij表示滤波窗口所覆盖的区域。中心值位置为(i,j)。Vmin表示窗口所覆盖区域Sij的最小值,Vmax表示窗口所覆盖区域Sij的最大值,Vmed表示窗口所覆盖区域Sij的中值。Vij标识,像素点(i,j)的灰度值。
2 算法基本思想
传统的易于在FPGA实现的椒盐去噪算法,往往选择简单的中值滤波算法,在不考虑资源的情况下,会选择自适应中值滤波的方法。自适应中值滤波需要自适应地确定窗口大小和中值替换。在FPAG中实现,会选择一个最大的窗口,根据需要进行裁剪,比如根据实际应用需求,定义一个13x13的窗口。针对320x240的红外图片。这里至少需要12个240*16bit大小的RAM或者shift_ram(移位寄存器)。同时其方法需要噪声监测,容易将高频信号误判为噪声点。会在一些特殊的应用场景失效。
针对传统FPGA实现的自适应中值去椒盐噪声的算法,本文采取中值滤波和导向滤波相结合的方法,实现保边去噪,同时去掉椒盐噪声的方法。导向滤波本身已存在于FPGA中。从应用上来看只需要占用少量的中值滤波和控制指令资源,即能够实现去噪。
3 算法仿真和应用
工程上,对高压杆塔进行拍摄时,因为设备之间的干扰,会对图像质量产生较大的影响。图1所示,是笔者在工程实际应用时拍摄的照片,从图片看,有非常明显的亮点和暗点。
图1 拍摄亮点和暗点图
如果采取阈值的方法进行噪声剔除,得到的图像如图2所示。有许多比较细小的像素点。没有满足0或者255的点,并没有被剔除掉,视觉上能明显感觉到噪声。
图2 采取阈值去噪方法得到的图像
在实际应用中经常碰到的噪声是椒盐噪声和高斯噪声。因此笔者针对椒盐噪声时,也考虑了中值滤波加高斯滤波的方法。中值加高斯滤波,可以滤除掉椒盐噪声,但是图像上会有所模糊。从图3所看,椒盐噪声基本上已被滤除掉,并且一些其它噪声也滤除的比较干净,但视觉上看稍显模糊,感觉欠佳。
图3 椒盐噪声基本上滤除
在这里,我们使用中值加导向滤波的方法。导向滤波的基图选择带椒盐噪声的原图,参考图为中值滤波的图片。经过运算得到的结果如图4所示。椒盐噪声被滤除的非常干净,图像自带的一些其它噪声也被处理的很好,细节得到保留。
图4 运算结果图
另一方面,笔者将算法应用使用到视频流中,对椒盐噪声滤除的非常干净,并保留足够多的细节。如图5所示。
图5 视频截取图
4 结论
本文提出一种保边去噪,可以去掉椒盐噪声的一种方法。且是利用现在常有的经典算法,只需要修改一些细微的参数,即可达到很好的滤波效果。该方法已应用在工程上,取得了良好的视觉效果。