基於MATLAB邊緣檢測算子的實現


基於MATLAB邊緣檢測算子的實現

作者:lee神

  1. 1.   概述

邊緣檢測是圖像處理計算機視覺中的基本問題,邊緣檢測的目的是標識數字圖像中亮度變化明顯的點。圖像屬性中的顯著變化通常反映了屬性的重要事件和變化。 這些包括(i)深度上的不連續、(ii)表面方向不連續、(iii)物質屬性變化和(iv)場景照明變化。 邊緣檢測是圖像處理和計算機視覺中,尤其是特征提取中的一個研究領域。

一階:  Roberts Cross算子,Prewitt算子,Sobel算子, Kirsch算子,羅盤算子;

二階: Marr-Hildreth,在梯度方向的二階導數過零點,Canny算子,Laplacian算子。

  1. 2.   經典邊緣檢測算子的簡介

Roberts算子,又稱羅伯茨算子,是一種最簡單的算子,是一種利用局部差分算子尋找邊緣的算子。他采用對角線方向相鄰兩象素之差近似梯度幅值檢測邊緣。檢測垂直邊緣的效果好於斜向邊緣,定位精度高,對噪聲敏感,無法抑制噪聲的影響。

Prewitt算子是一種一階微分算子邊緣檢測,利用像素點上下、左右鄰點的灰度差,在邊緣處達到極值檢測邊緣,去掉部分偽邊緣,對噪聲具有平滑作用 。其原理是在圖像空間利用兩個方向模板與圖像進行鄰域卷積來完成的,這兩個方向模板一個檢測水平邊緣,一個檢測垂直邊緣。

對數字圖像f(x,y),Prewitt算子的定義如下:

G(i)={[f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)]-[f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)]}

G(j)={[f(i-1,j+1)+f(i,j+1)+f(i+1,j+1)]-[f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)]}

則 P(i,j)=max[G(i),G(j)]或 P(i,j)=G(i)+G(j)

  Sobel算法是像素圖像邊緣檢測中最重要的算子之一,在機器學習、數字媒體、計算機視覺等信息科技領域起着舉足輕重的作用。在技術上,它是一個離散的一階差分算子,用來計算圖像亮度函數的一階梯度之近似值。在圖像的任何一點使用此算子,將會產生該點對應的梯度矢量或是其法矢量。

Laplacian 算子是n維歐幾里德空間中的一個二階微分算子,定義為梯度grad的散度div。可使用運算模板來運算這定理定律。

函數的拉普拉斯算子也是該函數的黑塞矩陣的跡,可以證明,它具有各向同性,即與坐標軸方向無關,坐標軸旋轉后梯度結果不變。如果鄰域系統是4 鄰域,Laplacian 算子的模板為:

0

1

0

1

-4

1

0

1

0

 

 

4鄰域Laplacian 算子

 

 

 

如果鄰域系統是8 鄰域,Laplacian 算子的模板為:

1

1

1

1

-8

1

1

1

1

 

 

8 鄰域Laplacian 算子

 

 

前面提過,Laplacian 算子對噪聲比較敏感,所以圖像一般先經過平滑處理,因為平滑處理也是用模板進行的,所以,通常的分割算法都是把Laplacian 算子和平滑算子結合起來生成一個新的模板。

  1. 3.   MATLAB實現方法一

實驗原圖:

 

使用Matlab內部函數edge實現邊緣檢測算法:

I=imread('lena.jpg');%提取圖像

img=rgb2gray(I);

[m,n]=size(img);

BW1=edge(img,'sobel'); %用Sobel算子進行邊緣檢測

BW2=edge(img,'roberts');%用Roberts算子進行邊緣檢測

BW3=edge(img,'prewitt'); %用Prewitt算子進行邊緣檢測

BW4=edge(img,'log'); %用Log算子進行邊緣檢測

BW5=edge(img,'canny'); %用Canny算子進行邊緣檢測

h=fspecial('gaussian',5);%¸高斯濾波

BW6=edge(img,'canny');%高斯濾波后使用Canny算子進行邊緣檢測

subplot(2,3,1), imshow(BW1);

title('sobel edge check');

subplot(2,3,2), imshow(BW2);

title('roberts edge check');

subplot(2,3,3), imshow(BW3);

title('prewitt edge check');

subplot(2,3,4), imshow(BW4);

title('log edge check');

subplot(2,3,5), imshow(BW5);

title('canny edge check');

subplot(2,3,6), imshow(BW6);

title('gasussian&canny edge check');

實現結果:

 

  1. 4.   方法二

實驗原圖

 

1)Laplacian 算子的實現:

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算子的處理結果')

實現結果:

 

2)Prewitt 算子的實現:

clear;

sourcePic=imread('lena.jpg');

grayPic=mat2gray(sourcePic);

[m,n]=size(grayPic);

newGrayPic=grayPic;

PrewittNum=0;

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算子的處理結果')

實現結果:

 

3)Sobel 算子的實現:

clear;

sourcePic=imread('lena.jpg');

grayPic=mat2gray(sourcePic);

[m,n]=size(grayPic);

newGrayPic=grayPic;

sobelNum=0;

sobelThreshold=0.7;

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算子的處理結果')

實現結果:

 

5)Roberts 算子的實現:

clear all;

clc;

sourcePic=imread('lena.jpg');

grayPic=mat2gray(sourcePic);

[m,n]=size(grayPic);

newGrayPic=grayPic;

robertsNum=0;

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. 5.   引用文檔

1-------------------------------------------------------------------百度百科

 

 

歡迎大家關注我的微信公眾號FPGA開源工作室以及QQ群。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM