圖像邊緣檢測

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、邊緣檢測示例

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

<code>BW=edge(img, type, thresh, direction, ‘nothinning’)
/<code>

img:輸入圖像

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

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

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

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

<code>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');
/<code>
圖像邊緣檢測

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

圖像邊緣檢測

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

圖像邊緣檢測


分享到:


相關文章: