canny邊緣檢測2

2021-06-08 16:10:03 字數 3329 閱讀 1611

canny邊緣檢測的實現大致有4步:

1.高斯濾波對影象去噪。

2.由原始灰度圖求出縱橫2個梯度圖,以及綜合梯度圖(求梯度的運算元很多)。

3.結合3個梯度圖來進行非極大抑制(此步一過,檢測的影象邊緣已經很細了)。

4.進行邊緣連線(個人感覺這一步雖叫連線,演算法也確實體現了連線的行為,但那是強邊緣到弱邊緣的連線,所有可能連線的點都出不了非極大抑制後的範圍,所以這一步更準確的目的應該是在非極大抑制的結果中去除假邊緣保留真邊緣,同時又能讓保留的邊緣盡量連貫真實)

5.對邊緣進行細化(這步在matlab的canny演算法中有,但是考慮到通過以上4步尤其是第3步得到的邊緣已經很細,一般沒有再對邊緣進行細化的必要,因此,此步可以省略)

上述4步中,前兩步比較簡單,實現的關鍵在於後兩步。這裡對第二步也概括的說一下,求縱橫梯度的運算元是很多的,像3×3的sobel運算元,其卷積核是 [1,0,-1;1,0,-1;1,0,-1]和[1,1,1;0,0,0;-1,-1,-1];2×2的robert運算元,其卷積核是 [1,-1;1,-1]和[1,1;-1,-1]。而我們學習matlab中canny檢測的演算法,在第一步濾波和第二步求縱橫梯度時用的都是高斯模版。注意,濾波的模版係數之和為1,求梯度的模版係數之和為0,這是卷積模版的乙個規律。我們濾波和求梯度的模版都是二維的高斯模版,但是用縱橫2次兩個一維的高斯卷積模版進行卷積可以達到和乙個二維模版一樣的效果,同時減小了總計算量,所以,在第一步濾波的時候我們用兩個一維高斯模版代替乙個二維高斯模版,但是第二步的高斯模版牽扯到梯度方向,所以還是用乙個二維的高斯模版來直接卷積。第3步的非極大抑制要用到第2步得到的3個梯度圖,其實第2步的「綜合梯度圖」已經可以看出影象邊緣的輪廓了,只是邊緣較粗且我們還沒有對此梯度圖上的邊緣強度進行二值化(因為後面還有雙閾值),這裡的邊緣含有大量的「假邊緣」,它們的灰度值可能不如真邊緣大,但是乙個漸近的變化過程,非極大抑制的目的就是結合「梯度方向」和「梯度強度」去除這些「假邊緣」。第4步的邊緣連線,其實是強邊緣到弱邊緣的連線,我們經過第3步,得到乙個二值化的「非極大抑制後的邊緣圖」,它和第二步得到的「綜合梯度圖」不同,一是去掉了大量偽邊緣,二是它已經二值化了邊緣灰度是統一的。這時,為什麼我們還需要第4步?我在上面開始時的總結處說是為了進一步去除假邊緣,這是有道理的,只不過這裡的「假邊緣」和第三步要去的「假邊緣」性質不同,第3步處的假邊緣可以理解成是真正依附在真邊緣周圍的假邊緣(這樣的邊緣在第3步後就剩下很細的真邊緣),甚至是依附在假邊緣周圍的假邊緣(這樣的邊緣全是假邊緣,經過第3步還會剩下一部分假邊緣),兩者中的後者正是第4步要處理的,第4步最重要的引數是兩個自適應的閾值,所以說第4步對假邊緣的鑑定是根據其灰度是否太弱來確定的(小於強閾值),而不是像第3步那樣,鑑定的依據是其灰度值與周圍灰度值的比較。在經由強閾值確定了真邊緣後,再利用弱閾值對真邊緣進行連線處理,以保證邊緣的順滑真實。注意,第4步的「連線方法」是自定義乙個「染色的巢狀函式」來對乙個點的8鄰域點進行染色操作,這種程式設計方法對影象具有相同性質(灰度值等)的聯通區域進行染色操作是很有用的。

附錄:(一些關鍵**)

第一步的濾波去噪,用兩個一維的模版,實現乙個二維模版的作用

for(i=0;i<5;i++)

for(i=0;i<5;i++)

conv[i]=conv[i]/sum;

for(i=0;i=0&&i-m+2=0&&j-n+2第二步的求縱橫梯度圖,matlab中就用了二維高斯求梯度模版

for(i=0;i<5;i++)

for(j=0;j<5;j++) //j和x

for(i=0;i=0&&i-m+2=0&&j-n+2%                              the x marks the pixel in question, and each

%         3     2             of the quadrants for the gradient vector

%       o----0----0       fall into two cases, divided by the 45

%     4 |             | 1     degree line. in one case the gradient

%        |              |       vector is more horizontal, and in the other

%       o    x      o       it is more vertical. there are eight

%         |             |       divisions, but for the non-maximum suppression

% (1) |              |(4)   we are only worried about 4 of them since we

%       o----o----o      use symmetric points about the center pixel.

%        (2)   (3)

第4步是邊緣連線,用到強弱閾值,牽涉到直方圖自適應;另外就是前面說到的「一定條件域內染色的巢狀函式」

自適應閾值

convvv = (int *) malloc((k+1)*sizeof(int));

for(i=1;i<=k;i++)

convvv[i]=0;

for(i=0;i=0.85*sum)

}low=(int)(0.4*((float)high));

free(convvv);

「一定條件域內染色的巢狀函式」

trace(int low,int x,int y,unsigned char ** indata,int **fdata,long width,long height)}附:

//非最大抑制

void nonmaxsuppress(int *pmag, int *pgradx, int *pgrady, size sz, lpbyte pnsrst)

for(y=0;yfor(y=1;y//如果當前畫素梯度幅度為0,則不是邊界點

if(pmag[npos] == 0)

else

//如果x,y兩個方向的方向導數方向相反

//c是當前畫素,與g1-g4的關係為:

//       g2 g1

//        c

//    g3 g4

else

}//如果方向導數x分量比y分量大,說明導數的方向趨向於x分量

else

//如果x,y兩個方向導數的方向相反

// c與g1-g4的關係為

//   g1

//    g4 c g2

//     g3

else

}//利用 g1-g4 對梯度進行插值

else}}

}}

Canny邊緣檢測

1.canny邊緣檢測基本原理 1 圖象邊緣檢測必須滿足兩個條件 一能有效地抑制雜訊 二必須盡量精確確定邊緣的位置。2 根據對訊雜比與定位乘積進行測度,得到最優化逼近運算元。這就是canny邊緣檢測運算元。3 類似與marr log 邊緣檢測方法,也屬於先平滑後求導數的方法。2.canny邊緣檢測演...

Canny邊緣檢測

canny運算元是邊緣檢測運算元中最常用的一種,是公認效能優良的一種運算元,常被其它邊緣檢測運算元作為標準運算元進行優劣分析。canny演算法基本可以分為3個步驟 平滑 梯度計算 基於梯度值及梯度方向的候選點過濾 1 平滑 影象梯度的計算對雜訊很敏感,因此必須首先對其進行低通濾波。在這裡使用5 5的...

Canny邊緣檢測

canny邊緣檢測是一種非常流行的邊緣檢測演算法,是john canny在1986年提出的。它是乙個多階段的演算法,即由多個步驟構成。1.影象降噪 2.計算影象梯度 3.非極大值抑制 4.閾值篩選 我們就事後諸葛亮,分析下這個步驟的緣由。首先,影象降噪。我們知道梯度運算元可以用於增強影象,本質上是通...