课程设计报告书《数字信号处理及系统设计》中值滤波-FPGA设计设计人:袁兴班级:硕研10级3班学号:2010010339山东科技大学中值滤波器-FPGA 实现■ 前沿对于许多图像处理问题,传统的线性滤波方法存在着固有的缺陷。
为此,最近几十年来,发展起来了一类新的非线性滤波器结构—中值滤波器。
这类滤波器在图像信号处理中具有独特的优势,目前已成为非线性滤波领域的一个研究点。
针对传统中值滤波算法排序量多、速度慢的缺点,提出了一种基于FPGA 的中值滤波快速算法。
充分利用两个相邻滤波窗口中的相关排序信息,随着一列新像素的移入,同时更新已有的排序信息,从而完成中值滤波处理。
该算法将每个窗口查找中值的比较次数降到很低,达到了快速抑制噪声及保持图像细节的目的。
中值滤波器设计的原理中值滤波是一种非线性滤波方法,于1971年首次提出[1]。
它首先对邻域点的灰度值进行排序,然后选择中间值作为输出灰度值。
中值滤波的公式如下:g (x, y )=med (f (x -i ,y -j ))i ,j ∈S (1)其中,g (x, y)和f (x, y)为像素灰度值;S 为模板窗口。
中值滤波要实现的是用中值g (x, y)来代替中心点值f (x, y)。
对于椒盐噪声来说,由于模板的中值很大程度上不会是噪声,因此中值滤波能很好地消除它。
当中心点值为噪声时,其值和中值数值相差较大,应该用中值来代替中心点值。
但是,当中心点值不为噪声时,其值和中值数值相差不大,如果还用中值来代替中心点值,那么虽然对于单个像素点来说,不会产生较大的差异,但是如果对一整幅图像都进行这样的处理,这将在一定程度上使整幅图像变得模糊。
据此,可以对中值滤波算法做一些改进。
首先,排序窗口内的图像数据,找到中值。
然后将中值和中心点值做差,将差值与事先设定的阈值T 进行比较,如果两值之差的绝对值|g (x ,y -f (x, y)|大于等于阈值T ,则认为中心点图像数据是噪声,用中值代替原数据值;如果两值之差的绝对值|g (x ,y -f (x, y)|小于阈值T ,则认为中心点图像数据是有效数据,保持不变。
即'(,)(,)(,)(,)(,)(,)(,)g x y g x y f x y T g x y f x y g x y f x y T ⎧-≥⎪=⎨-⎪⎩ 2) 其中,g (x, y)如式(1)中定义。
阈值T 的选择应该针对不同的图像,根据经验或者实验进行选取。
如果阈值选择过大,将有可能滤除不掉噪声;如果阈值选择过小,将仍会使图像变得模糊。
由于噪声和周围像素相差较大,也和中值相差较大,因此阈值一般选择在几十左右。
这样,滤波处理之后的图像在除去噪声的同时会更加接近于原图像,能在更大程度上保留图像细节,使图像更清晰。
■中值滤波的快速算法我们都知道,冒泡排序算法,在中值滤波中,是最基本、最经典的传统通用算法。
很多经过改进后的优化版本的快速算法和经过推广衍生后的性能增强的中值滤波算法,都是基于这个冒泡排序算法的原理而产生的。
我们下面将会着重描述的中值滤波的快速算法,就是在这个冒泡算法上,经过修改优化得到的。
这个快速算法的理念就在于,我们没有必要对输入窗口中的所有灰度值都进行排序,也不需要得到它们的完整序列。
我们只需要找到那个排列在中间位置的值就可以了。
它包含了以下所罗列出来的三个步骤:第一步:对输入窗口中的每一列的灰度值,形成一个象素数组,并且对每一个象素数组进行单独的排序。
第二步:对输入窗口中的每一行的灰度值,也形成一个类似的象素数组,并且同样对每一个象素数组进行单独的排序。
第三步:经过排序之后,形成了新的输入窗口,这个窗口在行和列中都已经得到了排序,对现在排序之后的输入窗口中的对角线上的所有灰度值进行排序,并且选出这一个对角线上所有灰度值的中间值,然后这个中间值就是整个输入窗口的中值,也就是要作为最后输出的那个中值。
我们可以得到这样一个快速算法。
就是在特殊的3×3的象素大小的输入窗口的情况下,有九个数据需要被处理。
那么我们就顺便按照物理位置将这个九个象素点分成列的三组,然后分别进行排序,得到每一列数据的最大值、中间值和最小值。
然后对三个最大值、三个最小值和三个中间值进行排序,得到的结果,我们只取三个数,也就是三个最大值中的最小值,三个中间值中的中间值和三个最小值中的最大值。
这三个值对应上面的那个说法,就是经过两个步骤之后,行和列都已经排序完了之后的一个对角线上的三个值。
这三个值最后经过排序得到的中间值,就是整个输入窗口中九个象素点的灰度值中的中间值了。
中值滤波的快速算法的过程如下图1所示:图1 在输入窗口大小为3X3的情况下的中值滤波快速算法中值滤波算法核心是排序,排序算法的优劣直接决定了求取中间值的效率。
从而决定滤波器的整体性能。
基于硬件的排序算法设计可以充分的利用硬件平台的并行性特点,从而达到加快处理的速度目的。
下面分析3X3窗口图像数据的数学模型,说明中间值的求得过程。
设窗口的数据分别为:W11 W12 W13W21 W22 W23W31 W32 W33第一步:可以将9个数据按行数分成3组(L1、L2、L3),分别进行排序。
L1min=min(W1y) L1med =med(W1y) L1max=max(W1y)L2min=min(W2y) L2med =med(W2y) L2max=max(W2y)L3min=min(W3y) L3med =med(W3y) L3max=max(W3y)第二步:重新分组,将每组中的最大值,供3个值,选出组成大值组V1,类似的组成中值组V2和小值组V3,再次分别排序。
V1min=min(Lx max) V1med =med(Lx max) V1max=max(Lx max)V2min=min(Lx med) V2med =med(Lx med) V2max=max(Lx med)V3min=min(Lx min) V3med = med(Lx min) V3max =max(Lx min)经过分析可得到:V1max 是9个值中最大的,不可能是中间值;V1med 是由小到大排列的9个值中至少是处于第6的位置,不可能是中间值;V2min 是由小到大排列的9个值中最多是处于第4的位置,不可能是中间值;V2max 是由小到大排列的9个值中至少是处于第6的位置,不可能是中间值;V3min 是由小到大排列的9个值中处于最小的位置,不可能是中间值;V3med 是由小到大排列的9个值中至多是处于第4的位置,不可能是中间值;第三步:排除了以上六个值,还剩下大值组的V1min,中值组的V2med和小值组V3max的三个值可能是中间值。
将这三个值排序,可以证明这三个值的中间值med{V1min,V2med,V3max}就是这9个值中的中间值,用Smed 表示。
证明如下:这三个值由这9个数值组成的矩阵中的位置如下:V1min V1med V1maxV2min V2med V2maxV3min V3med V3max假设max(V1min,V2med,V3max)是这9个数值中的中间值Smed,那么Smed 是矩阵中包括主对角线在内的左下角6个值中最大的,在9点由小到大的排序中至少处于第六的位置,所以不可能是中间值;同理,假设min(V1min,V2med,V3max)是这9个数值中的中间值Smed,那么Smed在这9个值的由大到小的排序中至多是处于第四的位置,也不可能是中间值。
由于奇数点的中值一定存在,则唯一的可能就是事实,所以med{V1min,V2med,V3max}一定是这9个值的中间值Smed.图2 3X3窗口的中值滤波快速算法示意图整个算法可以分成以上三个步骤,而且每个步骤在硬件平台上完全可以并行执行,这样可以大大的提高排序的效率。
另外,算法不是对9点数据的完整排序,而是采用分组比较的办法找到中值。
简化了排序的过程,从而提高了效率。
■中值滤波的软件和硬件实现1、中值滤波的软件实现为证明该快速算法的正确性及可执行性,用C++对该算法进行建模仿真。
中值滤波的软件实现最重要的是排序。
排序主要是采用了冒泡排序法,从一帧图像中读取数据,进行滤波算法。
将排序后的数据写入到新的图形文件中,从而得到滤波后的图像。
冒泡排序较为简单,最重要的是如何将一帧图像中的数据进行整合后给冒泡算法。
从一幅图像中读取数据并进行数据排放的部分代码如下:unsigned char buffer[54+1024]; //定义原图像头缓冲区fread(buffer,1,54+1024,fp); //读取文件头54个字节unsigned long length=width*higth; //图像的总象素个数unsigned char readData[higth][width]; //用于存储原图数据的数组unsigned char writeData[higth][width]; //用于存储原图数据的数组fread(&readData[0][0], sizeof(unsigned char),length, fp);//从原图读入数据for(i=0;i<higth;i++)for(j=0;j<width;j++)writeData[i][j]=readData[i][j];unsigned char D[9]; //定义选取框for(i=1;i<higth-1;i++)for(j=1;j<width-1;j++){D[0]=readData[i-1][j+1];D[1]=readData[i][j+1];D[2]=readData[i+1][j+1];D[3]=readData[i-1][j];D[4]=readData[i][j];D[5]=readData[i+1][j];D[6]=readData[i-1][j-1];D[7]=readData[i][j-1];D[8]=readData[i+1][j-1];writeData[i][j]=lvbo(D); //调用冒泡排序算法}软件对图像进行中值滤波的效果如下:图3 滤波前的一幅静态图像图4 中值滤波后的静态图像结果:从两幅图像的比对中发现:中值滤波的图像相对于原图有点模糊,主要是将相邻的像素值进行了均值处理。
2、中值滤波的硬件实现1)标准中值滤波对邻域中的像素按灰度级进行排序,然后选择该组的中间值作为输出像素值。
对于3×3窗口的中值滤波,采用图下图所示的3级比较电路输出中值,。
第一级比较电路由3个三输入比较器C组成,每个比较器的输出数据依序排列(参见图示)。
将3组比较结果中最小的3个数放在一起、中间的3个数放在一起、最大的3个数放在一起,参加第二级比较。