基本原理
图像受获取和存储、处理及各种干扰的影响,显示时画面上会出现噪声。为了减少噪声带来的负面影响,尽可能地还原干净真实的画面,就需要用到降噪滤波器对图像数据进行处理。
图像的噪声有多种类型。如加性噪声、乘性噪声、椒盐噪声、高斯噪声等。常见的降噪方法有在空间域进行的,也有将图像数据经过傅里叶等变换以后转到频域中进行的。其中频域里的滤波需要涉及复杂的域转换运算,相对而言硬件实现起来会耗费更多的资源和时间。在空间域进行的方法有均值或加权后均值滤波、中值或加权中值滤波、最小均方差值滤波和均值或中值的多次迭代等。
实践证明,这些方法虽有一定的降噪效果,但都有其局限性。比如加权均值在细节损失上非常明显;而中值仅对脉冲干扰有效,对高斯噪声却无能为力。
事实上,图像噪声总是和有效数据交织在一起,若处理不当,就会使边界轮廓、线条等变得模糊不清,反而降低了图像质量。此外,由于各类噪声往往不是单一存在而是同时并存,所以单纯采用一种滤波器,往往达不到满意的效果。
本文所述算法,就是针对这一问题,提出了一种新型的可同时滤除多种噪声的数字图像滤波器方法,其滤波效果优于单纯的某一种滤波器,同时计算量也不太复杂,硬件上较易实现。
算法描述
本文所采用的滤波算法包括以下主要步骤。
● 在某邻域窗口内选择多个邻域像素fi,(i=1,2,…,n);
● 噪声检测:累计中心像素与邻域内其他像素之间的差值中大于T1的个数N,T1是一个与图像的细节程度有关的阀值;当 0<N<T2时,表示中心像素为信号点,否则为噪声点。T2是与噪声污染程度相关的阈值;
● 计算与所选像素对应的像素数据的加权平均值,这里用“g1”表示;
● 计算所选像素对应的多窗口(包括十字形窗、X形窗和矩形窗等三种窗口类型)像素数据排序比较后的中间值,这里用“g2”表示;
● 按照式(1)计算出滤波的最后输出值,用来调整中心像素的像素数据。
(1)
上式中,g(x,y)表示滤波器的输出像素值;a和b分别是针对不同噪声类型选择的线性和非线性滤波比例系数,其取值与N的大小相关。
实验结果
为了比较本文方法和原有方法的降噪效果,我们以Lena图为例,对其同时添加了均值为0.003,差值为0.004的高斯噪声以及强度为0.01的脉冲噪声,然后分别用加权均值滤波、加权中值滤波和本文提出的方法对噪声图进行滤波处理,效果如图1所示。
图1(a)Lena原图
图1(b)同时加入高斯和椒盐噪声的Lena图
图1(c) 加权均值滤波后
图1(d)加权中值滤波后
图1(e)本文的方法滤波后
同时,可采用计算信噪比的方法对各种方法作出量化的比较。式(2)为信噪比的计算公式。
(2)
其中,M、N是图像的长度和宽度,g是滤波以后的数据,s是原图数据,f是附加了噪声的图像数据。计算得出的信噪比R若为负值,则说明噪声被抑制,且R的值越小,说明滤波效果越好。表1显示出了各种方法的信噪比结果。
可以看到,本文所述方法能集合均值滤波对高斯噪声有效和中值滤波对脉冲噪声有效的优点,同时又避免了在滤波的同时使细节模糊的情况发生。所以,实验证明本文所述方法是切实有效的。
硬件实现
图2是硬件系统框图。大量试验表明,人眼对亮度信号的敏感度超过对色度的敏感。专门针对亮度信号进行降噪滤波,符合人眼的观看模式。所以,RGB信号流首先经过YUV色空间转换进行亮色分离。RAM块完成n-1行的亮、色数据存储,它可实现一进n出的邻域窗口数据流,输出给后面的噪声判断和滤波处理模块,最后再还原成RGB输出给显示终端。
图2 硬件系统框图
关键器件选型时要综合考虑系统工作频率、模块总规模、调用IP库、芯片成本、可扩展性和可升级性、厂商支持等多个方面的因素。由于此平台仅用于芯片开发阶段中的模块验证阶段,所以不必选择性能最优而价格昂贵的系列。结合本设计的实际情况,选择了Xilinx的Spartan 3E系列XC3S500E (PQ208封装),该芯片内含20个RAM块,满足系统需14个RAM用于存储两行实时像素数据及对应控制信号的需求;10476个逻辑单元,4656个Slice,而本系统通过Synplify综合后的规模为3158个Slice,约占70%的内部资源,留有一定余量。图3是滤波主模块流程图。
图3 滤波主模块流程图
电路设计中的注意事项
根据视频电子标准协会(VESA)的规定,对于视频标清及高清信号的像素时钟,至少需要达到135MHz左右的频率。为了满足这一频率要求,需要运用到流水管线设计方法,综合考虑面积和速度两方面的因素进行设计。
设计的难点有二:一是如何搭建一个实时的像素矩阵数据流,一次同时输出n×n的矩阵数据;二是如何采用流水管线的方式在延时若干拍后实时地输出滤波处理后的像素数据。
对于第一个问题,可以调用Xilinx提供的RAM内核,运用Coregen工具在器件内部规划出一个n行或n-1行的存储空间,在第n行的第n个数据到达以后,就可以同时输出n×n个矩阵数据到后面的处理模块。输出一个矩阵后,新的数据又进入存储空间,使数据得到刷新。以3×3矩阵为例,其存储模块的功能仿真波形见图4所示,可以看到在延迟一行加一个像素时钟后,模块就开始按时钟输出y11到y33共九个邻域内数据。
图4 存储模块的功能仿真波形
第二个问题的解决可充分利用能够有效提高电路运行速度的流水线方法。首先将滤波处理过程分为若干步骤,每一步骤对应一些状态标志寄存器或中间寄存器,由此搭建一个有着若干节拍的流水结构,最后在总的延迟拍数后实现实时的(即按图像像素时钟频率来输出)滤波数据输出流。不论是3×3的还是7×7的矩阵邻域,或者更大些的邻域,从输入矩阵数据到输出此矩阵的中间值,都是只需最多8拍即可完成。从而有效提高电路工作频率,本系统经过静态时序分析后的结果为135MHz,满足高清信号处理所需的像素时钟频率。