圖像邊緣檢測

1、原理

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

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

邊緣檢測能夠大幅度的減小數據量,剔除那些不相關的信息,保留圖像重要的結構屬性,通常的邊緣檢測的步驟有:spa

原始圖像-->平滑圖像-->銳化圖像-->邊緣斷定-->二值化-->邊緣鏈接-->邊緣圖像.net

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

2)     銳化濾波:爲了檢測邊界,須要肯定鄰域中灰度變換,銳化突出了回答變換的區域。htm

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

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

2、邊緣檢測算子

2.1梯度算子文檔

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

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算法由於先作了低通濾波能夠獲得比較清晰的邊緣。

四、參考文檔

一、邊緣檢測

http://www.javashuo.com/article/p-xggzfriv-bm.html

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

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

 

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

http://www.javashuo.com/article/p-xdfzhkny-b.html

相關文章
相關標籤/搜索