在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于FPGA的圖像邊緣檢測設計

FPGA技術江湖 ? 來源:FPGA技術江湖 ? 2025-02-10 11:30 ? 次閱讀

今天給大俠帶來基于 FPGA 的圖像邊緣檢測設計,話不多說,上貨。

設計流程如下:mif文件的制作→調用 ip 核生成rom以及仿真注意問題→灰度處理→均值濾波:重點是3*3 像素陣列的生成→sobel邊緣檢測→圖片的顯示→結果展示。

一、mif文件的制作

受資源限制,將圖片像素定為 160 * 120,將圖片數據制成 mif 文件,對 rom ip 核進行初始化。mif文件的制作方法網上有好多辦法,因此就不再敘述了,重點說mif文件的格式。 mif文件的格式為:

WIDTH=16 ;    //數據位寬
DEPTH=19200 ;   // rom 深度即圖片像素點的個數
ADDRESS_RADIX=UNS;//地址數據格式
DATA_RADIX=BIN ;   //數據格式
CONTENT
BEGIN
0:1010110011010000;//地址:數據;注意格式要和上面定義的保持統一
1:1010110011010000;
2:1010010010110000;
......
19198:1110011011111001;
19199:1110011011011000;
END;

二、ip 核生成 rom 及仿真時需要注意的問題

ip核生成 rom

1、Tools -> MegaWizard Plug-In Manager

ee3c4c14-e741-11ef-9310-92fbcf53809c.jpg

2、Create a new custom megafuction variation

ee53748e-e741-11ef-9310-92fbcf53809c.png

3、Memory Compier -> ROM -> Verilog HDL -> 自定義名稱

ee5e8fe0-e741-11ef-9310-92fbcf53809c.png

ee6d2d48-e741-11ef-9310-92fbcf53809c.png

ee8659e4-e741-11ef-9310-92fbcf53809c.png

ee9581f8-e741-11ef-9310-92fbcf53809c.png

eea49bca-e741-11ef-9310-92fbcf53809c.png

仿真注意問題:

1、仿真時要注意是否有 altera_mf 庫文件,否則會報錯。 Module 'altsyncram' is not define 解決方案: (1).下載 altera_mf 庫文件; (2).仿真時將 altera_mf.v 與其他文件一起加入到 project 中。 2、要將 .mif 文件放在仿真工程目錄下,即與 .mpf 文件在一起,否則將不會有數據輸出。 三、灰度處理 任何顏色都由紅、綠、藍三原色組成,假如原來某點的顏色為( R,G,B )那么,我們可以通過下面幾種方法,將其轉換為灰度:

浮點算法:Gray=0.299R+0.587G+0.114B

平均值法:Gray=(R+G+B)/3;

僅取單色(如綠色):Gray=G;

將計算出來的Gray值同時賦值給 RGB 三個通道即RGB為(Gray,Gray,Gray),此時顯示的就是灰度圖。通過觀察調色板就能看明了。通過觀察可知,當RGB三個通道的值相同時即為灰色,Gray的值越大,顏色越接近白色,反之越接近黑色(這是我自己的理解,不嚴謹錯誤之處請大神指正)。 這是在線調色板網址,可以進去自己研究一下。

站長工具顏色代碼查詢、RGB顏色值:

http://tool.chinaz.com/tools/selectcolor.aspx

eebfe01a-e741-11ef-9310-92fbcf53809c.png

此次采用是浮點算法來實現灰度圖的,我的圖片數據是RGB565 格式 ,難點: 如何進行浮點運算。思路:先將數據放大,然后再縮小。 例如: Gray=0.299R+0.587G+0.114B轉化為 Gray=(77R+150G+29B)>>8 即可,這里有一個技巧,若 a 為 16 位即 a [15:0],那么 a>>8 與 a [15:8]是一樣的。 核心代碼如下:

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
       red_r1   <= 0 ;  
       green_r1 <= 0 ;
       blue_r1  <= 0 ;
    end
    else begin
       red_r1   <= red   * 77 ;        //放大后的值
       green_r1 <= green * 150;
       blue_r1  <= blue  * 29 ;
    end
end


always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        Gray <= 0;    // 三個數之和
    end
    else begin
        Gray <= red_r1 + green_r1 + blue_r1;        
    end
end


always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
       post_data_in <= 0;  //輸出的灰度數據
    end
    else begin
       post_data_in <= { Gray[13:9], Gray[13:8], Gray[13:9] };//將Gray值賦值給RGB三個通道
    end
end
四、均值濾波 均值濾波的原理 做圖像處理,“把每個像素都用周圍的8個像素來做均值操作 ”, 比如:

eecee6be-e741-11ef-9310-92fbcf53809c.png

圖通常是最能說明問題的東西, 非常明顯的, 這個3*3區域像素的顏色值分別是5,3,6,2,1,9,8,4,7那么中間的1這個像素的過濾后的值就是這些值的平均值, 也就是前面的計算方法:(5+3+6+2+1+9+8+4+7)/9=5 一目了然。那么這個均值濾波有什么用處呢?主要還是平滑圖像的用處, 有的圖像的銳度很高,用這樣的均值算法,可以把銳度降低。使得圖像看上去更加自然,下面就有幾幅圖我們可以看出一些端倪: 原圖:

eee784f8-e741-11ef-9310-92fbcf53809c.jpg

平滑處理后:

eefb6f0e-e741-11ef-9310-92fbcf53809c.jpg

這里還是可以明顯的感覺到不同的, 沒有好壞之分,就是第二幅圖片看上去更為平滑。繼續我們的問題, 那這里均值平滑是否具有去除噪聲的功能呢?我們搞來了椒鹽噪聲(就是隨機的白點,黑點)來試試手:

噪聲圖(5%):

ef075760-e741-11ef-9310-92fbcf53809c.jpg

平滑處理之后:

ef17efee-e741-11ef-9310-92fbcf53809c.jpg

首先這里的噪聲還是比較小的, 只有5%,從均值的效果來看的話, 我可以說幾乎沒有用,其實直觀的想也可以判斷, 因為這里的處理并沒有剔除這些噪聲點, 而只是微弱地降低了噪聲,所以效果可以想見的。最后的時候還是貼上一段處理的代碼:

voidmeanFilter(unsignedchar*corrupted,unsignedchar*smooth,intwidth,intheight)
{


  memcpy ( smooth, corrupted, width*height*sizeof(unsigned char) );


  for (int j=1;j

簡單的從1...width-1來處理, 所以第一個和最后一個像素就簡單的拋掉了, 如果只是簡單的看看效果還是沒有問題的。

如何生成 3*3 的像素陣列。可以利用 ip 核生成移位寄存器 ,方法與 ip 核生成 rom 一樣,詳情見ip 核 生成 rom操作。

ef2688ce-e741-11ef-9310-92fbcf53809c.png

仿真波形如下 row_1 , row_2 , row_3 是指圖像的第一、二、三行的數據,Per_href 是行有效信號(受VGA時序的啟發,從 rom 中讀取數據時設計了行有效和場有效的控制信號,事半功倍,有了利于仿真查錯和數據的控制)。從 3 開始就出現了3*3 的像素陣列,這時候就可以求取周圍 8 個像素點的平均值,進行均值濾波。

ef32ab2c-e741-11ef-9310-92fbcf53809c.png

下面這個圖表示的是FPGA 如何將矩陣數據處理成并行的像素點,可以結合下面的代碼好好理解,這也是精華所在。 正方形紅框框起來的是第一個完整的 3*3 矩陣,長方形紅框框起來的是并行的像素點,在此基礎上就可以求得平均值,進行均值濾波。 從下圖也能看到 3*3 矩陣從左往右滑動。 第一個3*3 陣列。 0 1 2 -- > p11 p12 p13 3 4 5 -- > p21 p22 p23 6 7 8 -- > p31 p32 p33

ef47aefa-e741-11ef-9310-92fbcf53809c.png

核心代碼如下:

reg [5:0]p_11,p_12,p_13;  // 3 * 3 卷積核中的像素點
reg [5:0]p_21,p_22,p_23;
reg [5:0]p_31,p_32,p_33;
reg [8:0]mean_value_add1,mean_value_add2,mean_value_add3;//每一行之和


always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        {p_11,p_12,p_13} <= {5'b0,5'b0,5'b0}   ;
        {p_21,p_22,p_23} <= {15'b0,15'b0,15'b0};
        {p_31,p_32,p_33} <= {15'b0,15'b0,15'b0};
    end
    else  begin
     if(per_href_ff0==1&&flag_do==1)begin
        {p_11,p_12,p_13}<={p_12,p_13,row_1};
        {p_21,p_22,p_23}<={p_22,p_23,row_2};
        {p_31,p_32,p_33}<={p_32,p_33,row_3};
     end
     else begin
         {p_11,p_12,p_13}<={5'b0,5'b0,5'b0};
         {p_21,p_22,p_23}<={5'b0,5'b0,5'b0}
         {p_31,p_32,p_33}<={5'b0,5'b0,5'b0}
     end
   end
end


always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        mean_value_add1<=0;
        mean_value_add2<=0;
        mean_value_add3<=0;
    end
    else if(per_href_ff1)begin
        mean_value_add1<=p_11+p_12+p_13;
        mean_value_add2<=p_21+   0   +p_23;
        mean_value_add3<=p_31+p_32+p_33;
    end
end


wire [8:0]mean_value;//8位數之和
wire [5:0]fin_y_data; //平均數,除以8,相當于左移三位。


assign mean_value=mean_value_add1+mean_value_add2+mean_value_add3;
assign?fin_y_data=mean_value[8:3];?

五、sobel邊緣檢測

邊緣檢測的原理 該算子包含兩組 3x3 的矩陣,分別為橫向及縱向,將之與圖像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。A代表原始圖像的 3*3 像素陣列,Gx及Gy分別代表經橫向及縱向邊緣檢測的圖像,其公式如下:

ef5f8872-e741-11ef-9310-92fbcf53809c.png

圖像的每一個像素的橫向及縱向梯度近似值可用以下的公式結合,來計算梯度的大小。 ef7cd30a-e741-11ef-9310-92fbcf53809c.png? 如果梯度G大于某一閥值則認為該點(x,y)為邊緣點。 用的是邊緣檢測算法。 難點: (1)掌握了 3*3 像素陣列,Gx 與 Gy 就很好計算了。 注意問題:為了避免計算過程中出現負值,所以將正負值分開單獨計算,具體見代碼) (2)G的計算需要開平方,如何進行開平方運算 Quartus ii 提供了開平方 ip 核,因此我們直接調用就好了 。

ef8fa7aa-e741-11ef-9310-92fbcf53809c.jpg

代碼如下:

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

六、圖片的顯示

本來是想用 VGA 來顯示圖片的,由于條件的限制沒能實現,最終只能將處理完的數據輸出保存在 .txt 文件中,然后借助網頁進行顯示。 難點: (1) 如何將數據流輸出保存到 .txt 文件中。 (2) 網頁的使用及注意事項。 在testbench里加入下面所示代碼即可將圖片數據保存到 .txt 文本。

代碼如下:

     integer w_file;  
     initial
     w_file = $fopen("data_out_3.txt");   //保存數據的文件名


     always @(posedge clk or negedge rst_n)  
     begin  
      if(flag_write==1&&post_href==1)//根據自己的需求定義
        $fdisplay(w_file,"%b",post_y_data);   
end

網頁的界面如下,將參數設置好以后就可以顯示圖片。

下載鏈接:

鏈接:https://pan.baidu.com/s/1pwkJHtAxVHWWijSLczH0Ng

提取碼:e87j

efac2362-e741-11ef-9310-92fbcf53809c.png

注意:由于此網站是量身定做的,所以只能顯示數據格式為RGB565的16位二進制的數才能正確顯示,注意不能有分號,正確格式示例如下,必須嚴格遵守。

efba6d78-e741-11ef-9310-92fbcf53809c.png

七、結果展示

efcccc48-e741-11ef-9310-92fbcf53809c.jpg

小結:均值濾波處理后的圖片有明顯的黑邊,產生這一現象的原因就是生成 3*3 像素矩陣和取像素值時數據有損失造成的,但是這也是可以優化的,后續我會繼續努力不斷完善。本次只是簡單對一幅圖像進行邊緣檢測,我的后續目標是實現圖片的實時處理,這又需要學習很多東西了,SDRAM、攝像頭驅動等等等,越學習越發現自己知道的實在是太少了,永遠在路上,學無止境。希望我的分享能夠幫助一些和我一樣熱愛 FPGA 圖像處理的朋友。 efdd8ccc-e741-11ef-9310-92fbcf53809c.png

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1630

    文章

    21804

    瀏覽量

    606547
  • 邊緣檢測
    +關注

    關注

    0

    文章

    93

    瀏覽量

    18250

原文標題:基于 FPGA 的圖像邊緣檢測系統設計(sobel算法)

文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    算法系列:基于 FPGA圖像邊緣檢測系統設計(sobel算法)

    今天給大俠帶來基于 FPGA圖像邊緣檢測設計,話不多說,上貨。 設計流程如下:mif文件的制作→ 調用 ip 核生成rom以及仿真注意問題→ 灰度處理→ 均值濾波:重點是3*3
    發表于 03-26 16:40

    基于FPGA的實時邊緣檢測系統設計,Sobel圖像邊緣檢測FPGA圖像處理

    摘要 :本文設計了一種 基于 FPGA 的實時邊緣檢測系統 ,使用OV5640 攝像頭模塊獲取實時的視頻圖像數據,提取圖像
    發表于 05-24 07:45

    基于FPGA的數字圖像處理中的邊緣檢測系統

    `基于FPGA的數字圖像處理領域的邊緣檢測系統。該系統實現了從24位真彩色圖片的存儲到VGA顯示邊緣信息。`
    發表于 06-26 13:36

    本科生畢設想做基于FPGA圖像邊緣檢測,用Verilog實現。各位大神給些指導意見啊!!!

    現在大四,面臨畢設選題!初步定做基于FPGA圖像處理;之前有接觸過圖像邊緣這方面,但做的很爛!現在想當成畢設來做,大神們有沒有什么指導意見!!!(畢設只是一部分,還是想從中能學到東西
    發表于 11-10 11:22

    本科畢業設計要做FPGA圖像邊緣檢測算法研究,求各位大神告知需要準備哪些知識

    小弟大四,還在準備考研復試,所以畢業設計到現在才開始準備,還是為了在面試時問起畢業設計可以有話說,當然還是想好好準備畢業設計,想好好學點東西。因為我本科是機械專業,所以對FPGA不是特別了解,想知道需要準備哪方面的知識,看哪些書?在線等回復,謝謝各位大神!
    發表于 03-07 18:49

    基于FPGA圖像邊緣檢測系統設計,用VHDL語言實現該怎么做?

    不知道有沒有大神做過:基于FPGA圖像邊緣檢測系統設計,用VHDL語言實現
    發表于 05-10 00:22

    如何利用FPGA實現Laplacian圖像邊緣檢測器的研究?

    圖形處理領域,圖像處理的速度一直是一個很難突破的設計瓶頸。這里通過研究圖像邊緣檢測器的FPGA實現,來探討如何利用
    發表于 07-31 06:38

    FPGA學習案例分享】基于FPGA圖像邊緣檢測例程

    ` 本項目利用MP801開發板,通過攝像頭采集圖像數據,然后在屏幕上顯示兩種圖像:屏幕有一個圓,圓內顯示經過了邊緣處理的圖像,而圓外則顯示原始圖像
    發表于 11-29 09:52

    請問有圖像邊緣檢測的代碼及仿真結果嗎?

    基于FPGA圖像邊緣檢測 的相關代碼和仿真圖 謝謝各位大神。
    發表于 03-31 02:25

    算法系列:基于 FPGA圖像邊緣檢測系統設計(sobel算法)

    發表于 11-22 11:05

    基于FPGA的實時圖像邊緣檢測系統設計(附代碼)

    今天給大俠帶來基于FPGA的實時圖像邊緣檢測系統設計,由于篇幅較長,分三篇。今天帶來第一篇,上篇,話不多說,上貨。 這里也超鏈接了中篇和下篇,方便各位大俠參考學習。基于
    發表于 06-21 18:47

    基于FPGA圖像邊緣檢測

    基于FPGA圖像邊緣檢測 引言     圖像邊緣
    發表于 01-14 11:07 ?1897次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>圖像</b><b class='flag-5'>邊緣</b><b class='flag-5'>檢測</b>

    Prewitt圖像邊緣檢測邊緣細化的FPGA實現

    摘要! 針對實時圖像處理的要求! 使用FPGA圖像數據流進行在線PREWITT邊緣檢測 針對傳 統算法需要人工給定閾值和產生的
    發表于 03-29 16:30 ?46次下載
    Prewitt<b class='flag-5'>圖像</b><b class='flag-5'>邊緣</b><b class='flag-5'>檢測</b>及<b class='flag-5'>邊緣</b>細化的<b class='flag-5'>FPGA</b>實現

    實時圖像邊緣檢測的設計及FPGA實現

    文中將FPGA應用于實時圖像邊緣檢測系統,從而實現動態實時圖像邊緣
    發表于 12-22 17:06 ?39次下載
    實時<b class='flag-5'>圖像</b><b class='flag-5'>邊緣</b><b class='flag-5'>檢測</b>的設計及<b class='flag-5'>FPGA</b>實現

    數字圖像邊緣檢測FPGA實現

    數字圖像邊緣檢測FPGA實現......
    發表于 01-04 15:31 ?18次下載
    主站蜘蛛池模板: 四虎影视亚洲精品 | 97天天干| 特级黄视频 | 日本在线观看一区 | eee在线播放成人免费 | 欧美黑人粗硬大在线看 | 一区二区三区免费视频网站 | 爱爱小视频免费看 | 午夜影院在线观看 | 久久噜国产精品拍拍拍拍 | 欧美成人午夜片一一在线观看 | 全国最大色成免费网站 | 久久草在线免费 | 色婷婷视频在线观看 | 国产精品久久久久国产精品三级 | 色噜噜成人综合网站 | 特级做a爰片毛片免费看一区 | 美女三级在线 | 午夜视频网| 日本不卡在线一区二区三区视频 | ccav在线永久免费看 | 全部免费a级毛片 | 高h道具触手play肉男男 | 国模私拍一区二区三区 | 天天摸天天操天天射 | 亚洲欧美性另类春色 | 奇米欧美成人综合影院 | 免费的黄色大片 | 夜夜嘿视频免费看 | 亚洲天堂资源 | 丁香婷婷亚洲 | 亚洲综合丁香婷婷六月香 | 天天草综合 | 澳门久久 | 免费一级特黄3大片视频 | 97福利视频 | 九色福利 | 午夜免费福利片 | 都市激情综合网 | 国产欧美精品一区二区色综合 | 干干干日日日 |