[轉載+原創]Emgu CV on C# (六) —— Emgu CV on Canny邊緣檢測

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   使用   io   ar   for   

    Canny邊緣檢測也是一種邊緣檢測方法,本文介紹了Canny邊緣檢測的函數及其使用方法,並利用emgucv方法將輪廓檢測解算的結果與原文進行比較。

    映像的邊緣檢測的原理是檢測出映像中所有灰階值變化較大的點,而且這些點串連起來就構成了若干線條,這些線條就可以稱為映像的邊緣。Canny邊緣檢測運算元是John F. Canny於 1986 年開發出來的一個多級邊緣檢測演算法。

    Canny 邊緣檢測的數學原理和演算法實現這裡就不再了,有興趣的讀者可以查閱專業書籍。

一、概述(若果不想看,可以略過。轉自:《Canny邊緣檢測演算法原理及其VC實現詳解》、“百度百科”和《我的OpenCV學習筆記(19):檢測輪廓,直線,圓以及直線擬合》)

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

    檢測輪廓時我們使用canny邊沿檢測演算法,這個演算法其實也是基於梯度的。但是,與傳統的梯度演算法求邊沿不同的是: 

    1.它可以精確的定位邊沿的位置。通過沿幅角方向檢測模值的極大值點,即邊緣點,遍曆8個方向映像像素,把每個像素偏導值與相鄰像素的模值比較,取其MAX值為邊緣點,置像素灰階值為0。這樣做的結果使得邊沿非常細。     2.雙閾值檢測。通常一個較小的閾值會保留很多邊沿,他們中的一部分是沒有用的;而一個較大的閾值則會保留主要的邊沿,但是可能會丟失一些邊沿資訊。怎麼把它們結合起來使用呢?具體的做法如下:(其中映像二是較大閾值產生的,映像一是較小閾值產生的) 

        •對映像進行掃描,當遇到一個非零灰階的像素p(x,y)時,跟蹤以p(x,y)為開始點的輪廓線,直到輪廓線的終點q(x,y)。 

        •考察映像1中與映像2中q(x,y)點位置對應的點s(x,y)的8鄰近地區。如果在s(x,y)點的8鄰近地區中有非零像素s(x,y)存在,則將其包括到映像2中,作為r(x,y)點。從r(x,y)開始,重複第一步,直到我們在映像1和映像2中都無法繼續為止。 

        •當完成對包含p(x,y)的輪廓線的連結之後,將這條輪廓線標記為已經訪問。回到第一步,尋找下一條輪廓線。重複第一步、第二步、第三步,直到映像2中找不到新輪廓線為止。 

        •至此,完成canny運算元的邊緣檢測。 

    在OpenCV中使用Canny函數來檢測邊沿。第一個參數是待檢測的映像,第二個參數是檢測結果;後兩個參數是那兩個門限,通常高低閾值比在 2:1 到3:1之間。 

    參數調整:Canny 演算法包含許多可以調整的參數,它們將影響到演算法的計算的時間與實效。

         高斯濾波器的大小:第一步所用的平滑濾波器將會直接影響 Canny 演算法的結果。較小的濾波器產生的模糊效果也較少,這樣就可以檢測較小、變化明顯的細線。較大的濾波器產生的模糊效果也較多,將較大的一塊映像地區塗成一個特定點的顏色值。這樣帶來的結果就是對於檢測較大、平滑的邊緣更加有用,例如彩虹的邊緣。         閾值:使用兩個閾值比使用一個閾值更加靈活,但是它還是有閾值存在的共性問題。設定的閾值過高,可能會漏掉重要訊息;閾值過低,將會把枝節資訊看得很重要。很難給出一個適用於所有映像的通用閾值。目前還沒有一個經過驗證的實現方法。 

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

二、程式實現

1、關鍵函數

public static void cvCanny(IntPtr image,IntPtr edges,double threshold1,double threshold2,int apertureSize)
第一個參數image,Input image
表示輸入映像,必須為單通道灰階圖
第二個參數edges,Image to store the edges found by the function
表示輸出的邊緣映像,為單通道黑白圖
第三個參數threshold1,The first threshold
第四個參數threshold2,The second threshold.
第三個參數和第四個參數表示閾值,這二個閾值中當中的小閾值用來控制邊緣串連,大的閾值用來控制強邊緣的初始分割,即如果一個像素的梯度大與上限值,則被認為是邊緣像素,如果小於下限閾值,則被拋棄。如果該點的梯度在兩者之間則當這個點與高於上限值的像素點串連時我們才保留,否則刪除。
第五個參數aperture,Aperture parameter for Sobel operator
表示Sobel 運算元大小,預設為3即表示一個3*3的矩陣。Sobel 運算元與高斯拉普拉斯運算元都是常用的邊緣運算元,詳細的數學原理可以查閱專業書籍。

2、編程實現
//canny運算元邊緣檢測IntPtr Cannyimg = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(Histimg), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);CvInvoke.cvCanny(Histimg, Cannyimg, trackBar1.Value, trackBar1.Value * 3, 3);MIplImage cannymi = (MIplImage)Marshal.PtrToStructure(Cannyimg, typeof(MIplImage));Image<Gray, Byte> cannyimage = new Image<Gray, Byte>(cannymi.width, cannymi.height, cannymi.widthStep, cannymi.imageData);
pictureBox5.Image = cannyimage.ToBitmap();

三、結果分析

調整閾值與原文《【OpenCV入門指南】第三篇Canny邊緣檢測》使用Opencv的方法進行比較結果。

原文的圖片和處理之後的圖片,閾值設定為100.

本文利用emgucv方法,按照閾值為100解算獲得的結果。

從兩張圖比對看,利用emgucv方法擷取的細節更多一些,需要根據項目需要和自身設定場合進行適應性調整。


[轉載+原創]Emgu CV on C# (六) —— Emgu CV on Canny邊緣檢測

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.