Canny邊緣檢測演算法原理及其VC實現詳解 一

2021-06-14 15:50:21 字數 3508 閱讀 4621

圖象的邊緣是指圖象區域性區域亮度變化顯著的部分,該區域的灰度剖面一般可以看作是乙個階躍,既從乙個灰度值在很小的緩衝區域內急劇變化到另乙個灰度相差較大的灰度值。圖象的邊緣部分集中了圖象的大部分資訊,圖象邊緣的確定與提取對於整個圖象場景的識別與理解是非常重要的,同時也是圖象分割所依賴的重要特徵,邊緣檢測主要是圖象的灰度變化的度量、檢測和定位,自從1959提出邊緣檢測以來,經過五十多年的發展,已有許多中不同的邊緣檢測方法。根據作者的理解和實踐,本文對邊緣檢測的原理進行了描述,在此基礎上著重對canny檢測演算法的實現進行詳述。

本文所述內容均由程式設計驗證而來,在實現過程中,有任何錯誤或者不足之處大家共同討論(本文不講述枯燥的理論證明和數學推導,僅僅從演算法的實現以及改進上進行原理性和工程化的描述)。

在之前的博文中,作者從一維函式的躍變檢測開始,循序漸進的對二維影象邊緣檢測的基本原理進行了通俗化的描述。結論是:實現影象的邊緣檢測,就是要用離散化梯度逼近函式根據二維灰度矩陣梯度向量來尋找影象灰度矩陣的灰度躍變位置,然後在影象中將這些位置的點連起來就構成了所謂的影象邊緣(影象邊緣在這裡是乙個統稱,包括了二維影象上的邊緣、角點、紋理等基元圖)。

在實際情況中理想的灰度階躍及其線條邊緣影象是很少見到的,同時大多數的感測器件具有低頻濾波特性,這樣會使得階躍邊緣變為斜坡性邊緣,看起來其中的強度變化不是瞬間的,而是跨越了一定的距離。這就使得在邊緣檢測中首先要進行的工作是濾波。

1)濾波:邊緣檢測的演算法主要是基於影象強度的一階和二階導數,但導數通常對雜訊很敏感,因此必須採用濾波器來改善與雜訊有關的邊緣檢測器的效能。常見的濾波方法主要有高斯濾波,即採用離散化的高斯函式產生一組歸一化的高斯核(具體見「高斯濾波原理及其程式設計離散化實現方法」一文),然後基於高斯核函式對影象灰度矩陣的每一點進行加權求和(具體程式實現見下文)。

2)增強:增強邊緣的基礎是確定影象各點鄰域強度的變化值。增強演算法可以將影象灰度點鄰域強度值有顯著變化的點凸顯出來。在具體程式設計實現時,可通過計算梯度幅值來確定。

3)檢測:經過增強的影象,往往鄰域中有很多點的梯度值比較大,而在特定的應用中,這些點並不是我們要找的邊緣點,所以應該採用某種方法來對這些點進行取捨。實際工程中,常用的方法是通過閾值化方法來檢測。

johncanny於2023年提出canny運算元,它與marr(log)邊緣檢測方法類似,也屬於是先平滑後求導數的方法。本節對根據上述的邊緣檢測過程對canny檢測演算法的原理進行介紹。

canny演算法通常處理的影象為灰度圖,因此如果攝像機獲取的是彩色影象,那首先就得進行灰度化。對一幅彩色圖進行灰度化,就是根據影象各個通道的取樣值進行加權平均。以rgb格式的彩圖為例,通常灰度化採用的方法主要有:

方法1:gray=(r+g+b)/3;

方法2:gray=0.299r+0.587g+0.114b;(這種引數考慮到了人眼的生理特點)

注意1:至於其他格式的彩色影象,可以根據相應的轉換關係轉為rgb然後再進行灰度化;

注意2:在程式設計時要注意影象格式中rgb的順序通常為bgr

影象高斯濾波的實現可以用兩個一維高斯核分別兩次加權實現,也可以通過乙個二維高斯核一次卷積實現。

1)高斯核實現

上式為離散化的一維高斯函式,確定引數就可以得到一維核向量。

上式為離散化的二維高斯函式,確定引數就可以得到二維核向量。

注意1:關於引數sigma的取值詳見上篇博文。

注意2:在求的高斯核後,要對整個核進行歸一化處理。

2)影象高斯濾波

對影象進行高斯濾波,聽起來很玄乎,其實就是根據待濾波的畫素點及其鄰域點的灰度值按照一定的引數規則進行加權平均。這樣可以有效濾去理想影象中疊加的高頻雜訊。

通常濾波和邊緣檢測是矛盾的概念,抑制了雜訊會使得影象邊緣模糊,這回增加邊緣定位的不確定性;而如果要提高邊緣檢測的靈敏度,同時對雜訊也提高了靈敏度。實際工程經驗表明,高斯函式確定的核可以在抗雜訊干擾和邊緣檢測精確定位之間提供較好的折衷方案。這就是所謂的高斯影象濾波,具體實現**見下文。

關於影象灰度值得梯度可使用一階有限差分來進行近似,這樣就可以得影象在x和y方向上偏導數的兩個矩陣。

常用的梯度運算元有如下幾種:

1)roberts運算元

上式為其x和y方向偏導數計算模板,可用數學公式表達其每個點的梯度幅值為:

2)sobel運算元

上式三個矩陣分別為該運算元的x向卷積模板、y向卷積模板以及待處理點的鄰域點標記矩陣,據此可用數學公式表達其每個點的梯度幅值為:

3)prewitt運算元

和sobel運算元原理一樣,在此僅給出其卷積模板。

4)canny演算法所採用的方法

其x向、y向的一階偏導數矩陣,梯度幅值以及梯度方向的數學表示式為:

求出這幾個矩陣後,就可以進行下一步的檢測過程。

影象梯度幅值矩陣中的元素值越大,說明影象中該點的梯度值越大,但這不不能說明該點就是邊緣(這僅僅是屬於影象增強的過程)。在canny演算法中,非極大值抑制是進行邊緣檢測的重要步驟,通俗意義上是指尋找畫素點區域性最大值,將非極大值點所對應的灰度值置為0,這樣可以剔除掉一大部分非邊緣的點(這是本人的理解)。

圖1 非極大值抑制原理

根據圖1 可知,要進行非極大值抑制,就首先要確定畫素點c的灰度值在其8值鄰域內是否為最大。圖1中藍色的線條方向為c點的梯度方向,這樣就可以確定其區域性的最大值肯定分布在這條線上,也即出了c點外,梯度方向的交點dtmp1和dtmp2這兩個點的值也可能會是區域性最大值。因此,判斷c點灰度與這兩個點灰度大小即可判斷c點是否為其鄰域內的區域性最大灰度點。如果經過判斷,c點灰度值小於這兩個點中的任乙個,那就說明c點不是區域性極大值,那麼則可以排除c點為邊緣。這就是非極大值抑制的工作原理。

作者認為,在理解的過程中需要注意以下兩點:

1)中非最大抑制是回答這樣乙個問題:「當前的梯度值在梯度方向上是乙個區域性最大值嗎?」 所以,要把當前位置的梯度值與梯度方向上兩側的梯度值進行比較;

2)梯度方向垂直於邊緣方向。

但實際上,我們只能得到c點鄰域的8個點的值,而dtmp1和dtmp2並不在其中,要得到這兩個值就需要對該兩個點兩端的已知灰度進行線性插值,也即根據圖1中的g1和g2對dtmp1進行插值,根據g3和g4對dtmp2進行插值,這要用到其梯度方向,這是上文canny演算法中要求解梯度方向矩陣thita的原因。

完成非極大值抑制後,會得到乙個二值影象,非邊緣的點灰度值均為0,可能為邊緣的區域性灰度極大值點可設定其灰度為128。根據下文的具體測試影象可以看出,這樣乙個檢測結果還是包含了很多由雜訊及其他原因造成的假邊緣。因此還需要進一步的處理。

canny演算法中減少假邊緣數量的方法是採用雙閾值法。選擇兩個閾值(關於閾值的選取方法在擴充套件中進行討論),根據高閾值得到乙個邊緣影象,這樣乙個影象含有很少的假邊緣,但是由於閾值較高,產生的影象邊緣可能不閉合,未解決這樣乙個問題採用了另外乙個低閾值。

在高閾值影象中把邊緣鏈結成輪廓,當到達輪廓的端點時,該演算法會在斷點的8鄰域點中尋找滿足低閾值的點,再根據此點收集新的邊緣,直到整個影象邊緣閉合。

以上即為整個canny邊緣檢測演算法的原理分析,接下來我們進行vc下的演算法實現和效果分析。

Canny邊緣檢測演算法

canny邊緣檢測演算法的步驟 1 用高斯濾波器平滑濾波 2 用一階偏導的有限差分來計算的梯度的幅值與方向 3 對梯度幅值進行非極大值檢測 目的是細化邊緣 4 通過雙閾值演算法對進行邊緣連線。第一步 高斯濾波 高斯函式如下公式所示 它的影象是這樣的 高斯濾波,其實就是將與乙個高斯模組求卷積。根據高斯...

邊緣檢測演算法 canny

在目前常用的邊緣檢測方法中,canny邊緣檢測演算法是具有嚴格定義的,可以提供良好可靠檢測的方法之一。由於它具有滿足邊緣檢測的三個標準和實現過程簡單的優勢,成為邊緣檢測最流行的演算法之一。canny邊緣檢測演算法可以分為以下5個步驟 1 使用高斯濾波器,以平滑影象,濾除雜訊。2 計算影象中每個畫素點...

Canny邊緣檢測演算法原理及其VC實現詳解 一

圖象的邊緣是指圖象區域性區域亮度變化顯著的部分,該區域的灰度剖面一般可以看作是乙個階躍,既從乙個灰度值在很小的緩衝區域內急劇變化到另乙個灰度相差較大的灰度值。圖象的邊緣部分集中了圖象的大部分資訊,圖象邊緣的確定與提取對於整個圖象場景的識別與理解是非常重要的,同時也是圖象分割所依賴的重要特徵,邊緣檢測...