opencv canny運算元與邊緣檢測

2021-10-16 22:12:57 字數 3455 閱讀 7161

canny運算元

api**

我們摳圖的過程其實就是找影象中某個例項(例如人)的邊緣的過程,所以,我們的邊緣檢測,其實就是檢測影象中的例項的邊緣。

那現在就有乙個問題了,我們人是怎麼區分邊緣的呢?

我們發現,每乙個例項,它的邊緣跟其周圍的畫素差距一般是比較大的。我們的摳圖,就是根據明顯的畫素差距,來區分例項的邊緣。

所以摳圖的根據,就是影象畫素的明顯變化。影象的邊緣,一般都是影象上畫素有明顯變化的位置。

那我們用乙個圖來表示影象的畫素:

影象畫素

我們發現,影象畫素明顯變化的位置,影象的傾斜程度都很大,也就是說斜率的絕對值很大。這和我們之前講的幾個運算元的原理是一致的,sobel運算元,就是計算的這個位置:

邊緣檢測在書上的定義如下:

邊緣檢測是影象處理和計算機視覺中的基本問題,邊緣檢測的目的是標識數字影象中亮度變化明顯的點。影象屬性中的顯著變化通常反映了屬性的重要事件和變化。

canny邊緣檢測運算元是john f. canny於 1986 年開發出來的乙個多級邊緣檢測演算法。它包括如下五個步驟:

依次介紹

影象平滑就是讓影象之間的畫素差距更小一些,能夠更好地提取特徵更加明顯的邊緣,所以影象平滑的目的就是去除部分雜訊。

而影象平滑操作,我們思考一下,不就是讓挨著的畫素之間差距變小,影象模糊的作用不就是這樣嗎?所以影象平滑操作就是進行影象模糊操作,而我們最常用的模糊操作,是高斯模糊。

canny演算法的基本思想是尋找一幅影象中灰度強度變化最強的位置。所謂變化最強,即指梯度方向。平滑後的影象中每個畫素點的梯度可以由sobel運算元(一種卷積運算)來獲得(opencv中有封裝好的函式,可以求影象中每個畫素點的n階導數)。首先,利用如下的核來分別求得沿水平(x)和垂直(y)方向的梯度g_x和g_y。

sobel和scharr

為了消除邊誤檢

這一步的目的是將模糊的邊界變得清晰(sharp)。通俗的講,就是保留了每個畫素點上梯度強度的極大值,而刪掉其他的值。對於每個畫素點,進行如下操作:

為了更好的解釋這個概念,看下圖:

圖中的數字代表了畫素點的梯度強度,箭頭方向代表了梯度方向。

以第二排第三個畫素點為例,由於梯度方向向上,則將這一點的強度(7)與其上下兩個畫素點的強度(5和4)比較,由於這一點強度最大,則保留。

下面再次舉例解釋:

上一步梯度的計算,分別求出了x、y方向的梯度。那麼我們就可以根據這個梯度來得出梯度的方向(角度)。

比如水平方向的梯度變化最大,那麼我們就保留與它垂直的方向(距離最遠),左右兩側都去掉

即:

經過非極大抑制後影象中仍然有很多雜訊點。

canny演算法中應用了一種叫雙閾值的技術。即設定乙個閾值上界和閾值下界(opencv中通常由人為指定的)

閾值上界、閾值下界,也被稱為高閾值、低閾值。

canny演算法建議高閾值:低閾值介於2:1和3:1之間。

下圖是高:低為5:1和3:2對一張測試圖案和**處理的結果。

較高的亮度梯度比較有可能是邊緣,亮度低於低閾值的一定不可能是邊緣。

但是沒有乙個確切的值來限定介於高低閾值之間的亮度梯度是否是邊緣,所以 canny 使用了滯後閾值。

滯後閾值(hysteresis thresholding)需要兩個閾值,即高閾值與低閾值。

假設影象中的重要邊緣都是連續的曲線,這樣我們就可以跟蹤給定曲線中模糊的部分,並且避免將沒有組成曲線 的雜訊畫素當成邊緣。所以我們從乙個較大的閾值開始,這將標識出我們比較確信的真實邊緣,使用前面匯出的方向資訊,我們從這些真正的邊緣開始在影象中跟蹤 整個的邊緣。在跟蹤的時候,我們使用乙個較小的閾值,這樣就可以跟蹤曲線的模糊部分直到我們回到起點。

即:

當介於高低閾值間的邊緣連線到乙個高於閾值的畫素時才被接受

void

canny

( inputarray src,

outputarray edges,

double threshold1,

double threshold2,

int aperturesize =3,

bool l2gradient = false

);

含義如下

高閾值越低,保留的細節就越多

初學opencv Canny運算元

include include include canny運算元用於邊緣檢測,首先在x,y方向上求得一階導數,然後組合為4個方向的導數,方向導數達到區域性最大值的點為邊緣候選點 將候選點拼裝成輪廓 若畫素的梯度大於上限閾值,則是邊緣畫素。低於下限閾值則拋棄。若介於兩者之間,只有當與高於上限閾值的畫素...

OpenCv canny運算元提取邊緣

canny運算元是john canny在1986年發表的 中首次提出的邊緣檢測運算元,該運算元檢測效能比較好,應用廣泛。最優邊緣檢測的三個主要評價標準是 坎尼運算元進行邊緣檢測的原理和步驟如下 消除雜訊 邊緣檢測的演算法主要是基於影象強度的一階和二階微分操作 但導數通常對雜訊很敏感,邊緣檢測演算法常...

Halcon封裝的找邊運算元 靈活好用

我們在做halcon找邊的時候有很多種方式,比如得到想要的邊緣輪廓,然後根據邊緣輪廓擬合邊緣。今天我們講一下另外一種擬合邊的方式。視覺行業的從業者應該都聽過或者用過visionpro,工具化的開發方式,強大的資料流確實好用,再加上很多優化後的工具,在執行時間和穩定性方面做的非常好。但是有時候很你會發...