導航:首頁 > 源碼編譯 > canny演算法

canny演算法

發布時間:2022-01-23 04:59:18

① Canny運算元的發展

Canny 的目標是找到一個最優的邊緣檢測演算法,最優邊緣檢測的含義是:
好的檢測- 演算法能夠盡可能多地標識出圖像中的實際邊緣。
好的定位- 標識出的邊緣要盡可能與實際圖像中的實際邊緣盡可能接近。
最小響應- 圖像中的邊緣只能標識一次,並且可能存在的圖像雜訊不應標識為邊緣。
為了滿足這些要求 Canny 使用了變分法,這是一種尋找滿足特定功能的函數的方法。最優檢測使用四個指數函數項的和表示,但是它非常近似於高斯函數的一階導數。

② Canny運算元的介紹

Canny邊緣檢測運算元是John F. Canny於 1986 年開發出來的一個多級邊緣檢測演算法。更為重要的是 Canny 創立了邊緣檢測計算理論(Computational theory of edge detection)解釋這項技術如何工作。

③ canny演算法的OpenCV中的Canny函數

採用
Canny
演算法做邊緣檢測
void
cvCanny(
const
CvArr*
image,
CvArr*
edges,
double
threshold1,double
threshold2,
int
aperture_size=3
);
--image
輸入圖像.
--edges
輸出的邊緣圖像
--threshold1
第一個閾值
--threshold2
第二個閾值
--aperture_size
Sobel
運算元內核大小
(見
cvSobel).
函數
cvCanny
採用
CANNY
演算法發現輸入圖像的邊緣而且在輸出圖像中標識這些邊緣。threshold1和threshold2
當中的小閾值用來控制邊緣連接,大的閾值用來控制強邊緣的初始分割。

④ canny 演算法的閾值,有兩個,到底是做什麼用的

第一個是低閾值,第二個高閾值
高閾值比較嚴格,求的邊緣很少,認為高閾值的邊緣都是有效。低閾值寬松,求的邊緣很多(一般包括了高閾值求到的邊緣),其中不少是無效的邊緣(反正不想要的)。
先用高閾值求邊緣。canny求得的邊緣希望是連在一起的(通常是封閉的),但高閾值求的邊緣一般斷斷續續。斷開的地方如果低閾值求的邊緣存在,就用低閾值的邊緣接上去,目的讓邊緣盡量都連在一起。其它情況下低閾值的邊緣是不用的。

兩個閾值是有區別的,高的那個閾值是將要提取輪廓的物體與背景區分開來,就像閾值分割的那個參數一樣,是決定目標與背景對比度的,低的那個閾值是用來平滑邊緣的輪廓,有時高的閾值設置太大了,可能邊緣輪廓不連續或者不夠平滑,通過低閾值來平滑輪廓線,或者使不連續的部分連接起來

⑤ canny演算法的最優邊緣准則

Canny 的目標是找到一個最優的邊緣檢測演算法,最優邊緣檢測的含義是:
(1)最優檢測:演算法能夠盡可能多地標識出圖像中的實際邊緣,漏檢真實邊緣的概率和誤檢非邊緣的概率都盡可能小;
(2)最優定位準則:檢測到的邊緣點的位置距離實際邊緣點的位置最近,或者是由於雜訊影響引起檢測出的邊緣偏離物體的真實邊緣的程度最小;
(3)檢測點與邊緣點一一對應:運算元檢測的邊緣點與實際邊緣點應該是一一對應。
為了滿足這些要求 Canny 使用了變分法(calculus of variations),這是一種尋找優化特定功能的函數的方法。最優檢測使用四個指數函數項表示,但是它非常近似於高斯函數的一階導數。

⑥ canny演算法的演算法的實現步驟

Canny邊緣檢測演算法可以分為以下5個步驟: 應用高斯濾波來平滑圖像,目的是去除雜訊 找尋圖像的強度梯度(intensity gradients) 應用非最大抑制(non-maximum suppression)技術來消除邊誤檢(本來不是但檢測出來是) 應用雙閾值的方法來決定可能的(潛在的)邊界 利用滯後技術來跟蹤邊界 1. 圖像平滑(去雜訊)
任何邊緣檢測演算法都不可能在未經處理的原始數據上很好地工作,所以第一步是對原始數據與高斯 mask 作卷積,得到的圖像與原始圖像相比有些輕微的模糊(blurred)。這樣,單獨的一個像素雜訊在經過高斯平滑的圖像上變得幾乎沒有影響。以下為一個5X5高斯濾波器(高斯核,標准差delta=1.4),其中A為原始圖像,B為平滑後的圖像。


2. 尋找圖像中的強度梯度
Canny演算法的基本思想是找尋一幅圖相中灰度強度變化最強的位置。所謂變化最強,即指梯度方向。平滑後的圖像中每個像素點的梯度可以由Sobel運算元(一種卷積運算)來獲得(opencv中有封裝好的函數,可以求圖像中每個像素點的n階導數)。首先,利用如下的核來分別求得沿水平(x)和垂直(y)方向的梯度G_X和G_Y。
K_{GX} = [-1 0 1 ; -2 0 2 ; -1 0 1], K_{GY} = {1 2 1 ; 0 0 0 ; -1 -2 -1}
之後便可利用公式來求得每一個像素點的梯度度量值(gradient magnitude,可能翻譯得不準確)。
,有時為了計算簡便,也會使用G_X和G_Y的無窮大范數來代替二范數。把平滑後的圖像中的每一個點用G代替,可以獲得如下圖像。從下圖可以看出,在變化劇烈的地方(邊界處),將獲得較大的梯度度量值G,對應的顏色為白色。然而,這些邊界通常非常粗,難以標定邊界的真正位置。為了做到這一點(參考非極大抑制Non-maximum suppression一節),還必須存儲梯度方向,其公式如下圖所示。也就是說在這一步我們會存數兩塊數據,一是梯度的強度信息,另一個是梯度的方向信息。

3. 非極大抑制Non-maximum suppression
這一步的目的是將模糊(blurred)的邊界變得清晰(sharp)。通俗的講,就是保留了每個像素點上梯度強度的極大值,而刪掉其他的值。對於每個像素點,進行如下操作:
a) 將其梯度方向近似為以下值中的一個(0,45,90,135,180,225,270,315)(即上下左右和45度方向)
b) 比較該像素點,和其梯度方向正負方向的像素點的梯度強度
c) 如果該像素點梯度強度最大則保留,否則抑制(刪除,即置為0)
為了更好的解釋這個概念,看下圖。

圖中的數字代表了像素點的梯度強度,箭頭方向代表了梯度方向。以第二排第三個像素點為例,由於梯度方向向上,則將這一點的強度(7)與其上下兩個像素點的強度(5和4)比較,由於這一點強度最大,則保留。處理後效果如下圖所示。

上圖中,可以想像,邊界處的梯度方向總是指向垂直於邊界的方向,即最後會保留一條邊界處最亮的一條細線。
4.雙閾值(Double Thresholding)
經過非極大抑制後圖像中仍然有很多雜訊點。Canny演算法中應用了一種叫雙閾值的技術。即設定一個閾值上界和閾值下界(opencv中通常由人為指定的),圖像中的像素點如果大於閾值上界則認為必然是邊界(稱為強邊界,strong edge),小於閾值下界則認為必然不是邊界,兩者之間的則認為是候選項(稱為弱邊界,weak edge),需進行進一步處理。經過雙閾值處理的圖像如下圖所示

上圖中右側強邊界用白色表示,弱邊界用灰色表示。
5.利用滯後的邊界跟蹤
這里就不細作解釋了。大體思想是,和強邊界相連的弱邊界認為是邊界,其他的弱邊界則被抑制。
以上內容均翻譯自參考文獻【4】
上一個網路版本:
圖像中的邊緣可能會指向不同的方向,所以 Canny 演算法使用 4 個 掩模(mask) 檢測水平、垂直以及對角線方向的邊緣。原始圖像與每個 mask 所作的卷積都存儲起來。對於每個點我們都標識在這個點上的最大值以及生成的邊緣的方向。這樣我們就從原始圖像生成了圖像中每個點亮度梯度圖以及亮度梯度的方向。以下兩個公式分別求取高斯濾波後圖像的梯度幅值及其方向的表達式。這一步,也叫稱為非極大抑制(Non-maximum suppression)。


3. 在圖像中跟蹤邊緣
較高的亮度梯度比較有可能是邊緣,但是沒有一個確切的值來限定多大的亮度梯度是邊緣多大又不是,所以 Canny 使用了滯後閾值。
滯後閾值(Hysteresis thresholding) 需要兩個閾值,即高閾值與低閾值。假設圖像中的重要邊緣都是連續的曲線,這樣我們就可以跟蹤給定曲線中模糊的部分,並且避免將沒有組成曲線 的雜訊像素當成邊緣。所以我們從一個較大的閾值開始,這將標識出我們比較確信的真實邊緣,使用前面導出的方向信息,我們從這些真正的邊緣開始在圖像中跟蹤 整個的邊緣。在跟蹤的時候,我們使用一個較小的閾值,這樣就可以跟蹤曲線的模糊部分直到我們回到起點。
一旦這個過程完成,我們就得到了一個二值圖像,每點表示是否是一個邊緣點。
一個獲得亞像素精度邊緣的改進實現是在梯度方向檢測二階方向導數的過零點,它在梯度方向的三階方向導數滿足符號條件。
滯後閾值也可以用於亞像素邊緣檢測。

⑦ 求教canny運算元中非極大值抑制演算法的理解

岡薩雷斯 的圖像處理理論講的很好,我推薦給你吧 還有opencv 雖然把這些演算法全部封裝了,但是以後叫你改進演算法,還是要知道原理,和大致代碼的意思。 canny 邊緣檢測 還是好好去理解吧

⑧ canny運算元

樓下好搞笑,,,那是邊緣提取的演算法哦。。。哈哈哈 笑死我了

⑨ Canny運算元的結論

Canny 演算法適用於不同的場合。它的參數允許根據不同實現的特定要求進行調整以識別不同的邊緣特性。對於PC上的實時圖像處理來說可能慢得無法使用,尤其是在使用大的高斯濾波器的情況下。但是,我們討論計算能力的時候,也要考慮到隨著處理器速度不斷提升,有望在未來幾年使得這不再成為一個問題。

⑩ 用C語言編程實現CANNY演算法

創建一個名字為canny.par的文件,就同你建立一個test.txt一樣

閱讀全文

與canny演算法相關的資料

熱點內容
java數據結構與演算法面試題 瀏覽:977
解壓不了是什麼意思 瀏覽:359
紐西蘭編程師年薪 瀏覽:321
程序員為什麼大多生閨女 瀏覽:51
c編程用英文還是中文 瀏覽:723
一點都不解壓的游戲 瀏覽:203
解壓為什麼不能用中文文件夾 瀏覽:615
伺服器如何解除備份 瀏覽:144
安卓手機為什麼用一年就變卡 瀏覽:11
如何用風變編程自動回復 瀏覽:512
安卓閱讀幣怎麼樣 瀏覽:437
京東app怎麼切號 瀏覽:583
進入傳奇伺服器後如何修改 瀏覽:42
m0單片機的cycle怎麼知道 瀏覽:806
linux命令太長 瀏覽:782
壓縮機nb1111y是多少w 瀏覽:45
打賞視頻用什麼伺服器好 瀏覽:154
方舟好友伺服器怎麼加mod 瀏覽:982
javaresponse設置編碼 瀏覽:842
opc數據採集源碼 瀏覽:563