前幾篇博客介紹了二值圖像的形態學圖像處理,本篇博客整理一下灰度形態學的相關圖像處理,最后實現基於灰度形態學梯度的邊緣檢測效果。
一、腐蝕(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.