數字影象處理實驗三 影象輪廓提取與邊緣檢測
實驗三 影象輪廓提取與邊緣檢測
一、實驗目的:
理解並掌握對二值影象進行輪廓提取的相關演算法(比如,掏空內部點法),以及用於影象邊緣檢測和提取的典型微分運算元(梯度運算元和拉普拉斯運算元)。
二、實驗環境:
計算機、Windows XP作業系統,Matlab7.0
二、實驗內容:
1、根據掏空內部點演算法,運用Matlab程式設計實現二值影象的輪廓提取。
%以下適用於黑色背景白色前景的二值影象輪廓提取(以二值影象circles為例)
BW=imread('circles.png'); %二值影象circles是uint8,0黑,255白
subplot(1,2,1); imshow(BW); title('
[M, N]=size(BW); %M行,N列
BW_Buffer=BW;
for i=2: M-1
for j=2: N-1
if (BW(i, j)==255 & BW(i-1, j)==255 & BW(i+1, j)==255 & BW(i, j-1)==255 & BW(i, j+1)==255 & BW(i-1, j-1)==255 & BW(i-1, j+1)==255 & BW(i+1, j-1)==255 & BW(i+1, j+1)==255) %說明BW(i,
j)是前景中的一個內部點
BW_Buffer(i, j)=0; %掏空該內部點,即將該內部點置成與背景相同灰度
end
end
end
subplot(1,2,2); imshow(BW_Buffer); title('提取輪廓');
%以下適用於白色背景黑色前景的二值影象輪廓提取(以二值影象source為例)
BW=imread('source.bmp'); %二值影象source是uint8,0黑,255白
subplot(1,2,1); imshow(BW); title('二值影象');
[M, N]=size(BW); %M行,N列
BW_Buffer=BW;
for i=2: M-1
for j=2: N-1
if (BW(i, j)==0 & BW(i-1, j)==0 & BW(i+1, j)==0 & BW(i, j-1)==0 & BW(i, j+1)==0 & BW(i-1, j-1)==0 & BW(i-1, j+1)==0 & BW(i+1, j-1)==0 & BW(i+1, j+1)==0) %說明BW(i, j)是前景中的一個內部點
BW_Buffer(i, j)=255; %掏空該內部點,即將該內部點置成與背景相同灰度
end
end
end
subplot(1,2,2); imshow(BW_Buffer); title('提取輪廓');
注意:使用掏空內部點的方法來提取二值影象的輪廓時,不能直接在原始二值影象矩陣上判斷一個點掏空一個點,否則對前面畫素的掏空操作會影響到對後面畫素的判斷結果。
解決方法:建立原始二值影象矩陣的副本(即影象矩陣BW_Buffer),在原始二值影象矩陣上執行判斷操作,即依次判斷每個畫素點是否為前景中的內部點,如果是,則在影象矩陣BW_Buffer上執行掏空內部點的操作。
2、以灰度影象rice和cameraman為例,利用Matlab影象處理工具箱中的edge函式,分別使用Roberts 運算元、Sobel運算元、Prewitt 運算元對其進行邊緣檢測。
(1)函式格式: BW = edge(I, 'method', thresh)
(2)格式說明:edge函式輸入灰度影象矩陣I,輸出二值影象矩陣BW;引數'method'用於指定所使用的邊緣檢測運算元,可以是'roberts'、'sobel'、'prewitt'、'log'、'canny';引數thresh用於指定梯度門限值(也稱梯度閾值),影象中梯度值大於等於門限值thresh的畫素用白色(1)表示,說明這些地方對應邊緣,梯度值小於門限值thresh的畫素用黑色(0)表示(edge function will ignore all edges that are not stronger than thresh)。若不指定引數thresh,則edge函式會自動選擇閾值。所以edge函式最終將原始灰度影象中的邊緣和背景用二值影象的形式展現出來,以突出邊緣的位置,達到邊緣檢測的目的。
(3)程式如下:
I=imread('rice.png');
subplot(2,2,1); imshow(I); title('原始影象');
[BW1,thresh1]=edge(I,'roberts'); %進行Roberts運算元邊緣檢測並返回門限值
[BW2,thresh2]=edge(I,'sobel'); %進行Sobel運算元邊緣檢測並返回門限值
[BW3,thresh3]=edge(I,'prewitt'); %進行Prewitt運算元邊緣檢測並返回門限值
subplot(2,2,2); imshow(BW1); title('Roberts運算元邊緣檢測結果');
subplot(2,2,3); imshow(BW2); title('Sobel運算元邊緣檢測結果');
subplot(2,2,4); imshow(BW3); title('Prewitt運算元邊緣檢測結果');
若向原始影象中加入隨機噪聲(比如高斯噪聲),之後再對噪聲影象分別運用Roberts 運算元、Sobel運算元、Prewitt 運算元、Log運算元(高斯-拉普拉斯運算元)進行邊緣檢測,觀察檢測結果,試比較4種邊緣檢測運算元的抗噪聲干擾能力。
I=imread('rice.png');
subplot(2,3,1); imshow(I); title('原始影象');
G=imnoise(I, 'gaussian'); %向原始影象中加入高斯噪聲
subplot(2,3,2); imshow(G); title('噪聲影象');
BW1=edge(G, 'roberts'); %進行Roberts運算元邊緣檢測
BW2=edge(G, 'sobel'); %進行Sobel運算元邊緣檢測
BW3=edge(G, 'prewitt'); %進行Prewitt運算元邊緣檢測
BW4=edge(G, 'log'); %進行Log運算元邊緣檢測
subplot(2,3,3); imshow(BW1); title('Roberts運算元邊緣檢測結果');
subplot(2,3,4); imshow(BW2); title('Sobel運算元邊緣檢測結果');
subplot(2,3,5); imshow(BW3); title('Prewitt運算元邊緣檢測結果');
subplot(2,3,6); imshow(BW4); title('Log運算元邊緣檢測結果');