本次實驗對二值圖像形態學變換(主要指腐蝕、膨脹操作及其衍生的開操作、閉操作)進行了實現。
本次實驗采用了 python 語言,並主要使用了如下的庫:
tkinter:用於圖形化界面(GUI)的展示;
matplotlib:用於圖像的讀取操作;
PIL:用於將圖像從二維矩陣形式轉換為 tkinter 能識別的形式;
numpy:用於基本的矩陣存儲及運算;
threading:用於實現多線程運算與展示
除了上述提到的內容,實驗的主要內容均為手動實現,如算法等均為使用庫中提供的接口。
本次實驗在圖形化界面的基礎上實現了圖像的讀取、展示、膨脹、腐蝕操作,並且支持手動輸入可變的結構元。
程序入口為 main.py 文件,運行後如下圖所示,程序界面主要由三個按鈕、兩個輸入框和一個展示畫布組成。
Path 對應的輸入框支持圖片路徑的指定,可以輸入 img 目錄下的圖像文件名或相對路徑,亦可輸入絕對路徑來對計算機中的圖像進行讀取;Kernel 對應的輸入框為結構元的設定,每個數值的范圍為 0-255,同一行以英文逗號“,”隔開。
Load image 按鈕為讀取圖像,如果圖像較大,則可能需要一定的時間;erosion 和 dilation 分別對應腐蝕和膨脹操作。
圖 1 程序界面
本次實驗采用 numpy.array 作為圖像的保存形式。首先在進行膨脹和腐蝕操作之前,先對圖像的尺寸做微小的調整,以滿足結構元掃描的需要。為了保證先被掃描到的像素運算後的結果不會影響到之後被掃描的點,我們另開辟了一個二維 array 來儲存處理後的結果。
主要過程是從左到右,從上到下依次掃描與結構元尺寸對應個數的像素點。
在進行腐蝕操作時,將結構元矩陣與原圖的對應部分矩陣相減,並求出結構矩陣種元素的最大值。若為 0,則代表結構元中每個白色的像素點均對應了圖中的白色像素,因而結果中該點為白色,否則為黑色。
在進行膨脹操作時,將結構元矩陣與原圖的對應部分矩陣相加,並求出結構矩陣中元素的最大值。若為 510(用灰度表示,若用二值表示則為 2),則代表結構元對應的白色像素有原圖中的白色與之對應,因此輸出圖像的該點為白色,否則為黑色。
算法輸出
采用的輸入為如左下的圖像,進行二值化處理後如下右圖所示。
圖 2 原圖 圖 3 二值化後的圖像
用 3×3 的全填充結構元進行操作
可以觀察到腐蝕以及開操作後,圖像亮部減少;膨脹以及閉操作後,圖像亮部增多,符合理論預期。
可以觀察到使用 1×5 的結構元進行操作後,輸出圖像中可以明顯觀察到橫條紋理,與理論預期相符。
圖 8 一次腐蝕操作之後的圖像 圖 9 一次膨脹操作之後的圖像
圖 10 一次腐蝕操作之後的圖像 圖 11 一次膨脹操作之後的圖像