您好,登錄后才能下訂單哦!
這篇文章主要介紹了Matlab如何實現圖像邊緣提取,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
什么是圖像邊緣
所謂圖像邊緣(Edlge)是指圖像局部特性的不連續性,例如,灰度級的突變,顏色的突變,紋理結構的突變等。邊緣廣泛存在于目標與目標、物體與背景、區域與區域(含不同色彩)之間,它是圖像分割所依賴的重要特征。
小白今天主要介紹幾種典型的圖像灰度值突變的邊緣檢測方法,其原理也適用用于其他特性突變的邊緣檢測。圖像的邊緣通常與圖像灰度的一階導數的不連續性有關。圖像灰度的不連續性可分為兩類:階躍不連續,即圖像灰度在不連續處的兩邊的像素灰度有明顯的差異。線條不連續,即圖像灰度突然從一個值變化到另一個值,保持一個較小的行程又返回到原來的值。但是在實際中,階躍和線條邊緣圖像是較少見的,由于空間分辨率(尺度空間)、圖像傳感器等原因會使階躍邊緣變成斜坡形邊緣,線條邊緣變成房頂形邊緣。它們的灰度變化不是瞬間的而是跨越一定距離的。幾種邊緣類型,可以通過下面的圖片有個更清晰的認識。
Sobel算子
在前面的關于圖像濾波的講解中,小白為大家介紹了sobel算子模板,但是沒有講解其具體作用。這次的講解中,小白將為大家講解什么是sobel算子。
sobel算子是一階的梯度算子,也就是對信號求取一階導數,對噪聲具有平滑作用,提供較為精確的邊緣方向信息,但是邊緣定位精度不夠高;但是該種方法比較簡單,容易實現,也比較容易理解。
對一個連續函數求導是一件比較容易的事情,但是圖像中的數據都是數字化之后的數據,是離散的,因此對于求導就需要使用差分方式:前面的像素灰度值減去后面像素的灰度值,并將結果大于一定閾值的設為邊緣,否則就不是邊緣。我們用數學公式表示就是:I(x,y)-I(x-n,y)。公式給出的是兩個像素在同一行中,兩個像素也可以在同一列中,而且方向也可以更改。
根據之前的模板來看的話,只有一個維度的求導可以用如下的模板表示:
可以用上面兩個模板分別對原圖像求取橫著和豎著邊緣,之后對兩者求并集,便是圖像整體的邊緣。但是細心的小伙伴肯定會發現,模板之后兩個元素,以哪個元素作為模板的中心呢?為了解決這個問題,研究者將其進行了擴展,變為以下的模板:
模板長度變為奇數便可以解決模板沒有“中心”的問題。后續經過各種演化,最終變為前面幾講中提到的模板的樣子。小伙伴在使用的過程中可以直接使用其模板就可以,而且Matlab也是帶有sobel邊緣提取的函數,不需要小伙伴自己編寫復雜的程序。
常用的sobel邊緣提取模板
Roberts算子
其實很多種算子都借鑒了sobel方法的思想,Roberts算子檢測方法對具有陡峭的低噪聲的圖像處理效果較好,但是利用roberts算子提取邊緣的結果是邊緣比較粗,因此邊緣的定位不是很準確。我們直接給出Roberts算子的模板:
通過模板我們也能看出來,該算法是采用檢測斜著方向的梯度變化來判定圖像的邊緣。
Canny算子
Canny算子是目前邊緣檢測最常用的算法,效果也是最理想的。但是Canny邊緣檢測算法不是簡單的模板卷積而已,通過梯度方向和雙閾值法來檢測邊緣點,具體算法講解,可以通過點擊”原文閱讀“來了解更多:
Canny方法不容易受噪聲干擾,能夠檢測到真正的弱邊緣。優點在于,使用兩種不同的閾值分別檢測強邊緣和弱邊緣,并且當弱邊緣和強邊緣相連時,才將弱邊緣包含在輸出圖像中。
Matlab邊緣提取
Matlab提供多種邊緣檢測方法,通過函數edge(image,'method')來實現圖像的邊緣提取,通過修改參數‘method’來實現不同濾波方法。具體的邊緣檢測代碼如下:
I=imread('lena.bmp');% 提取圖像
I=rgb2gray(I);%將彩色圖轉換灰度圖
BW1=edge(I,'sobel'); %用SOBEL算子進行邊緣檢測
BW2=edge(I,'roberts');%用Roberts算子進行邊緣檢測
BW3=edge(I,'prewitt'); %用prewitt算子進行邊緣檢測
BW4=edge(I,'log'); %用log算子進行邊緣檢測
BW5=edge(I,'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');
將上述代碼復制到Matalb里,把圖像地址改成自己想要提取邊緣的圖像,運行之后便可的得到圖像邊緣。小白在自己的電腦上運行程序的結果如下圖。在程序里也利用其他算子提取了邊緣,方便小伙伴的對比。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Matlab如何實現圖像邊緣提取”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。