FPGA實現圖像的邊緣檢測:灰度形態學梯度


  前幾篇博客介紹了二值圖像的形態學圖像處理,本篇博客整理一下灰度形態學的相關圖像處理,最后實現基於灰度形態學梯度的邊緣檢測效果。

 

一、腐蝕(Erode)

  灰度形態學腐蝕,即求局部最小值。以 3x3 模板為例,即找出該模板的最小值作為輸出即可。

  通過灰度形態學腐蝕,圖像中的高亮區域被腐蝕掉了,類似於“領域被蠶食”。可以預見的是腐蝕過后的圖像將會擁有比原圖更小的高亮區域,亮度會有所下降。同時,腐蝕操作還會連通相鄰的比較暗的區域。這無疑對小尺寸的高亮區域識別是有益的。

  Verilog代碼類似中值濾波,sort是一個排序模塊,在中值濾波的博客中已經給出。

//==========================================================================
//==    腐蝕,求出局部最小值
//==========================================================================
//每行像素降序排列,clk1
//---------------------------------------------------
//第1行
sort u1
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (matrix_11              ), 
    .data2                  (matrix_12              ), 
    .data3                  (matrix_13              ),
    .max_data               (max_data1              ),
    .mid_data               (mid_data1              ),
    .min_data               (min_data1              )
);

//第2行
sort u2
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (matrix_21              ),
    .data2                  (matrix_22              ),
    .data3                  (matrix_23              ),
    .max_data               (max_data2              ),
    .mid_data               (mid_data2              ),
    .min_data               (min_data2              )
);

//第3行
sort u3
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (matrix_31              ),
    .data2                  (matrix_32              ),
    .data3                  (matrix_33              ),
    .max_data               (max_data3              ),
    .mid_data               (mid_data3              ),
    .min_data               (min_data3              )
);

//三行的最小值取最小值,clk2
//---------------------------------------------------
//min-max
sort u4
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (min_data1              ),
    .data2                  (min_data2              ),
    .data3                  (min_data3              ),
    .max_data               (                       ),
    .mid_data               (                       ),
    .min_data               (min_min_data           )
);

assign erode_data = min_min_data;

 

二、膨脹(Dilate)

  灰度形態學膨脹,即求局部最大值。以 3x3 模板為例,即找出該模板的最大值作為輸出即可。

  通過灰度形態學膨脹,圖像中的高亮區域逐漸增長,類似於“領域擴展”。可以預見的是膨脹過后的圖像將會擁有比原圖更大的高亮區域,亮度會有所增加。同時,腐蝕操作還會連通相鄰的比較亮的區域。通過膨脹我們可以將圖像中的裂縫得以填補。例如,破鏡子照片通過膨脹可以恢復出完整的樣子。

  Verilog代碼類似中值濾波,sort是一個排序模塊,在中值濾波的博客中已經給出。

//==========================================================================
//==    腐蝕,求出局部最大值
//==========================================================================
//每行像素降序排列,clk1
//---------------------------------------------------
//第1行
sort u1
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (matrix_11              ), 
    .data2                  (matrix_12              ), 
    .data3                  (matrix_13              ),
    .max_data               (max_data1              ),
    .mid_data               (mid_data1              ),
    .min_data               (min_data1              )
);

//第2行
sort u2
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (matrix_21              ),
    .data2                  (matrix_22              ),
    .data3                  (matrix_23              ),
    .max_data               (max_data2              ),
    .mid_data               (mid_data2              ),
    .min_data               (min_data2              )
);

//第3行
sort u3
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (matrix_31              ),
    .data2                  (matrix_32              ),
    .data3                  (matrix_33              ),
    .max_data               (max_data3              ),
    .mid_data               (mid_data3              ),
    .min_data               (min_data3              )
);

//三行的最大值取最大值,clk2
//---------------------------------------------------
//min-max
sort u4
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (max_data1              ),
    .data2                  (max_data2              ),
    .data3                  (max_data3              ),
    .max_data               (max_max_data           ),
    .mid_data               (                       ),
    .min_data               (                       )
);

assign dilate_data = max_max_data;

 

三、開運算(Open)和閉運算(Close)

  和二值形態學的開閉運算完全一樣。

  開運算:先腐蝕后膨脹。常用於去除較小的高灰度區域,圖像的整體灰度基本保持不變。

  閉運算:先膨脹后腐蝕。常用於去除圖像中的暗細節部分,相對地保留高灰度部分不受影響。

 

四、頂帽變換(top-hat)和底帽變換(bottom-hat)

  二者都常用於處理光照不均的圖像。

  頂帽變換:原圖像 - 開運算。用於暗背景上的亮物體,又稱為白頂帽變換。

  底帽變換:閉運算 - 原圖像。用於亮背景上的暗物體,又稱為黑底帽變換。

 

五、灰度形態學梯度(Morphological Gradient)

  灰度形態學梯度,即:膨脹 - 腐蝕。

  膨脹粗化一幅圖像中的區域, 而腐蝕則細化它們。膨脹和腐蝕的差強調了區域間的邊界。同質區域不受影響(只要SE相對較小),因此相減操作趨於消除同質區域。最終結果是是邊緣被增強而同質區域的貢獻被抑制掉了的圖像,從而產生“類似於微分”(梯度)的效果。

assign data = dilate_data - erode_data;

  灰度形態學梯度最后呈現的效果類似邊緣檢測,比較酷炫。

   這種邊緣檢測效果具有層次感,但線條略暗。截圖看起來很普通,實際視頻效果是非常驚艷的。

 

 參考資料:

[1] OpenS Lee:FPGA開源工作室(公眾號)

[2] Rafael C.Gonzalez、Richard E.Woods著,阮秋琦、阮宇智等譯.數字圖像處理(第三版).電子工業出版社.2013.

[3] 牟新剛、周曉、鄭曉亮.基於FPGA的數字圖像處理原理及應用[M]. 電子工業出版社,2017.

[4] 張錚, 王艷平, 薛桂香. 數字圖像處理與機器視覺[M]. 人民郵電出版社, 2010.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM