基于FPGA的中值滤波算法的实现
基于FPGA的中值濾波算法的實現
- 算法介紹
- FPGA上實現
- 數據獲取
- 算法實現
- 仿真
算法介紹
中值濾波的基本原理是把數字圖像或數字序列中一點的值用該點的一個鄰域中各點值的中值代替,讓周圍的像素值接近的真實值,從而消除孤立的噪聲點。方法是用某種結構的二維滑動模板,將板內像素按照像素值的大小進行排序,生成單調上升(或下降)的為二維數據序列。
簡單來說:通常使用二維滑動模板,通過滑動,對模板內的數據進行排序,將排序后的中值提取出來,替換對應位置的數據,如圖1所示,使用3*3模板,需替換第一個數據‘5’,則模板為[000,057,045]T,對其取中值替換‘5’;如替換第二行第5列數據‘4’,模板則為[268,349,10 6 10]T,對其取中值替換‘4’;
FPGA上實現
數據獲取
關于數據的獲取,在此處,我們使用的是VGA/TFT顯示屏來顯示圖像,因此,圖像的獲取是通過TFT控制器將數據逐行輸出,數據從左到右依次輸出,一行輸出完畢,跳到下一行,繼續從左到右依次輸出;關于如何提取到需要的數據,且構成一個矩陣,在FPGA內,可以采用移位寄存的方法實現,實現方法如下:假如現在需要輸入18個數據,如圖2所示
假如我們現在有一個3行*6列的緩存器,可以將數據暫時緩存起來,數據從左到右,逐行輸入這個緩存器,每個時鐘輸入一個數據,經12個時鐘后,緩存器內數據應為如圖3所示
我們可以看到,如果我們可以把圈內數據提取出來,對其進行中值處理,替換第一個數據,如何提取出來,我們可以用9個寄存器,通過不斷移位,分別實現對3行數據的提取,相當于是一個3 * 3窗口,程序如下所示
line0為圖3第一行最后一個數據,line1為第二行最后一個數據,line2為第三行最后一個數據,
即在第12個時鐘,line0 = 6,line1 = 0(寄存器在下一個時鐘上升沿接收到數據)即line0_data0 = 6,line0_data1 = 5,line0_data2 = 4,line1_data0 = 0;
在第13個時鐘,line0 = 7,line1 = 1,即line0_data0 = 7,line0_data1 = 6,line0_data2 = 5,line1_data0 = 1;
第14個時鐘,line0 = 8,line1 = 2,line2 = 0,即line0_data0 = 8,line0_data1 = 7,line0_data2 = 6,line1_data0 = 2,line1_data1 = 1,line1_data2 = 0,line2_data0 = 0,line2_data1 = 0,line2_data2 = 0;可以看出,這9個數據構成了[8 7 6,2 1 0,0 0 0]T,是我們所需要的數據,對其進行中值運算后,替換第一個數據;
在第15個時鐘,line0 = 9,line1 = 3,line2 = 0,即line0_data0 = 9,line0_data1 = 8,line0_data2 = 7,line1_data0 = 3,line1_data1 = 2,line1_data2 = 1,line2_data0 = 0,line2_data1 = 0,line2_data2 = 0;可以看出,這9個數據構成了[9 8 7 ,3 2 1 ,0 0 0]T,對其進行中值運算后,替換第二個數據,這就實現了3*3窗口滑動。
為了實現上述既可以緩存數據,又可以移位,又可以分別輸出3個數據,在這里首先介紹一下Quartus Ⅱ軟件內的IP核’shift_ram ’,此IP全稱為:RAM-Based Shift Register ,即基于RAM的移位寄存器,其功能圖如圖5所示:此處設置的taps_distance為3,number_of_tap為4,即輸出的taps的間隔為3,輸出的taps為4,有4個輸出(摘自shift_ram用戶手冊)(在創建IP核時可以對此進行設置),由此功能圖可知,此IP核可以完美實現我們上述所需的功能。
算法實現
如圖6所示,第一步分別對三行像素進行排序:
由 L11,L12,L13 得到 L1max, L1mid, L1min;
由 L21,L22,L23 得到 L2max, L2mid, L2min;
由 L31,L32,L33 得到 L3max, L3mid, L3min。
第二步:
分別對三行像素中的 3 個最大,3 個中間和3個最小分別進行排序:
由 L1max, L2max, L3max 得到 Lmax_max, Lmax_mid, Lmax_min;
2)由 L1mid, L2mid, L3mid 得到 Lmid_max, Lmid_mid, Lmid_min;
3)由 Lmin, L2min, L3min 得到 Lmin_max, Lmin_mid, Lmin_min;
第三步:對最大的最小(Lmax_min),中間的中間(Lmid_mid)以及最小的最大
(Lmin_max)進行排序(例:由 Lmax_min,Lmid_mid,Lmin_max 得到midian)。
FPGA 的算法實現步驟基本如此。(注:此部分摘自“小梅哥基于 FPGA 的中值濾波算法的實現”);
數據獲取部分可知:我們替換第二個數據,可得到的矩陣為[9 8 7 ,3 2 1 ,0 0 0]T,第一步, L1max = 9, L1mid = 8, L1min = 7;L2max = 3, L2mid = 2, L2min = 1;L3max = 0, L3mid = 0, L3min = 0;Lmax_max =9, Lmax_mid =3, Lmax_min =0; Lmid_max =8, Lmid_mid =2, Lmid_min =0;Lmin_max =7, Lmin_mid =1, Lmin_min =0;由Lmax_min =0、Lmid_mid =2、Lmin_max =7得midian = 2;
仿真
設置的數據如圖7所示,現在需替換第2個數據“2000”;需獲得的數據為[1000 2000 3000,9001 9002 9003];
仿真圖如圖8所示,2000為第二位取中值后的數據,紅圈為取得的數據,因為由上述算法可知,對三行像素進行排序寄存一拍,對三行像素中的 3 個最大,3 個中間和3個最小分別進行排序進行寄存一拍,由 Lmax_min,Lmid_mid,Lmin_max 得到midian寄存一拍,因此數據是經3次寄存后輸出的,因此取得的數據應為紅圈處,由仿真可得,得到的數據與想要結果相同。
注:此文是對小梅哥圖像處理部分基于 FPGA 的中值濾波算法的實現的理解,使用的代碼和算法均來自于‘小梅哥圖像處理部分基于 FPGA 的中值濾波算法的實現’
總結
以上是生活随笔為你收集整理的基于FPGA的中值滤波算法的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用ffmpeg推流rtmp
- 下一篇: php5.0 cms安装教程,小浣熊CM