影象邊緣檢測經典運算元及MATLAB實現
阿新 • • 發佈:2019-01-09
一、邊緣檢測
邊緣是圖象最基本的特徵. 邊緣檢測在計算機視覺、圖象分析等應用中起著重要的作用,是圖象分析與識別的重要環節,這是因為子圖象的邊緣包含了用於識別的有用資訊. 所以邊緣檢測是影象分析和模式識別的主要特徵提取手段。所謂邊緣是指其周圍畫素灰度後階變化或屋頂狀變化的那些畫素的集合,它存在於目標與背景、目標與目標、區域與區域,基元與基元之間。 因此它是圖象分割所依賴的重要的特徵,也是紋理特徵的重要資訊源和形狀特徵的基礎;而圖象的紋理形狀特徵的提取又常常依賴於圖象分割。 圖象的邊緣提取也是圖象匹配的基礎,因為它是位置的標誌,對灰度的變化不敏感,它可作為匹配的特徵點。
二、邊緣檢測經典運算元及實現
目前常用的邊緣檢測方法有:Roberts邊緣檢測運算元、Sobel邊緣檢測運算元、Prewitt邊緣檢測運算元、Laplace邊緣檢測運算元等等。
1、Roberts邊緣檢測運算元
Roberts邊緣檢測運算元根據任意一對互相垂直方向上的差分可用來計算梯度的原理,採用對角線方向相鄰兩畫素之差。
MATLAB實驗程式碼如下:
clear;
sourcePic=imread('lena.jpg'); %讀取原影象
grayPic=mat2gray(sourcePic); %實現影象矩陣的歸一化操作
[m,n]=size(grayPic);
newGrayPic=grayPic;%為保留影象的邊緣一個畫素
robertsNum=0; %經roberts運算元計算得到的每個畫素的值
robertThreshold=0.2; %設定閾值
for j=1:m-1 %進行邊界提取
for k=1:n-1
robertsNum = abs(grayPic(j,k)-grayPic(j+1,k+1)) + abs(grayPic(j+1,k)-grayPic(j,k+1));
if(robertsNum > robertThreshold)
newGrayPic(j,k)=255;
else
newGrayPic(j ,k)=0;
end
end
end
figure,imshow(newGrayPic);
title('roberts運算元的處理結果')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
實驗結果:
2、Sobel邊緣檢測運算元
對數字影象的每個畫素,考察它上、下、左、右鄰點灰度的加權差,與之接近的鄰點的權大。
MATLAB實驗程式碼如下:
clear;
sourcePic=imread('lena.jpg');%讀取原影象
grayPic=mat2gray(sourcePic);%實現影象矩陣的歸一化操作
[m,n]=size(grayPic);
newGrayPic=grayPic;%為保留影象的邊緣一個畫素
sobelNum=0;%經sobel運算元計算得到的每個畫素的值
sobelThreshold=0.8;%設定閾值
for j=2:m-1 %進行邊界提取
for k=2:n-1
sobelNum=abs(grayPic(j-1,k+1)+2*grayPic(j,k+1)+grayPic(j+1,k+1)-grayPic(j-1,k-1)-2*grayPic(j,k-1)-grayPic(j+1,k-1))+abs(grayPic(j-1,k-1)+2*grayPic(j-1,k)+grayPic(j-1,k+1)-grayPic(j+1,k-1)-2*grayPic(j+1,k)-grayPic(j+1,k+1));
if(sobelNum > sobelThreshold)
newGrayPic(j,k)=255;
else
newGrayPic(j,k)=0;
end
end
end
figure,imshow(newGrayPic);
title('Sobel運算元的處理結果')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
實驗結果:
3、Prewitt邊緣檢測運算元
Prewitt運算元是一種邊緣樣板運算元。這些運算元樣板由理想的邊緣子影象構成。依次用邊緣樣板去檢測影象,與被檢測區域最為相似的樣板給出最大值。
MATLAB實驗程式碼
clear;
sourcePic=imread('lena.jpg');%讀取原影象
grayPic=mat2gray(sourcePic);%實現影象矩陣的歸一化操作
[m,n]=size(grayPic);
newGrayPic=grayPic;%為保留影象的邊緣一個畫素
PrewittNum=0;%經Prewitt運算元計算得到的每個畫素的值
PrewittThreshold=0.5;%設定閾值
for j=2:m-1 %進行邊界提取
for k=2:n-1
PrewittNum=abs(grayPic(j-1,k+1)-grayPic(j+1,k+1)+grayPic(j-1,k)-grayPic(j+1,k)+grayPic(j-1,k-1)-grayPic(j+1,k-1))+abs(grayPic(j-1,k+1)+grayPic(j,k+1)+grayPic(j+1,k+1)-grayPic(j-1,k-1)-grayPic(j,k-1)-grayPic(j+1,k-1));
if(PrewittNum > PrewittThreshold)
newGrayPic(j,k)=255;
else
newGrayPic(j,k)=0;
end
end
end
figure,imshow(newGrayPic);
title('Prewitt運算元的處理結果')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
實驗結果
4、Laplace邊緣檢測運算元
Laplacian 運算元是n維歐幾里德空間中的一個二階微分運算元。
MATLAB實驗程式碼
clear;
sourcePic=imread('lena.jpg');%讀取原影象
grayPic=mat2gray(sourcePic);%實現影象矩陣的歸一化操作
[m,n]=size(grayPic);
newGrayPic=grayPic;%為保留影象的邊緣一個畫素
LaplacianNum=0;%經Laplacian運算元計算得到的每個畫素的值
LaplacianThreshold=0.2;%設定閾值
for j=2:m-1 %進行邊界提取
for k=2:n-1
LaplacianNum=abs(4*grayPic(j,k)-grayPic(j-1,k)-grayPic(j+1,k)-grayPic(j,k+1)-grayPic(j,k-1));
if(LaplacianNum > LaplacianThreshold)
newGrayPic(j,k)=255;
else
newGrayPic(j,k)=0;
end
end
end
figure,imshow(newGrayPic);
title('Laplacian運算元的處理結果')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
實驗結果