1.算法仿真效果
matlab2022a/Vivado2019.2仿真結(jié)果如下:
通過matlab產(chǎn)生帶噪聲醫(yī)學(xué)圖片:

FPGA仿真:

通過MATLAB讀取FPGA的仿真數(shù)據(jù),并顯示濾波后圖像:

2.算法涉及理論知識概要
中值濾波是一種非線性數(shù)字濾波器技術(shù),經(jīng)常用于去除圖像或者其它信號中的噪聲。這個設(shè)計思想就是檢查輸入信號中的采樣并判斷它是否代表了信號,使用奇數(shù)個采樣組成的觀察窗實現(xiàn)這項功能。觀察窗口中的數(shù)值進(jìn)行排序,位于觀察窗中間的中值作為輸出。然后,丟棄最早的值,取得新的采樣,重復(fù)上面的計算過程。
在圖像處理中,在進(jìn)行如邊緣檢測這樣的進(jìn)一步處理之前,通常需要首先進(jìn)行一定程度的降噪。中值濾波是圖像處理中的一個常用步驟,它對于斑點噪聲(speckle noise)和椒鹽噪聲(salt-and-pepper noise)來說尤其有用。保存邊緣的特性使它在不希望出現(xiàn)邊緣模糊的場合也很有用。
中值濾波器的主要思想是通過入口來遍歷信號入口,用鄰居入口的中值替換每個入口。鄰居的模式被稱為“窗口”,它通過入口滑動,覆蓋整個信號。對于一維信號,最明顯的窗口只是前后幾項,而2D(或更高維)信號(如圖像)則可能有更復(fù)雜的窗口模式(如“盒子”或“十字”模式)。請注意,如果窗口中有奇數(shù)個條目,則中位數(shù)很容易定義:在窗口中的所有條目都按數(shù)字排序之后,這只是中間值。對于偶數(shù)的條目,有不止一個可能的中位數(shù)。
通常,大部分的計算工作和時間花費在計算每個窗口的中值上。由于濾波器必須處理信號中的每個條目,對于像圖像這樣的大信號,這個中值計算的效率是確定算法運行速度的關(guān)鍵因素。上面描述的天真的實現(xiàn)將窗口中的每個條目進(jìn)行排序以找到中間值;然而,由于只需要列表中的中間值,所以選擇算法可以更有效。此外,某些類型的信號(通常是圖像的情況)使用整數(shù)表示:在這些情況下,直方圖因為從窗口到窗口更新直方圖是簡單的,并且找到直方圖的中值并不特別繁瑣,所以中值可以更有效得多。
中位數(shù)濾波的主要思想是逐條運行信號,用相鄰條目的中位數(shù)替換每個條目。鄰居的模式被稱為窗口,它在整個信號上逐條滑動。對于一維信號來說,最明顯的窗口只是前面和后面的幾個條目,而對于二維(或更高維度)數(shù)據(jù)來說,窗口必須包括給定半徑或橢圓區(qū)域內(nèi)的所有條目(即中位數(shù)濾波器不是一個可分離的濾波器)。
中位數(shù)濾波是一種平滑技術(shù),線性高斯濾波也是如此。所有的平滑技術(shù)都能有效地去除信號的平滑斑塊或平滑區(qū)域的噪聲,但對邊緣有不利的影響。但通常情況下,在減少信號中的噪聲的同時,保留邊緣也很重要。例如,邊緣對于圖像的視覺外觀是至關(guān)重要的。對于小到中等程度的高斯噪聲,在給定的固定窗口大小下,中值濾波器在去除噪聲的同時保留邊緣方面明顯優(yōu)于高斯模糊。然而,對于高水平的噪聲,它的性能并不比高斯模糊好多少,而對于斑點噪聲和鹽和胡椒噪聲(沖動噪聲),它特別有效。正因為如此,中值濾波在數(shù)字圖像處理中得到了非常廣泛的應(yīng)用。
3.Verilog核心程序
wire [7:0] max1, mid1, min1;
submed submed_u1(
.clk ??(i_clk),
.rst ??(i_rst),
.images({R11,R12,R13}),
.max ??(max1),
.mid ??(mid1),
.min ??(min1)
);
wire [7:0] max2, mid2, min2;
submed submed_u2(
.clk ??(i_clk),
.rst ??(i_rst),
.images({R21,R22,R23}),
.max ??(max2),
.mid ??(mid2),
.min ??(min2)
);
wire [7:0] max3, mid3, min3;
submed submed_u3(
.clk ??(i_clk),
.rst ??(i_rst),
.images({R31,R32,R33}),
.max ??(max3),
.mid ??(mid3),
.min ??(min3)
); ??
wire [7:0] min_max1;
submed submed_u11(
.clk ??(i_clk),
.rst ??(i_rst),
.images({max1,max2,max3}),
.max ??(),
.mid ??(),
.min ??(min_max1)
);
wire [7:0] mid_mid1;
submed submed_u12(
.clk ??(i_clk),
.rst ??(i_rst),
.images({mid1,mid2,mid3}),
.max ??(),
.mid ??(mid_mid1),
.min ??()
);
wire [7:0] max_min1;
submed submed_u13(
.clk ??(i_clk),
.rst ??(i_rst),
.images({min1,min2,min3}),
.max ??(max_min1),
.mid ??(),
.min ??()
); ?????
submed submed_u44(
.clk ??(i_clk),
.rst ??(i_rst),
.images({min_max1,mid_mid1,max_min1}),
.max ??(),
.mid ??(o_medfilter),
.min ??()
); ?????
endmodule