一种自适应中值滤波器算法的FPGA实现作者:王敬美指导老师:杨春玲(哈尔滨工业大学电气工程及自动化学院,哈尔滨,150001)Email:wjingmei001@163.com摘要:在数字图像的生成和采集过程中,由于受工作环境、器件性能的影响,使得任何一幅未经处理的原始图像,都存在着一定程度的噪声干扰。这些干扰恶化了图像质量,给后续分析带来困难。因此,需要对数字图像进行滤除噪声处理。本文基于CycloneIIFPGA,在3×3图像采样窗口的基础上,将窗口尺寸扩展到5×5,并与3×3中值滤波器、5×5中值滤波器相结合,在FPGA中实现了一种自适应中值滤波器;并把滤波处理后像素点的灰度值作进一步的伪彩色增强变换。这样通过自适应中值滤波加伪彩色增强,在对图像去除噪声并尽可能减少图像细节损失的同时,增强了图像信息的表现力。经实际测试表明,本文的数字图像自适应中值滤波器具有速度快、滤波效果好、抗干扰能力较强等优点。关键词:数字图像处理;FPGA;中值滤波;自适应;OneAdaptiveMedianFilterAlgorithmUsingFPGAAuthor:WangjingmeiTutor:Yangchunling(SchoolofElectricalEngineeringandAutomationofHIT,Harbin,150001)Email:wjingmei001@163.comAbstract:Whenthedigitalimagesaremadeandcollected,workenvironmentandcharacterofdevice,givelotsofdisturbingtotheoriginalimages.Thedisturbingworsenstheimagequality,andgiveslotsofdifficultiestoanalysis.So,filteringthenoisesisnecessary.Inthispaper,basedonCycloneIIFPGA,using3×3imagewindowand5×5imagewindow,combine3×3medianfilterand5×5medianfilter,realizinganadaptivemedianfilter.Somefalsecolorenhancementtransformstepisused.Withtheusingofadaptivemedianfilterandfalsecolorenhancement,wecannotonlyfilterthenoisesandsavetheimage’sdetail,butalsocanenhancetheimage’sinformation.Accordingtoexperiment’sresults,theadaptivemedianfilterinthispaperhastheadvantagesofhighspeed,higherperformanceandhighanti-interferenceability.Keywords:imagetreatment;FPGA;medianfilter;adaptive0引言由于数字相机本身的问题以及周围环境对图像传输路径的干扰和影响,使得数字图像在生成和采集过程中会引入许多噪声干扰,这些干扰恶化了图像质量,使图像模糊,甚至淹没目标特征,给后续的分析处理带来困难。因此需要对图像进行滤除噪声处理。在图像处理中,中值滤波对干扰脉冲和点状噪声有良好的抑制作用,还能较好的保护图像的边缘信息。但是普通的3×3中值滤波器只是简单的将3×3图像采样窗口的9数个像素数据进行排序,用中值代替窗口中心像素原来的灰度。这必然会导致在去除噪声干扰的同时使图像变得模糊,损失细节。本文中的自适应中值滤波算法不再是简单的用图像窗口数据的中值替换原中心像素,而是加入了自适应比较算法,可以处理具有更大概率的冲激噪声;而且在平滑非冲激噪声时可以保存细节,这是传统的中值滤波器做不到的。另一方面随着数字技术日益广泛的应用,以FPGA为代表的ASIC器件得到了迅速普及和发展,器件集成度和速度都在高速增长。并且FPGA有着规整的内部逻辑块阵列和丰富的连线资源,特别适合细粒度和高并行度结构特点的数字信号处理[1]。对图像的滤波预处理,它的特点是处理数据量大。如果用一般的软件来实现势必会比较慢,实时性差。针对图像滤波运算结构比较简单、处理数据量大的特点,利用FPGA,并结合VHDL语言编程灵活的特点,可以方便地实现系统级的设计,大大提高数字图像滤波处理的效率。1算法原理1.1自适应中值滤波算法原理中值滤波是一种非线性的图像处理方法。它通过从图像中的某个采样窗口取出奇数个数据进行排序得到中值,用中值代替窗口中心像素原来的灰度,其数学表达式为:(,){(,)}gxymedianfmn=(1)中值滤波以窗口的中值作为处理结果,实现起来很简单[2]。本文的自适应中值滤波算法是以基本的中值滤波算法为基础,但不再是简单的用图像窗口数据的中值替换中心像素,而是需要经过进一步的自适应比较判断来决定中心像素的数据。算法描述如下:xyS为采样图像窗口,考虑如下符号[3]:minz——中灰度级的昀小值xySmaxz——中灰度级的昀小值xySmedz——中灰度级的中值xySxyz——在坐标(),xy上的灰度级maxS——允许的昀大尺寸xyS自适应中值滤波算法工作在两个层次,定义为A层和B层,如下所示:A层:A1=-medzminzA2=-medzmaxz如果A1>0且A2<0,则转到B层否则增大窗口尺寸如果窗口尺寸≤,则重复A层maxS否则输出medzB层:B1=-xyzminzB2=-xyzmaxz如果B1>0且B2<0,则输出xyz否则输出medz在本文中的自适应中值滤波算法,取为5×5。一般的中值滤波器都为3×3的图像采样窗口,本文在3×3窗口的基础上,将图像采样窗口尺寸扩展到5×5,maxS并与3×3中值滤波器、5×5中值滤波器相结合,实现了自适应中值滤波。下面将详细讲述基本的算法原理。首先是3×3中值滤波器进行中值、昀大值和昀小值的求取,将中值与昀大值和昀小值进行比较,如果中值位于两者之间,这说明中值不是脉冲像素(极值),接下来就转入下一步判断中心像素是不是位于昀大值和昀小值之间。如果是,那就说明也不是脉冲(极值),所以输出,而不用中值去替换中心像素;如果否,中心像素肯定是极值脉冲(等于或),因此用中值替换它。如果第一步中,中值与昀大值和昀小值进行比较,没有位于两者之间,那就说明肯定是极值脉冲(等于或),因此扩大图像窗口尺寸到5×5,重复上述步骤,如果仍不能找到一个非脉冲的中值,就输出3×3中值滤波器求出的。这种自适应中值滤波算法可以保留部分图像原有的像素,从而也就避免了不必要的细节损失;还可以在不满足滤波要求的时候扩大采样窗口,从而使滤波效果更好。medzmaxzminzxyzxyzxyzmedzxyzminzmaxzmedzminzmaxzmedzmedz为实现本算法,本文中的3×3中值滤波器和5×5中值滤波器不但要求出中值,还要求出每次图像窗口中的昀大值和昀小值。下面介绍这两种滤波器通过排序求取这三个值的简便方法[4]。以5×5中值滤波器为例。图1说明了采用本排序算法对5×5的图像窗口求取中值、昀大值和昀小值的步骤。图中的步骤(1)是把图1(a)5×5的图像窗口像素各列沿箭头方向作降幂排列;步骤(2)接着把经过列降幂排列的每行像素沿箭头方向作行降幂排列,得到图1(d)的结果。在图1(d)中对各点数据在25个像素点中所处的位次进行判断,可以得到如下的结论,其中:m11为25个像素数据中的昀小值,m55为25个像素数据中的昀大值;m12小于或等于其所在的原始列中的四个像素值和m13、m14、m15所在原始列的所有像素值(小于等于4+3×5=19个值),所以不可能为中值(中值排在第13位);m13小于或等于其所在的原始列中的四个像素值和m14、m15所在原始列的所有像素值(小于等于4+2×5=14个值),所以不可能为中值;m21小于或等于其所在的原始列中的三个像素值和m22、m23、m24、m25所在原始列的四个像素值(小于等于3+4×4=19个值),所以不可能为中值;m22小于或等于其所在的原始列中的三个像素值和m23、m24、m25所在原始列的四个像素值(小于等于3+3×4=15个值),所以不可能为中值;m31小于或等于其所在的原始列中的2个像素值和m32、m33、m34、m35所在原始列的三个像素值(小于等于2+4×3=14个值),所以不可能为中值;m54大于或等于其所在的原始列中的四个像素值和m51、m52、m53所在原始列的所有像素值(大于等于4+3×5=19个值),所以不可能为中值;m54大于或等于其所在的原始列中的四个像素值和m51、m52所在原始列的所有像素值(大于等于4+2×5=14个值),所以不可能为中值;m45大于或等于其所在的原始列中的三个像素值和m41、m42、m43、m44所在原始列的四个像素值(小于等于3+4×4=19个值),所以不可能为中值;m44大于或等于其所在的原始列中的三个像素值和m41、m42、m43所在原始列的四个像素值(小于等于3+3×4=15个值),所以不可能为中值;m35大于或等于其所在的原始列中的2个像素值和m34、m33、m32、m31所在原始列的三个像素值(小于等于2+4×3=14个值),所以不可能为中值;这样就排除掉12个值,不再参与下一级的比较。剩下的13个值通过步骤(4),沿图1(d)箭头所示对角线方向做降幂排列得到图1(e)的结果。在图1(e)中对各点数据在13个数据中所处的位次进行判断,可以得到如下的结论,其中:D52至少大于或等于其所在的原始列中的2个像素值或1个像素值(如果D52原来位于m25的位置)和D43、D34、D25所在原始列的所有像素值(大于或等于2+2×3+2=10或1+3×3=10个值),所以不可能为中值(中值排在第7位);D43至少大于或等于其所在的原始列中的2个像素值或1个像素值(如果D43原来位于m25的位置)和D34、D25所在原始列的所有像素值(大于等于2+1×3+2=7或1+2×3=7个值),所以不可能为中值;D34至少大于或等于其原始位置左侧和上方的四个值,以及D25所在原始位置左侧和上方的四个值(至少大于等于4+4+1=9个值),所以不可能为中值;D51至少大于或等于其原始位置上方的1个值(如果D51原来位于m51的位置)和D42、D33、D24、D15以及它们上方的所有像素值(至少大于等于1+7=8个值),所以不可能为中值;D42至少大于或等于其原始位置上方或左侧的1个值(如果D42原来位于m51或m15的位置)和D33、D24、D15以及它们左侧和上方的所有像素值(至少大于等于1+6=7个值),所以不可能为中值。同理,也可以判断出D14至少小于或等于10个值;D23小于或等于7个值;D32小于或等于9个值;D15小于或等于8个值;D24小于或等于7个值,所以这几个像素点都不可能为中值;这样就又排除掉10个值,不再参与下一级的比较。经过两步排除,剩余三个值D41、D33、D25,经过第(5)步,沿箭头方向的对角线作降幂排列,得到图1(f)的结果,中值N33就为25个像素的中值。3×3中值滤波器对3×3图像窗口求取中值、昀大值和昀小值的方法与5×5的类似,但要简单的多。图2说明了3×3中值滤波器对3×3图像窗口求取中值、昀大值和昀小值的步骤。oooooooooooooooooooooooooooooooooooooooooooooooooo11m12m13m14m15m21m22m23m24m31m32m34m35m42m43m44m45m51m52m53m54m55m41m25m33m•ooooooooooooooooooooooo⊗14D15D23D24D32D34D42