1. 程式人生 > >【FPGA筆記】基於FPGA的影象處理

【FPGA筆記】基於FPGA的影象處理

影象處理系統設計注意點:

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

用軟體的影象處理環境可以使用大批量的影象樣本進行測試及除錯演算法,再將演算法對映到硬體上,這樣大大節省了硬體調試周期。

2.演算法的精度

影象處理的演算法中,大部分需要採用浮點數運算,而浮點數運算再FPGA中是非常不划算的,因此需要轉換成定點數計算,此時會設計到浮點運算轉定點運算時精度下降的問題。

3.軟體和硬體的合理劃分

這裡的軟體是指DSP,CPU,硬體是指FPGA;一般 結構規則 計算量大的操作如sobel運算元 均值濾波可以採用硬體進行,不規則的動態可變長度迴圈的底層演算法由軟體進行;

影象處理FPGA 設計基本方法:

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

例如RGB影象,包括三組資料,處理時需要並行三通道後,每個通道進行分別的序列流水處理。

2.快取設計

幀快取 行快取 列對齊

3.資源

解析度 處理視窗 對資源影響成倍增加

基於FPGA設計框架舉例:

1、灰度直方圖統計

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

如何基於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=-rI(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矩陣的中心畫素的周圍八個點求和,採取了流水線的設計方法,來增加吞吐量,然後再求平均值代替目標畫素的值。

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
複製程式碼

5.非線性濾波器 

   非線性濾波器通常下是沒有特定的轉移函式,統計排序濾波器;

   中值濾波

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

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

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

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

   6.影象分割

   影象分割是將影象劃分成若干個互不相交的小區域的過程,將影象中有意義的特徵或應用所需要的特徵資訊提取出來,最終結果是分割成一些具有

   某種特徵的單元,稱為影象的基元。

相關推薦

FPGA筆記基於FPGA影象處理

影象處理系統設計注意點:1.將演算法開發和FPGA實現分離用軟體的影象處理環境可以使用大批量的影象樣本進行測試及除錯演算法,再將演算法對映到硬體上,這樣大大節省了硬體調試周期。2.演算法的精度影象處理的演算法中,大部分需要採用浮點數運算,而浮點數運算再FPGA中是非常不划算的

開發筆記基於EasyUI框架,實現table列的動態繫結

使用easyUI從後臺獲取欄位,前臺動態繫結 如下圖效果,表頭小區動態載入,如果沒有賣出商品,就不顯示,並且表頭下方分欄顯示 後臺使用c#,Java程式碼也可以參考 不多說,直接上程式碼 html <table id="PayReport" class="

資訊科技2002.04基於區域性分割的數字影象處理

本文為澳大利亞莫納什大學(作者:Torsten Seemann)的博士論文,共300頁。 本文提出了一種實現“區域性分割”的低層次影象處理的統一思想。區域性分割提供了一種檢查並理解現有演算法的方式,以及建立新演算法的範例。區域性分割可以應用於重要的影象處理任務。利用傳統的強度閾值分割技

資訊科技2015.05含原始碼基於彩色色調影象處理的目標跟蹤

本文為美國阿肯色大學(作者:ZacharyR. Sabey)的學士論文,共44頁。 如今,許多工業和商業應用開始使用無人系統來提高生產力,並降低生產和人力成本。這些應用中的大多數產品都是半無人化的,它們仍然需要人類來啟動或接收連續的指令。隨著影象處理技術、攝像機處理能力和更高效的車

OpenCV筆記影象處理

void FillWhite(IplImage *pImage) { cvRectangle(pImage, cvPoint(0, 0), cvPoint(pImage->width, pImage->height), CV_RGB(255, 255, 255), CV_FILLE

調研筆記寒假記錄 無人機巡檢 影象處理方法調研總結

寒假任務之一:調研巡檢相關的影象處理技術,如根據無人機採集的影象進行自動檢測分析是否存在問題。例子:高鐵橋樑檢測、樓房牆皮破損等。 ———————————————分割線—————————————————— 就最近閱讀的論文,圍繞“巡檢 影象處理 無人機”三個

課程筆記opencv+tensorflow入門人工智慧影象處理(2018-4-19)

計算機視覺(opencv+tensorflow) 1.1 mac環境搭建 1、下載安裝anaconda 2、下載安裝tensorflow+配置opencv 3、下載安裝notebook Anaconda中搭建環境都是使用Environment進行搭

ALB學習筆記基於事件觸發方式的串行通信接口數據接收案例

except 和數 從數據 發送數據 exceptio 工作原理 實時 double 窗體 基於事件觸發方式的串行通信接口數據接收案例 廣東職業技術學院 歐浩源 1、案例背景 之前寫過一篇《基於多線程方式的串行通信接口數據接收案例》的博文,討論了采用輪詢方

ALB學習筆記基於.NET環境的高頻RFID卡讀寫設備的基本操作案例

範例 write load rgs 顯示 職業 ner num cte 基於.NET環境的高頻RFID卡讀寫設備的基本操作案例 廣東職業技術學院 歐浩源 1、引言 RFID高頻卡在我們的日常生活中隨處可見,是物聯網應用中不可或缺的一個重要部分,也是全國職業

AO筆記有關使用AO基於shp文件創建網絡數據集的一個細節

style manager 博客 target 類庫 dataset IT pac red 前些日子,和群友交流時提及shp文件創建單一網絡數據集的創建問題。 由於項目需求,用shp文件創建網絡合適,所以不得不去找一些古老的代碼資料... 以前的研究中,創建網絡數據集是根據

Java筆記IO流中檔案複製及異常處理

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Main

Java筆記檔案輸出流中的IO異常處理

在檔案輸出流(FileOutputStream)的寫入操作和關閉資源操作中,比如說檔案寫入失敗或者關閉資源失敗等等,我們不能把這些異常總是拋給虛擬機器,不然JVM會生氣的,我們已經長大了要自己學會處理這些異常。 如: try { fos = new FileOutputStream("

PHP筆記檔案系統處理

檔案處理函式: 一、檔案操作 二、目錄操作 三、檔案上傳 四、多檔案上傳 五、檔案下載 六、檔案上傳下載系統 檔案測試函式: filetype(); //檔案型別 is_dir(); //判斷是否是目錄 is_file(); //判斷是否是檔案 file_exists(); //檔案或目

學習筆記Pattern Recognition&Machine Learning [1.2] Probability Theory(2) 基於高斯分佈和貝葉斯理論的曲線擬合

    高斯分佈不必贅述,這裡記錄個有意思的東西,即從高斯分佈和貝葉斯理論出發看曲線擬合(即選擇引數w)。     首先假設我們使用多項式擬合曲線,根據泰勒展開的方法,我們可以用有限項多項式在一定精度內擬合任何曲線。  &nb

機器學習筆記基於k-近鄰演算法的數字識別

更多詳細內容參考《機器學習實戰》 k-近鄰演算法簡介 簡單的說,k-近鄰演算法採用測量不同特徵值之間的距離方法進行分類。它的工作原理是:存在一個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每個資料與所屬分類的對應關係。輸入沒

論文筆記使用多流密集網路的密度感知單影象去雨

使用多流密集網路的密度感知單影象去雨 《Density-aware Single Image De-reaining using a Multi-stream Dense Network》 0 概要 這裡提出一種密度感知多路稠密連線神經網路演算法,DID-MDN,來雨量

我們都不是神的孩子數學_影象處理_雜項

關於個人 本人熱愛學習,先後畢業於福州大學數學與電腦科學學院和華東師範大學計算機與軟體工程學院。真的喜歡福大,畢業以來十分想念,後悔沒有在福州大讀研,雖然身在985,可是有揮之不去的母校情結,願自己一路成長,早發paper,為母校爭光,為大學裡那些幫助過自己的老師爭光!

讀書筆記《Python自然語言處理》第1章 語言處理與Python

1.1 語言計算:文字和詞彙 入門 nltk下載地址 使用pip安裝 >>>import nltk 檢驗是否成功。 >>>nltk.download() 選擇語料下載 使用python直譯器載入book模組中的條目 >&g

mahout筆記初步理解userCF(基於使用者的推薦演算法)在mahout的實現

昨天嘗試在java中搭建了一個mahout的小demo,實現的就是基於使用者的推薦演算法。程式碼如下(更多程式碼和測試資料庫)參見前一篇: public class RecommendTest { final static int NEIGHBORHOOD_NUM =

學習筆記pyQt5學習筆記(4)——第一個影象識別demoV3.0B

 軟體更新日誌V3.0B版本,在2.0基礎上實現了呼叫攝像頭的實時識別功能。V3.0A版若不實時重新整理識別畫面,可以手動點一次識別一次…… 附上完整程式碼,也是做個程式碼備份。需要的小夥伴自取就ok~ 軟體目前存在的bug是1.在開始識別後會很卡,目前認為可能的原因是每次重新整理