步驟:
去雜訊任何邊緣檢測演算法都不可能在未經處理的原始資料上很好地處理,所以第一步是對原始資料與高斯平滑模板作卷積,得到的影象與原始影象相比有些輕微的模糊(blurred)。這樣,單獨的乙個畫素雜訊在經過高斯平滑的影象上變得幾乎沒有影響。
尋找影象中的亮度梯度
影象中的邊緣可能會指向不同的方向,所以 canny 演算法使用 4 個 mask 檢測水平、垂直以及對角線方向的邊緣。原始影象與每個 mask 所作的卷積都儲存起來。對於每個點我們都標識在這個點上的最大值以及生成的邊緣的方向。這樣我們就從原始影象生成了影象中每個點亮度梯度圖以及亮度梯度的方向。
引數:
canny 演算法包含許多可以調整的引數,它們將影響到演算法的計算的時間與實效。
高斯濾波器的大小:第一步所用的平滑濾波器將會直接影響 canny 演算法的結果。較小的濾波器產生的模糊效果也較少,這樣就可以檢測較小、變化明顯的細線。較大的濾波器產生的模糊效果也較多,將較大的一塊影象區域塗成乙個特定點的顏色值。這樣帶來的結果就是對於檢測較大、平滑的邊緣更加有用,例如彩虹的邊緣。
閾值:使用兩個閾值比使用乙個閾值更加靈活,但是它還是有閾值存在的共性問題。設定的閾值過高,可能會漏掉重要資訊;閾值過低,將會把枝節資訊看得很重要。很難給出乙個適用於所有影象的通用閾值。目前還沒有乙個經過驗證的實現方法。
canny 演算法適用於不同的場合。它的引數允許根據不同實現的特定要求進行調整以識別不同的邊緣特性。對於pc上的實時影象處理來說可能慢得無法使用,尤其是在使用大的高斯濾波器的情況下。
高斯平滑濾波器
高斯濾波器是一類根據高斯函式的形狀來選擇權值的線性平滑濾波器。高斯平滑濾波器對於抑**從正態分佈的雜訊非常有效。
小節:(來自此處)
canny邊緣檢測運算元,主要流程就是平滑影象、計算梯度的幅值和方向、對梯度幅值進行非極大值抑制、用雙閾值確定邊緣。
(1)平滑影象,用的離散化的二維高斯函式:
(2)然後就是計算梯度的幅值和方向,用的這兩個矩陣:
這個是計算公式:
但有的地方說計算梯度的幅值和方向用的是sobel運算元,opencv裡應該就是用的sobel,
這裡有說明。
(3)對梯度幅值進行非極大值抑制:
這條藍線是梯度方向,區域性最大值就在這條線上。除了c點外,梯度方向的交點dtmp1和dtmp2這兩個點的值也可能會是區域性最大值。判斷c點灰度與這兩個點灰度大小即可判斷c點是否為其鄰域內的區域性最大灰度點。如果經過判斷,c點灰度值小於這兩個點中的任乙個,那就說明c點不是區域性極大值,那麼則可以排除c點為邊緣。這就是非極大值抑制的工作原理。梯度方向垂直於邊緣方向。
實際上,我們只能得到c點鄰域的8個點的值,而dtmp1和dtmp2並不在其中,要得到這兩個值就需要對該兩個點兩端的已知灰度進行線性插值。
這裡的非極大值抑制講得還是蠻清楚的。
(4)雙閾值確定邊緣:
根據高閾值得到乙個邊緣影象,這樣乙個影象含有很少的假邊緣,但是由於閾值較高,產生的影象邊緣可能不閉合,未解決這樣乙個問題採用了另外乙個低閾值。
在高閾值影象中把邊緣鏈結成輪廓,當到達輪廓的端點時,該演算法會在端點的8鄰域點中尋找滿足低閾值的點,再根據此點收集新的邊緣,直到整個影象邊緣閉合。
關於濾波看看
這個就ok啦~
最後總結:
根據這裡
的介紹,
1. 我們在第一步的平滑處就可以用滿足自己應用場景的濾波演算法,不一定非要用高斯濾波。因為濾波的主要目的是為了去除雜訊
,所以應該選擇適合應用場景的濾波演算法。而且比如
這裡,高斯平滑使用5×5的矩陣(模板),做卷積運算,常規用的都是3×3的。
開始還不清楚怎麼拿高斯平滑函式計算模板,其實就是把σ往裡一帶,座標也往裡一帶,中心點座標(0,0),其他的位置就以這個(0,0)位置為參照表示座標,x, y表示的就是當前點到中心點的距離。都帶到公式裡,就能計算矩陣了(模板)。
2. 第二步計算梯度幅值和方向,這裡其實也應該用適合的運算元,比如,有的地方就是很簡單的2×2矩陣,而有的地方就用3×3矩陣。
3. 比如平滑那裡用高斯平滑,有時候為了降低計算量,直接用兩個一維高斯函式分別計算來替換直接用二維高斯函式計算。
Canny邊緣檢測演算法
canny邊緣檢測演算法的步驟 1 用高斯濾波器平滑濾波 2 用一階偏導的有限差分來計算的梯度的幅值與方向 3 對梯度幅值進行非極大值檢測 目的是細化邊緣 4 通過雙閾值演算法對進行邊緣連線。第一步 高斯濾波 高斯函式如下公式所示 它的影象是這樣的 高斯濾波,其實就是將與乙個高斯模組求卷積。根據高斯...
邊緣檢測演算法 canny
在目前常用的邊緣檢測方法中,canny邊緣檢測演算法是具有嚴格定義的,可以提供良好可靠檢測的方法之一。由於它具有滿足邊緣檢測的三個標準和實現過程簡單的優勢,成為邊緣檢測最流行的演算法之一。canny邊緣檢測演算法可以分為以下5個步驟 1 使用高斯濾波器,以平滑影象,濾除雜訊。2 計算影象中每個畫素點...
opencv之canny邊緣檢測演算法
canny演算法由john f.canny於1986年開發,是很常用的邊緣檢測演算法。它是一種多階段演算法,內部過程共4個階段 雜訊抑制 通過gaussianblur高斯模糊降噪 使用5x5高斯濾波器去除影象中的雜訊 查詢邊緣的強度及方向 通過sobel濾波器 應用非最大訊號抑制 non maxim...