圖像邊緣檢測


1、原理

圖像的邊緣是圖像的基本特征,邊緣點是灰度階躍變化的像素點,即灰度值的導數較大或極大的地方,邊緣檢測是圖像識別的第一步。

用圖像的一階微分和二階微分來增強圖像,本質上計算的就是灰度的變化情況,而邊緣也就是灰度變化的地方。因此,這些傳統的一階微分算子如Robert、Sobel、prewitt等,以及二階微分算子Laplacian等等本質上都是可以用於檢測邊緣的。這些算子都可以稱為邊緣檢測算子。

邊緣檢測可以大幅度的減少數據量,剔除那些不相關的信息,保留圖像重要的結構屬性,一般的邊緣檢測的步驟有:

原始圖像-->平滑圖像-->銳化圖像-->邊緣判定-->二值化-->邊緣連接-->邊緣圖像

1)     平滑濾波:因為梯度計算容易受噪聲影響,所以先使用濾波平滑圖像去除噪聲。

2)     銳化濾波:為了檢測邊界,需要確定鄰域中灰度變化,銳化突出了灰度變化的區域。

3)     邊緣判定:通過閾值或灰度變換,剔除某些處理點,查找邊緣點。

4)     邊緣連接:將間斷的邊緣連接成有意義的完整邊緣,同時去除假邊緣。

2、邊緣檢測算子

2.1梯度算子

Robert算子利用局部差分算子尋找邊緣,邊緣定位精度較高但容易丟失一部分邊緣,同時由於沒有對圖像進行平滑處理因此不具備抑制噪聲的能力。該算子對邊緣陡峭且噪聲較少的圖像效果較好。

Sobel算子和prewitt算子都考慮了鄰域信息,相當於對圖像先做加權平滑處理,然后再做微分運算,所以對噪聲有一定的抑制能力,但不排除檢測結果中出現虛假邊緣,並且容易出現多像素寬度的邊緣。

2.2高斯-拉普拉斯算子

拉普拉斯算子是二階微分算子,對噪聲敏感,Laplace算子對孤立象素的響應要比對邊緣或線的響應要更強烈,因此只適用於無噪聲圖象。存在噪聲情況下,使用Laplacian算子檢測邊緣之前需要先進行低通濾波。高斯-拉普拉斯算子,又稱LoG算子,就是為了補充這種缺陷被創立的,它先進行高斯低通濾波,然后再進行拉普拉斯二階微分銳化。

2.3 Canny邊緣檢測算子

在圖像邊緣檢測中,抑制噪聲和邊緣精准定位是無法同時滿足的,一些邊緣檢測算法通過平滑濾波去除噪聲的同時,也增加了邊緣檢測的不確定性,而提高邊緣檢測算子對邊緣的敏感性的同時,也提高了對噪聲的敏感性。Canny算子力圖在抗噪聲干擾和精准定位之間尋求最佳折中方案。

Canny算法主要有4個步驟:

  • 用高斯濾波器來平滑圖像;
  • 用一介偏導的有限差分來計算梯度的幅值和方向;
  • 對梯度進行非極大值抑制,保留極大值,抑制其他值;
  • 用雙閾值算法檢測和連接邊緣。

3、邊緣檢測示例

基於梯度的算子邊緣檢測:

BW=edge(img, type, thresh, direction, ‘nothinning’)

img:輸入圖像

type:算子類型,有sobel,Prwitt,roberts,log, canny

thresh:敏感度閾值,灰度低於此閾值的邊緣不會被檢測到,默認是空矩陣,自動計算閾值。

direction:指定感興趣的邊緣方向,horizontal,vertical,both

最后一個可選參數,thinning會進行邊緣細化,不填就會跳過該步驟

imgPath = 'E:\opencv_pic\src_pic\pic7.bmp';
img = imread(imgPath);
Img=rgb2gray(img);
 
Img_canny = edge(Img,'canny');  %canny
Img_roberts = edge(Img,'roberts');  %reberts
Img_prewitt = edge(Img,'prewitt');  %prewitt
Img_sobel=edge(Img,'sobel');  %sobel
Img_log=edge(Img,'log');  %log
subplot(2,3,1),imshow(Img), title('原始圖像');
subplot(2,3,2),imshow(Img_canny), title('Img canny');
subplot(2,3,3),imshow(Img_roberts),title('Img roberts');
subplot(2,3,4),imshow(Img_prewitt),title('Img prewitt');
subplot(2,3,5),imshow(Img_sobel),title('Img sobel');
subplot(2,3,6),imshow(Img_log),title('Img LoG');

放大觀察,candy效果最優,Log次之。Log算子檢測邊緣的結果要比roberts和sobel算子好些,邊緣比較完整,抗噪能力較好。roberts、pewitt、sobel算子模板相對較大、抑制了噪聲,但也去掉了部分邊緣,導致定位精度不高。

如果圖形有噪聲,img = imnoise(img,'salt & pepper', 0.03),對原始圖上添加些椒鹽噪聲。再次計算結果如下,只有canny和LoG算法因為先做了低通濾波可以得到比較清晰的邊緣。

4、參考文檔

1、邊緣檢測

https://www.cnblogs.com/pacino12134/p/11340947.html

2、圖像邊緣檢測——二階微分算子(上)Laplace算子、LOG算子、DOG算子

https://blog.csdn.net/u014485485/article/details/78364573

 

 尊重原創技術文章,轉載請注明。

https://www.cnblogs.com/pingwen/p/12285708.html


免責聲明!

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



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