形態學濾波最基本的兩個形態學操作是腐蝕和膨脹,其他的高級形態學操作是基於這兩個基本的形態學操作進行的,比如開運算、閉運算、形態學梯度、頂帽、黑帽等。
需要注意的是,在Matlab中,亮值是目標物,暗值是背景點。
先上結果:
代碼:
%% 形態學去噪 P = imread('cameraman.jpg'); I = imnoise(P, 'salt & pepper', 0.05); SE = strel('disk', 1); J1 = imerode(I, SE); J1 = imerode(J1, SE); J2 = imdilate(J1, SE); J2 = imdilate(J2, SE); J2 = imdilate(J2, SE); J2 = imdilate(J2, SE); J3 = imerode(J2, SE); J3 = imerode(J3, SE); figure; subplot(2,3,1), imshow(P), title("原圖"); subplot(2,3,2), imshow(I), title("椒鹽噪聲"); subplot(2,3,3), imshow(J1), title("腐蝕兩次"); subplot(2,3,4), imshow(J2), title("膨脹兩次"); subplot(2,3,5), imshow(J3), title("膨脹兩次"); subplot(2,3,6), imshow(J4), title("腐蝕兩次"); %% 另一種方式 J1 = imclose(I, SE); J2 = imopen(J1, SE); J3 = imclose(J2, SE); J4 = imopen(J3, SE); figure; subplot(2,3,1), imshow(P), title("原圖"); subplot(2,3,2), imshow(I), title("椒鹽噪聲"); subplot(2,3,3), imshow(J1), title("閉運算"); subplot(2,3,4), imshow(J2), title("開運算"); subplot(2,3,5), imshow(J2), title("閉運算"); subplot(2,3,6), imshow(J4), title("開運算"); %% 中值濾波對比 m = medfilter(I, 3); figure; subplot(1,3,1), imshow(P), title("原圖"); subplot(1,3,2), imshow(I), title("椒鹽噪聲"); subplot(1,3,3), imshow(m), title("中值濾波");
中值濾波的函數可以參考 Matlab-代碼實現圖像平滑去噪 這一篇文章。
通過先腐蝕膨脹后膨脹腐蝕的方式可以實現先消除白點再消除黑點。也可以通過閉運算再開運算的方式消除椒鹽噪聲。形態學濾波的形式多種多樣。
就結果而言,形態學濾波和中值濾波在處理椒鹽噪聲上的效果是近似的,在細節方面形態學濾波遜於中值濾波,因為形態學濾波只能夠使圖像總的位置和形狀不變,在進行腐蝕和膨脹的時候會造成較多的信息丟失,而中值濾波相對損失較少的信息。
就過程而言,形態學濾波需要嘗試結構元素的現狀和大小、腐蝕和膨脹的先后順序和開運算閉運算的順序,過程比較復雜,而中值濾波較為簡單。