【FPGA筆記】基於FPGA的圖像處理


圖像處理系統設計注意點:html

1.將算法開發和FPGA實現分離算法

用軟件的圖像處理環境可使用大批量的圖像樣本進行測試及調試算法,再將算法映射到硬件上,這樣大大節省了硬件調試周期。緩存

2.算法的精度框架

圖像處理的算法中,大部分須要採用浮點數運算,而浮點數運算再FPGA中是很是不划算的,所以須要轉換成定點數計算,此時會設計到浮點運算轉定點運算時精度降低的問題。ide

3.軟件和硬件的合理劃分函數

這裏的軟件是指DSP,CPU,硬件是指FPGA;通常 結構規則 計算量大的操做如sobel算子 均值濾波能夠採用硬件進行,不規則的動態可變長度循環的底層算法由軟件進行;post


 

圖像處理FPGA 設計基本方法:測試

1.陣列結構結合流水線處理設計spa

例如RGB圖像,包括三組數據,處理時須要並行三通道後,每一個通道進行分別的串行流水處理。設計

2.緩存設計

幀緩存 行緩存 列對齊

3.資源

分辨率 處理窗口 對資源影響成倍增長

 


 

基於FPGA設計框架舉例:

一、灰度直方圖統計

直方圖是圖像的灰度分佈統計的一種表示方法,統計目標圖像中各個灰度點的像素個數,不少對於圖像的調整算法都是基於此進行的;

如何基於FPGA進行統計呢?

 1)因爲是統計圖像的直方圖,因此必定是統計結果會在圖像通過以後才能產生,所以須要進行緩存;

     緩存一:統計後的結果;

     緩存二:通過統計處理器的圖像數據,以便後面和直方圖作同步處理。

 2)圖像經常用8位、24位、32位來表示一個像素的灰度值,

     所以,統計種類分別爲2^8=256/2^24=16777216/2^32=4294967296,地址位寬根據此進行選擇設定;

     根據不一樣的精度選擇不一樣的緩存方式:片內或片外緩存;

3)處理流程:

    首先根據當前來的灰度值作爲讀RAM地址,讀出RAM中對應灰度值的的統計值;

    第二將讀出結果加一併回寫回RAM的當前地址中;

    第三重複操做至當前圖像處理結束;

    第四下一幅圖像到來以前順序按灰度值從0到最大的順序將最終結果讀出;

    第五讀出最終結果後,將RAM清空。

4)處理細節

    定義參數 圖像高度IH 圖像寬度IW 像素逐行輸入

    所以以行同步脈衝的上升沿做爲統計開始,行同步脈衝做爲行統計計數器

    行統計計數器達到最大高度時,做爲統計結束標誌。

 

2.灰度直方圖均衡化處理

1.統計出直方圖,獲取各個像素灰度累加和

2.乘以均衡係數:(2^DW-1)/IW*IH(像素最大值/圖像的面積)

 

 

 3.直方圖線性拉伸處理

    此節暫時略過;

 

4.線性濾波器

    首先須要區分線性和非線性濾波器的區別,區別在於其輸出與輸入之間是否有惟一且肯定的函數傳遞。

    線性濾波器分類:

    平滑濾波器:主要包括均值濾波器和高斯濾波器等

    銳化濾波器:主要包括SOBEL算子 LAPLAS算子 梯度運算等

    濾波器的物理意義主要是響應信號對目標信號響應後的樣子,也就是響應函數g(i,j) 滑過整個圖像,即對圖像作一個卷積處理,就獲得了濾波結果。

    1)均值濾波器概述

    用一個圖像區域的各個像素的平均值來代替原圖像的各個像素值,主要做用是減少銳度,減少噪聲。

    均值濾波通常出如今圖像處理的預處理步驟,

    預處理後,根據噪聲來源,例如針對椒鹽噪聲作中值濾波處理,針對高斯噪聲作高斯濾波處理

    後續可能繼續作邊緣提取等複雜操做處理。

   2)均值濾波器設計

   設計一個濾波器能夠理解成設計一個響應函數g(x,y)=Σi=-rrΣj=-rr I(x+i,y+j)) / (2r+1)2

   數學公式很好理解,就是求一個窗口的全部像素灰度值以後後再除以整個窗口的面積也就是像素點個數,求出平均值;

   均值濾波的方法將數據存儲成3x3的矩陣,而後求這個矩陣。在圖像上對目標像素給一個模板,

   該模板包括了其周圍的臨近像素(以目標象素爲中心的周圍 8 個像素,構成一個濾波模板,即去掉目標像素自己),再用模板中的全體像素的平均值來代替原來像素值。

   (參考:http://www.cnblogs.com/ninghechuan/p/6789399.html)

   (參考:http://www.cnblogs.com/aslmer/p/5779079.html#undefined)

   shift_ram 進行數據矩陣化,將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
21 
22 
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位數之和
37 wire [5:0]fin_y_data; //平均數,除以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方向進行卷積計算(矩陣的卷積計算即將全部元素作乘加計算)

   兩個方向的卷積結果求平方根計算;

   計算結果若是大於閾值則等於0xffff,若是小於閾值則等於0;

   最終輸出則是圖像的邊緣。

   參考代碼以下:因爲算子簡單以及有正負區分,所以須要作正值和負值分別計算後再進行相減計算。

//    | -1  0 +1 |
//Gx= | -2  0 +2 |
//    | -1  0 +1 |
//
//    | -1 -2 -1 |
//Gy= |  0  0  0 |
//    | +1 +2 +1 |

reg [8:0] p_x_data ,p_y_data ;  // x 和 y 的正值之和
reg [8:0] n_x_data ,n_y_data ; // x 和 y 的負值之和
reg [8:0] gx_data  ,gy_data  ; //最終結果

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
       p_x_data <=0;
       n_x_data <=0;
       gx_data   <=0;
    end
    else if(per_href_ff1==1) begin 
        p_x_data <= p_13 + (p_23<<1) + p_33 ;
        n_x_data <= p_11 + (p_12<<1 )+ p_13 ;
        gx_data   <= (p_x_data >=n_x_data)? p_x_data - n_x_data : n_x_data - p_x_data ; 
    end
    else begin
         p_x_data<=0;
         n_x_data<=0;
         gx_data <=0;
    end  
end

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
       p_y_data <=0;
       n_y_data <=0;
       gy_data   <=0;
    end
    else if(per_href_ff1==1) begin
        p_y_data <= p_11 + (p_12<<1) + p_13 ;
        n_y_data <= p_31 + (p_32<<1) + p_33 ;
        gy_data   <= (p_y_data >=n_y_data)? p_y_data - n_y_data : n_y_data - p_y_data ; 
    end
    else begin
        p_y_data <=0;
        n_y_data <=0;
        gy_data   <=0;
   end
end

//求平方和,調用ip核開平方
reg [16:0] gxy; // Gx 與 Gy 的平方和
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        gxy<=0;
    end
    else begin
        gxy<= gy_data* gy_data + gx_data* gx_data ;
    end
end

wire [8:0] squart_out ; 
altsquart  u1_altsquart (     //例化開平方的ip核
    .radical (gxy),
    .q       (squart_out),  //輸出的結果
    .remainder()
                       );

//與閾值進行比較
reg [15:0] post_y_data_r;
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        post_y_data_r<=16'h00;
    end
    else if(squart_out>=threshold)
         post_y_data_r<=16'h00  ;
    else
         post_y_data_r<=16'hffff  ;
    
end
View Code

 

5.非線性濾波器 

   非線性濾波器一般下是沒有特定的轉移函數,統計排序濾波器;

   中值濾波

   將 3*3 滑動塊中的灰度值進行排序,而後用排序的中間值取代 3*3 滑塊中心的值。示意圖以下圖所示。

   

   第一步:將每一行按最大值、中間值、最小值排列

   第二步:提取出最大值的最小值,中間值的中間值,最小值的最大值

   第三步:將第二步提取出來的三個數進行排序,中間值即咱們要求的中間值。

 

   6.圖像分割

   圖像分割是將圖像劃分紅若干個互不相交的小區域的過程,將圖像中有意義的特徵或應用所須要的特徵信息提取出來,最終結果是分割成一些具備

   某種特徵的單元,稱爲圖像的基元。

相關文章
相關標籤/搜索