《浅析基于FPGA的非线性滤波.docx》由会员分享,可在线阅读,更多相关《浅析基于FPGA的非线性滤波.docx(5页珍藏版)》请在第一文库网上搜索。
1、浅析基于FPGA的非线性滤波1统计排序漉波设r为处理窗口半径,I(x,y)为输入像素值,g(x,y)为输出像素值,则有如下定义:g(x,y)=Sort(I(xi,y+i),n)-rir,-rjr,0nd_1d_2d_3d_3d_1d_3d_22.2整体设计与模块划分采用与均值滤波类似的方法,先进行一维图像行方向上的排序,再对列方向上的行排序结果进行排序,即可得到一个窗口方向上的排序。同样的,行方向的对齐采用行缓存来实现,如下图所示:注意:并行全比较排序与C语言实现的冒泡排序结果,在某些特殊情况下还是有点差别的。如下所示:如果使用C语言冒泡排序,目标值会被判定为1因为这9个数的排序如下:1,1,
2、1,1,1,0,0,0,0其“中值”为1,故判定为1使用先行后列的全排序法,每行的中值如下:100再对这3个数进行排序,得到最终的中值为0.与C语言冒泡排序判定结果不同。只有在1与0的比值为5:4或4:5的情况下才会出现,其他比值则不会出现判定结果不同。即便某些情况下判定结果可能不同,但他们都是中值附近的值,都具有中值滤波的效果。自己可以多列几种情况试试看。想强调的是,先行后列的并行全比较排序和C语言的冒泡排序数据结果对比时,可能会出现某些数据不同,免得大家怀疑是程序编写错误。2.3median_1d模块设计全并行排序的计算步骤如下首先得到待排序的n个数据:可以通过打nT拍得到。进行全比较:当
3、前数据与其他所有数据依次比较,并记录比较结果。将(2)中的记录结果相加。查找(3)中相加结果按指定次序输出。一维排序滤波里路逅t如下所示:*需要注意的是:dinj2为输入第O个数据,为输入第1个数据,din0为输入第2个薮据。*由于在求CmP_sum时,消耗了一个时钟周期,所以在求dout时,需要先对输入数据打一拍,即此时din3为输入第0个数据,din2为输入第1个数据,为输入第2个数据。当cmp_sum0=0UT_ID时,将第0个数据(din_r3)赋值给dout,当CmPsUm1=二OUT1D时,将第1个数据(din_r2)赋值给dout,当cmp_sum2=0UT_ID时,将第2个数据
4、(dinjr1)赋值给douto从上图可以看出,产生dout共需消耗5个时钟周期,dout_v1d需要和dout值号同步,故同样需要对dout_v1d打5拍,如下所示:上图中的KSZ为窗口长度,KSZ的值为3,故一行数据有两个数据无法做中值处理,所以dout_v1d信号产生代码如下:2.4median_2d模块设计采用和均值滤波同样的思路来处理,整个计算步骤如下计算一维行方向的排序结果输出。将第(1)步的结果接入第一个行缓存,第一个行缓存的输出接入第二个行缓存,得到3行的一维输出。对第(2)步输出的三个数据进行排序,得到结果输出。完成时序对齐。二维运算的电路设计如下图所示:由于行FIFO读出数
5、据有一拍延时,所以mediand输出的数据需要延时一拍,以便于FIFo读出数据对齐。从图4-6可以看出,产生median_data共需消耗3个时钟周期,median_v1d有1ine_rd_en2产生,也需要延时3个时钟周期,以便于median_data信号对齐,产生代码如下:由于median_v1d由Iine_rd_en1产生,故已经舍去了两行,所以此时不需要再与上其他信号了,注意与medianCi模块的C1OUt_v1d做对比,自己理解一下。3仿真与调试median_1d的测试激励如下:从图4-9可以看出,测试激励主要是产生0-9共10个数据,仿真结果如下所示:可以看出,中值结果是正确,尤其需要注意的是红色框框里的数据,8和1共产生了2次,这个地方使用书上的代码是有问题的。具体的自己看代码就知道了。I1Iedian_2d仿真有点麻烦,自己可以使用mspaint画图软件产生10*10的黑白图,然后再用qt将其转成txt,最后再使用IiIode1巫进行仿真。也可以自己写测试激励。最终中值滤波结果如下图所示: