圖像處理系統(tǒng)設計注意點:1.將算法開發(fā)和FPGA實現(xiàn)分離用軟件的圖像處理環(huán)境可以使用大批量的圖像樣本進行測試及調(diào)試算法,再將算法映射到硬件上,,這樣大大節(jié)省了硬件調(diào)試周期。
2.算法的精度圖像處理的算法中,,大部分需要采用浮點數(shù)運算,而浮點數(shù)運算再FPGA中是非常不劃算的,,因此需要轉(zhuǎn)換成定點數(shù)計算,,此時會設計到浮點運算轉(zhuǎn)定點運算時精度下降的問題,。
3.軟件和硬件的合理劃分這里的軟件是指DSP,,CPU,硬件是指FPGA,;一般 結(jié)構(gòu)規(guī)則 計算量大的操作如sobel算子 均值濾波可以采用硬件進行,,不規(guī)則的動態(tài)可變長度循環(huán)的底層算法由軟件進行;
圖像處理FPGA 設計基本方法:1.陣列結(jié)構(gòu)結(jié)合流水線處理設計例如RGB圖像,,包括三組數(shù)據(jù),,處理時需要并行三通道后,每個通道進行分別的串行流水處理,。2.緩存設計幀緩存 行緩存 列對齊3.資源分辨率 處理窗口 對資源影響成倍增加
基于FPGA設計框架舉例:
1,、灰度直方圖統(tǒng)計直方圖是圖像的灰度分布統(tǒng)計的一種表示方法,統(tǒng)計目標圖像中各個灰度點的像素個數(shù),,很多對于圖像的調(diào)整算法都是基于此進行的,;如何基于FPGA進行統(tǒng)計呢? 1)由于是統(tǒng)計圖像的直方圖,,所以一定是統(tǒng)計結(jié)果會在圖像經(jīng)過之后才能產(chǎn)生,,因此需要進行緩存;
緩存一:統(tǒng)計后的結(jié)果;
緩存二:經(jīng)過統(tǒng)計處理器的圖像數(shù)據(jù),,以便后面和直方圖做同步處理,。 2)圖像常常用8位、24位,、32位來表示一個像素的灰度值,, 因此,統(tǒng)計種類分別為2^8=256/2^24=16777216/2^32=4294967296,,地址位寬根據(jù)此進行選擇設定,; 根據(jù)不同的精度選擇不同的緩存方式:片內(nèi)或片外緩存;3)處理流程: 首先根據(jù)當前來的灰度值做為讀RAM地址,,讀出RAM中對應灰度值的的統(tǒng)計值,;
第二將讀出結(jié)果加一并回寫回RAM的當前地址中; 第三重復操作至當前圖像處理結(jié)束,; 第四下一幅圖像到來之前順序按灰度值從0到最大的順序?qū)⒆罱K結(jié)果讀出,; 第五讀出最終結(jié)果后,將RAM清空,。4)處理細節(jié) 定義參數(shù) 圖像高度IH 圖像寬度IW 像素逐行輸入 因此以行同步脈沖的上升沿作為統(tǒng)計開始,,行同步脈沖作為行統(tǒng)計計數(shù)器 行統(tǒng)計計數(shù)器達到最大高度時,作為統(tǒng)計結(jié)束標志,。
2.灰度直方圖均衡化處理
1.統(tǒng)計出直方圖,,獲取各個像素灰度累加和2.乘以均衡系數(shù):(2^DW-1)/IW*IH(像素最大值/圖像的面積)
3.直方圖線性拉伸處理
此節(jié)暫時略過;
4.線性濾波器
首先需要區(qū)分線性和非線性濾波器的區(qū)別,,區(qū)別在于其輸出與輸入之間是否有唯一且確定的函數(shù)傳遞,。 線性濾波器分類: 平滑濾波器:主要包括均值濾波器和高斯濾波器等 銳化濾波器:主要包括SOBEL算子 LAPLAS算子 梯度運算等 濾波器的物理意義主要是響應信號對目標信號響應后的樣子,也就是響應函數(shù)g(i,,j) 滑過整個圖像,,即對圖像做一個卷積處理,就得到了濾波結(jié)果,。
1)均值濾波器概述
用一個圖像區(qū)域的各個像素的平均值來代替原圖像的各個像素值,,主要作用是減小銳度,減小噪聲,。 均值濾波一般出現(xiàn)在圖像處理的預處理步驟,, 預處理后,根據(jù)噪聲來源,,例如針對椒鹽噪聲做中值濾波處理,,針對高斯噪聲做高斯濾波處理 后續(xù)可能繼續(xù)做邊緣提取等復雜操作處理。
2)均值濾波器設計
設計一個濾波器可以理解成設計一個響應函數(shù)g(x,,y)=Σi=-rrΣj=-rr I(x+i,,y+j)) / (2r+1)2 數(shù)學公式很好理解,,就是求一個窗口的所有像素灰度值之后后再除以整個窗口的面積也就是像素點個數(shù),求出平均值,; 均值濾波的方法將數(shù)據(jù)存儲成3x3的矩陣,,然后求這個矩陣。在圖像上對目標像素給一個模板,, 該模板包括了其周圍的臨近像素(以目標象素為中心的周圍 8 個像素,,構(gòu)成一個濾波模板,即去掉目標像素本身),,再用模板中的全體像素的平均值來代替原來像素值,。
(參考:http://www.cnblogs.com/ninghechuan/p/6789399.html)
(參考:http://www.cnblogs.com/aslmer/p/5779079.html#undefined) shift_ram 進行數(shù)據(jù)矩陣化,將3x3矩陣的中心像素的周圍八個點求和,,采取了流水線的設計方法,,來增加吞吐量,然后再求平均值代替目標像素的值,。
1 //矩陣元素移位賦值
2 always @(posedge clk or negedge rst_n)begin
3 if(rst_n==1'b0)begin
4 {p_11,,p_12,p_13} 《= {5'b0,,5'b0,,5'b0} ;
5 {p_21,p_22,,p_23} 《= {15'b0,,15'b0,15'b0};
6 {p_31,,p_32,,p_33} 《= {15'b0,15'b0,,15'b0};
7 end
8 else begin
9 if(per_href_ff0==1&&flag_do==1)begin
10 {p_11,,p_12,p_13}《={p_12,,p_13,row_1};
11 {p_21,,p_22,,p_23}《={p_22,p_23,,row_2};
12 {p_31,,p_32,p_33}《={p_32,,p_33,,row_3};
13 end
14 else begin
15 {p_11,,p_12,p_13}《={5'b0,,5'b0,,5'b0};
16 {p_21,p_22,,p_23}《={5'b0,,5'b0,5'b0}
17 {p_31,,p_32,,p_33}《={5'b0,5'b0,,5'b0}
18 end
19 end
20 end
23 always @(posedge clk or negedge rst_n)begin
24 if(rst_n==1'b0)begin
25 mean_value_add1《=0;
26 mean_value_add2《=0;
27 mean_value_add3《=0;
28 end
29 else if(per_href_ff1)begin
30 mean_value_add1《=p_11+p_12+p_13;
31 mean_value_add2《=p_21+ 0 +p_23;
32 mean_value_add3《=p_31+p_32+p_33;
33 end
34 end
35
36 wire [8:0]mean_value;//8位數(shù)之和
37 wire [5:0]fin_y_data; //平均數(shù),,除以8,相當于左移三位,。
38
39 assign mean_value=mean_value_add1+mean_value_add2+mean_value_add3;
40 assign fin_y_data=mean_value[8:3],;
View Code
3)sobel算子 | -1 0 +1 |
Gx= | -2 0 +2 |
| -1 0 +1 |
| -1 -2 -1 |
Gy= | 0 0 0 |
| +1 +2 +1 |
包括X和Y兩個方向的兩套3X3矩陣,使其分別和圖像的X和Y方向進行卷積計算(矩陣的卷積計算即將所有元素做乘加計算),; 兩個方向的卷積結(jié)果求平方根計算,; 計算結(jié)果如果大于閾值則等于0xffff,如果小于閾值則等于0,; 最終輸出則是圖像的邊緣,。
參考代碼如下:由于算子簡單以及有正負區(qū)分,因此需要做正值和負值分別計算后再進行相減計算,。
1 //矩陣元素移位賦值
2 always @(posedge clk or negedge rst_n)begin
3 if(rst_n==1'b0)begin
4 {p_11,,p_12,p_13} 《= {5'b0,,5'b0,,5'b0} ;
5 {p_21,p_22,,p_23} 《= {15'b0,,15'b0,15'b0};
6 {p_31,,p_32,,p_33} 《= {15'b0,15'b0,,15'b0};
7 end
8 else begin
9 if(per_href_ff0==1&&flag_do==1)begin
10 {p_11,,p_12,p_13}《={p_12,,p_13,,row_1};
11 {p_21,,p_22,p_23}《={p_22,,p_23,,row_2};
12 {p_31,p_32,,p_33}《={p_32,,p_33,row_3};
13 end
14 else begin
15 {p_11,,p_12,,p_13}《={5'b0,5'b0,,5'b0};
16 {p_21,,p_22,p_23}《={5'b0,,5'b0,,5'b0}
17 {p_31,p_32,,p_33}《={5'b0,,5'b0,5'b0}
18 end
19 end
20 end
23 always @(posedge clk or negedge rst_n)begin
24 if(rst_n==1'b0)begin
25 mean_value_add1《=0;
26 mean_value_add2《=0;
27 mean_value_add3《=0;
28 end
29 else if(per_href_ff1)begin
30 mean_value_add1《=p_11+p_12+p_13;
31 mean_value_add2《=p_21+ 0 +p_23;
32 mean_value_add3《=p_31+p_32+p_33;
33 end
34 end
36 wire [8:0]mean_value;//8位數(shù)之和
37 wire [5:0]fin_y_data; //平均數(shù),,除以8,,相當于左移三位。
39 assign mean_value=mean_value_add1+mean_value_add2+mean_value_add3;
40 assign fin_y_data=mean_value[8:3],;
View Code 3)sobel算子 | -1 0 +1 |
Gx= | -2 0 +2 |
| -1 0 +1 |
| -1 -2 -1 |
Gy= | 0 0 0 |
| +1 +2 +1 |
5.非線性濾波器
非線性濾波器通常下是沒有特定的轉(zhuǎn)移函數(shù),,統(tǒng)計排序濾波器;
中值濾波
將 3*3 滑動塊中的灰度值進行排序,,然后用排序的中間值取代 3*3 滑塊中心的值,。示意圖如下圖所示。
第一步:將每一行按最大值,、中間值,、最小值排列 第二步:提取出最大值的最小值,中間值的中間值,,最小值的最大值 第三步:將第二步提取出來的三個數(shù)進行排序,,中間值即我們要求的中間值。
6.圖像分割
圖像分割是將圖像劃分成若干個互不相交的小區(qū)域的過程,,將圖像中有意義的特征或應用所需要的特征信息提取出來,最終結(jié)果是分割成一些具有 某種特征的單元,,稱為圖像的基元,。
更多信息可以來這里獲取==>>電子技術(shù)應用-AET<<