加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

FPGA設(shè)計(jì)經(jīng)驗(yàn)之圖像處理

05/06 10:40
3677
閱讀需 18 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

大俠好,歡迎來到FPGA技術(shù)江湖,江湖偌大,相見即是緣分。大俠可以關(guān)注FPGA技術(shù)江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡。

今天和大俠簡(jiǎn)單聊一聊基于FPGA的圖像處理,之前也和各位大俠聊過相關(guān)的圖像處理,這里面也超鏈接了幾篇,具體如下:圖像邊緣檢測(cè)算法體驗(yàn)步驟(Photoshop,Matlab)、算法系列:基于 FPGA 的圖像邊緣檢測(cè)系統(tǒng)設(shè)計(jì)(sobel算法)?、FPGA設(shè)計(jì)中 Verilog HDL實(shí)現(xiàn)基本的圖像濾波處理仿真,需要的可以參考一下,歡迎一起交流學(xué)習(xí)。話不多說,上貨。

使用FPGA做圖像處理優(yōu)勢(shì)最關(guān)鍵的就是:FPGA能進(jìn)行實(shí)時(shí)流水線運(yùn)算,能達(dá)到最高的實(shí)時(shí)性。因此在一些對(duì)實(shí)時(shí)性要求非常高的應(yīng)用領(lǐng)域,做圖像處理基本就只能用FPGA。例如在一些分選設(shè)備中圖像處理基本上用的都是FPGA,因?yàn)樵谄渲邢鄼C(jī)從看到物料圖像到給出執(zhí)行指令之間的延時(shí)大概只有幾毫秒,這就要求圖像處理必須很快且延時(shí)固定,只有FPGA進(jìn)行的實(shí)時(shí)流水線運(yùn)算才能滿足這一要求。

所以要了解FPGA進(jìn)行圖像處理的優(yōu)勢(shì)就必須理解FPGA所能進(jìn)行的實(shí)時(shí)流水線運(yùn)算和DSP,GPU等進(jìn)行的圖像處理運(yùn)算有何不同。DSP,GPU,CPU對(duì)圖像的處理基本是以幀為單位的,從相機(jī)采集的圖像數(shù)據(jù)會(huì)先存在內(nèi)存中,然后GPU會(huì)讀取內(nèi)存中的圖像數(shù)據(jù)進(jìn)行處理。假如采集圖像的幀率是30幀,那么DSP,GPU要是能在1/30秒內(nèi)完成一幀圖像的處理,那基本上就能算是實(shí)時(shí)處理。

FPGA對(duì)圖像進(jìn)行實(shí)時(shí)流水線運(yùn)算是以行為單位的。FPGA可以直接和圖像傳感器芯片連接獲得圖像數(shù)據(jù)流,如果是RAW格式的則還可以進(jìn)行差值以獲得RGB圖像數(shù)據(jù)。FPGA能進(jìn)行實(shí)時(shí)流水線處理的關(guān)鍵是它可以用其內(nèi)部的Block Ram緩存若干行的圖像數(shù)據(jù)。這個(gè)Block Ram可以說是類似于CPU里面的Cache,但Cache不是你能完全控制的,但Block Ram是完全可控的,可以用它實(shí)現(xiàn)各種靈活的運(yùn)算處理。這樣FPGA通過緩存若干行圖像數(shù)據(jù)就可以對(duì)圖像進(jìn)行實(shí)時(shí)處理,數(shù)據(jù)就這樣一邊流過就一邊處理好了,不需要送入DDR緩存了之后再讀出來處理。

這樣的數(shù)據(jù)流處理顯然是順序讀取數(shù)據(jù)的,那么也就只能實(shí)現(xiàn)那些順序讀取數(shù)據(jù)的算法,也就是圖像處理中那一大類用3x3到NxN的算子進(jìn)行的濾波、取邊緣、膨脹腐蝕等算法??赡艽蠹視?huì)覺得這些運(yùn)算似乎都是最基本的圖像處理運(yùn)算,只是個(gè)前端的預(yù)處理,似乎用處不大。但問題是只有FPGA做這樣的運(yùn)算才是速度最快效率最高的,比如用CPU做一個(gè)取邊緣的算法根本就達(dá)不到實(shí)時(shí)。另外別小看了這種NxN算子法,它可以有各種組合和玩法,可以實(shí)現(xiàn)分選多種顏色,甚至分辨簡(jiǎn)單形狀等功能。FPGA進(jìn)行的這種算子法處理是并行流水線算法,其延時(shí)是固定的,比如用3x3的算子進(jìn)行處理其給出結(jié)果的延時(shí)是兩行圖像的時(shí)間。還有這個(gè)算子法和現(xiàn)在卷積神經(jīng)網(wǎng)絡(luò)中最前面的卷積層運(yùn)算是類似的。

FPGA中的Block Ram是重要和稀缺資源,能緩存的圖像數(shù)據(jù)行數(shù)是有限的,所以這個(gè)NxN的算子中的N不能特別大。當(dāng)然FPGA也可以接DDR把圖像緩存到其中再讀出來進(jìn)行處理,但這種處理模式就和CPU差不多了,達(dá)不到最高的實(shí)時(shí)性。其實(shí)有些我們認(rèn)為需要隨機(jī)讀取數(shù)據(jù)的圖像處理算法也是可以并行流水線化的。

在密集運(yùn)算中,耽誤時(shí)間和消耗功耗的操作往往不是運(yùn)算本身,而是把數(shù)據(jù)從內(nèi)存中搬來搬去。GPU,CPU在進(jìn)行運(yùn)算時(shí)要把數(shù)據(jù)從內(nèi)存中取出來,算好了在放回去。這樣內(nèi)存帶寬往往成了運(yùn)算速度的瓶頸,數(shù)據(jù)搬運(yùn)過程中的功耗占的比重也不會(huì)小。FPGA則可以通過堆很多計(jì)算硬件的方法把要做的運(yùn)算都展開,然后數(shù)據(jù)從中流過,完成一個(gè)階段的運(yùn)算之后就直接流入第二個(gè)階段,不需要把一個(gè)計(jì)算階段完成后的數(shù)據(jù)再送回內(nèi)存中,再讀出來交給下一個(gè)階段的運(yùn)算。這樣就會(huì)節(jié)省很多時(shí)間和功耗?,F(xiàn)在用FPGA做圖像處理就是這樣干的,比如先用一個(gè)3x3的算子進(jìn)行濾波,再用一個(gè)3x3的算子進(jìn)行取邊緣,在FPGA流水線算法中,濾波處理完了數(shù)據(jù)立即就會(huì)進(jìn)行取邊緣處理,是不需要像CPU那樣存回內(nèi)存再讀出來的。

FPGA進(jìn)行圖像處理的前景還是挺廣闊的,越來越多的工業(yè)應(yīng)用場(chǎng)合都要求更高的實(shí)時(shí)性,而這正是FPGA所適合的。還有機(jī)器學(xué)習(xí)領(lǐng)域,神經(jīng)網(wǎng)絡(luò)這種層狀的,不需要很隨機(jī)的讀取數(shù)據(jù)的運(yùn)算是比較適合用FPGA來做的。不過FPGA不擅長(zhǎng)浮點(diǎn)運(yùn)算,如果能整出不需要浮點(diǎn)運(yùn)算的神經(jīng)網(wǎng)絡(luò),那么FPGA在這方面的應(yīng)用將會(huì)更大。

前些年用matlab和opencv做圖像處理。近一段時(shí)間通過FPGA處理攝像頭視頻數(shù)據(jù),有太多感觸,復(fù)雜的算法先不提及,單是上面文章中提到的一些處理手段及策略,非常受用。

下面就幾個(gè)方面簡(jiǎn)單列一些:

圖像處理系統(tǒng)設(shè)計(jì)注意點(diǎn):

1.將算法開發(fā)和FPGA實(shí)現(xiàn)分離

軟件的圖像處理環(huán)境可以使用大批量的圖像樣本進(jìn)行測(cè)試及調(diào)試算法,再將算法映射到硬件上,這樣大大節(jié)省了硬件調(diào)試周期。

2.算法的精度

圖像處理的算法中,大部分需要采用浮點(diǎn)數(shù)運(yùn)算,而浮點(diǎn)數(shù)運(yùn)算在FPGA中是非常不劃算的,因此需要轉(zhuǎn)換成定點(diǎn)數(shù)計(jì)算,此時(shí)會(huì)設(shè)計(jì)到浮點(diǎn)運(yùn)算轉(zhuǎn)定點(diǎn)運(yùn)算時(shí)精度下降的問題。

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

這里的軟件是指DSP、CPU等等,硬件是指FPGA;一般結(jié)構(gòu)規(guī)則、計(jì)算量大的操作如sobel算子、均值濾波可以采用硬件進(jìn)行,不規(guī)則的動(dòng)態(tài)可變長(zhǎng)度循環(huán)的底層算法由軟件進(jìn)行。

圖像處理FPGA 設(shè)計(jì)基本方法:

1.陣列結(jié)構(gòu)結(jié)合流水線處理設(shè)計(jì)

例如RGB圖像,包括三組數(shù)據(jù),處理時(shí)需要并行三通道后,每個(gè)通道進(jìn)行分別的串行流水處理。

2.緩存設(shè)計(jì)

幀緩存?行緩存?列對(duì)齊

3.資源

分辨率?處理窗口?對(duì)資源影響成倍增加

基于FPGA設(shè)計(jì)框架舉例:

1、灰度直方圖統(tǒng)計(jì)

直方圖是圖像的灰度分布統(tǒng)計(jì)的一種表示方法,統(tǒng)計(jì)目標(biāo)圖像中各個(gè)灰度點(diǎn)的像素個(gè)數(shù),很多對(duì)于圖像的調(diào)整算法都是基于此進(jìn)行的;

如何基于FPGA進(jìn)行統(tǒng)計(jì)呢?

1)由于是統(tǒng)計(jì)圖像的直方圖,所以一定是統(tǒng)計(jì)結(jié)果會(huì)在圖像經(jīng)過之后才能產(chǎn)生,因此需要進(jìn)行緩存;

緩存一:統(tǒng)計(jì)后的結(jié)果;

緩存二:經(jīng)過統(tǒng)計(jì)處理器的圖像數(shù)據(jù),以便后面和直方圖做同步處理。

2)圖像常常用8位、24位、32位來表示一個(gè)像素的灰度值。因此,統(tǒng)計(jì)種類分別為2^8=256/2^24=16777216/2^32=4294967296,地址位寬根據(jù)此進(jìn)行選擇設(shè)定。根據(jù)不同的精度選擇不同的緩存方式:片內(nèi)或片外緩存。

3)處理流程:

首先根據(jù)當(dāng)前來的灰度值做為讀RAM地址,讀出RAM中對(duì)應(yīng)灰度值的的統(tǒng)計(jì)值;

第二步將讀出結(jié)果加一并回寫回RAM的當(dāng)前地址中;

第三步重復(fù)操作至當(dāng)前圖像處理結(jié)束;

第四步下一幅圖像到來之前順序按灰度值從0到最大的順序?qū)⒆罱K結(jié)果讀出;

第五步讀出最終結(jié)果后,將RAM清空。

4)處理細(xì)節(jié)

定義參數(shù)?圖像高度IH 圖像寬度IW?像素逐行輸入,因此以行同步脈沖的上升沿作為統(tǒng)計(jì)開始,行同步脈沖作為行統(tǒng)計(jì)計(jì)數(shù)器,行統(tǒng)計(jì)計(jì)數(shù)器達(dá)到最大高度時(shí),作為統(tǒng)計(jì)結(jié)束標(biāo)志。

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

1.統(tǒng)計(jì)出直方圖,獲取各個(gè)像素灰度累加和;

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

3.直方圖線性拉伸處理

此節(jié)暫時(shí)略過,不太精通,后續(xù)有時(shí)間可以研究再分享一下;

4.線性濾波器

首先需要區(qū)分線性和非線性濾波器的區(qū)別,區(qū)別在于其輸出與輸入之間是否有唯一且確定的函數(shù)傳遞。

線性濾波器分類:

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

銳化濾波器:主要包括SOBEL算子、LAPLAS算子、梯度運(yùn)算等。

濾波器的物理意義主要是響應(yīng)信號(hào)對(duì)目標(biāo)信號(hào)響應(yīng)后的樣子,也就是響應(yīng)函數(shù)g(i,j)?滑過整個(gè)圖像,即對(duì)圖像做一個(gè)卷積處理,就得到了濾波結(jié)果。

1)均值濾波器概述

用一個(gè)圖像區(qū)域的各個(gè)像素的平均值來代替原圖像的各個(gè)像素值,主要作用是減小銳度,減小噪聲。

均值濾波一般出現(xiàn)在圖像處理的預(yù)處理步驟,

預(yù)處理后,根據(jù)噪聲來源,例如針對(duì)椒鹽噪聲做中值濾波處理,針對(duì)高斯噪聲做高斯濾波處理

后續(xù)可能繼續(xù)做邊緣提取等復(fù)雜操作處理。

2)均值濾波器設(shè)計(jì)

設(shè)計(jì)一個(gè)濾波器可以理解成設(shè)計(jì)一個(gè)響應(yīng)函數(shù)g(x,y)=Σi=-rrΣj=-rr?I(x+i,y+j)) / (2r+1)2

數(shù)學(xué)公式很好理解,就是求一個(gè)窗口的所有像素灰度值之后后再除以整個(gè)窗口的面積也就是像素點(diǎn)個(gè)數(shù),求出平均值;

均值濾波的方法將數(shù)據(jù)存儲(chǔ)成3x3的矩陣,然后求這個(gè)矩陣。在圖像上對(duì)目標(biāo)像素給一個(gè)模板,

該模板包括了其周圍的臨近像素(以目標(biāo)像素為中心的周圍 8 個(gè)像素,構(gòu)成一個(gè)濾波模板,即去掉目標(biāo)像素本身),再用模板中的全體像素的平均值來代替原來像素值。


shift_ram 進(jìn)行數(shù)據(jù)矩陣化,將3x3矩陣的中心像素的周圍八個(gè)點(diǎn)求和,采取了流水線的設(shè)計(jì)方法,來增加吞吐量,然后再求平均值代替目標(biāo)像素的值。

3)sobel算子

包括X和Y兩個(gè)方向的兩套3X3矩陣,使其分別和圖像的X和Y方向進(jìn)行卷積計(jì)算(矩陣的卷積計(jì)算即將所有元素做乘加計(jì)算),兩個(gè)方向的卷積結(jié)果求平方根計(jì)算,計(jì)算結(jié)果如果大于閾值則等于0xffff,如果小于閾值則等于0,最終輸出則是圖像的邊緣。

參考代碼如下:由于算子簡(jiǎn)單以及有正負(fù)區(qū)分,因此需要做正值和負(fù)值分別計(jì)算后再進(jìn)行相減計(jì)算。

//    | -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 的負(fù)值之和reg [8:0] gx_data  ,gy_data  ; //最終結(jié)果
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;   endend
//求平方和,調(diào)用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 ;    endend
wire [8:0] squart_out ; altsquart  u1_altsquart (     //例化開平方的ip核    .radical (gxy),    .q       (squart_out),  //輸出的結(jié)果    .remainder()                       );
//與閾值進(jìn)行比較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.非線性濾波器?

非線性濾波器通常下是沒有特定的轉(zhuǎn)移函數(shù),統(tǒng)計(jì)排序?yàn)V波器;

中值濾波?

將 3*3 滑動(dòng)塊中的灰度值進(jìn)行排序,然后用排序的中間值取代 3*3 滑塊中心的值。示意圖如下圖所示。

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

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

第三步:將第二步提取出來的三個(gè)數(shù)進(jìn)行排序,中間值即我們要求的中間值。

? ?6.圖像分割

圖像分割是將圖像劃分成若干個(gè)互不相交的小區(qū)域的過程,將圖像中有意義的特征或應(yīng)用所需要的特征信息提取出來,最終結(jié)果是分割成一些具有某種特征的單元,稱為圖像的基元。

本篇到此結(jié)束,后續(xù)有時(shí)間再更新,歡迎一起交流學(xué)習(xí),共同進(jìn)步!

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
EPM2210F256C5N 1 Altera Corporation Flash PLD, 11.2ns, 1700-Cell, CMOS, PBGA256, 17 X 17 MM, 1 MM PITCH, LEAD FREE, FBGA-256
$423.74 查看
M1A3P250-FG144I 1 Microsemi FPGA & SoC Field Programmable Gate Array, 6144 CLBs, 250000 Gates, 350MHz, 6144-Cell, CMOS, PBGA144, 13X 13 MM, 1.45 MM HEIGHT, 1 MM PITCH, FBGA-144
暫無數(shù)據(jù) 查看
A3P250-FG144 1 Microsemi FPGA & SoC Field Programmable Gate Array, 250000 Gates, CMOS, PBGA144, 1 MM PITCH, FBGA-144
$21.67 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

任何技術(shù)的學(xué)習(xí)就好比一個(gè)江湖,對(duì)于每一位俠客都需要不斷的歷練,從初入江湖的小白到歸隱山林的隱世高人,需要不斷的自我感悟自己修煉,讓我們一起仗劍闖FPGA乃至更大的江湖。