2013年3月6日 星期三

EmguCV Image Process: Extracting Lines, Contours, and Components part 3

20120617004.jpg
EmguCV Image Process: Extracting Lines, Contours, and Components

參考OpenCV 2 Computer Vision Application Programming Cookbook第七章

介紹內容如下:

Detecting image contours with the Canny operator

Detecting circles in images with the Hough transform

Fitting a line to a set of points

Extracting the components' contours

Computing components' shape descriptors
上一篇介紹到如何透過Hough Transform來做線段偵測

這次來介紹如何利用Hough Transform來做圓的偵測!!

其原理和線段偵測類似

上一篇有提到一條直線可透過極徑與極角來表示

那對於圓來說則需要三個參數表示

分別是:中心點的x, y,與半徑r

圓方程式:r2 = (x - x0)2 + (y - y0)2

由於是三個參數,因此要搜尋通過此點的所有圓時會對應到三維的空間

其搜尋的概念就跟二維的直線偵測一樣

在三維空間中的曲線代表著通過某一點的所有圓

畫出會通過所有偵測點的全部曲線(圓)

然後找出交會點,交會點重疊越多曲線,表示這個圓在畫面中越明顯!


但由於這樣三維的作法非常消耗運算量

於是OpenCV實作了稱為:Hough gradient method

其中分為兩個步驟:

第一個步驟是:利用二維空間來計算出圓的中心位置(圓心)

第二步驟是:再透過所有偵測出的圓心來確認半徑

此方法最早在Illingworth的論文The Adaptive Hough Transform中提出

有興趣者可以去研究!!


這裡直接來看程式:

Image<Gray, Byte> image = new Image<Gray, Byte>("image.jpg"); //reduce the image noise image._SmoothGaussian(3); CircleF[][] circles = image.HoughCircles( new Gray(260), //Canny algorithm high threshold //(the lower one will be twice smaller) new Gray(177), //accumulator threshold at the center detection stage 2, //accumulator resolution (size of the image / 2) 35, //minimum distance between two circles 50, //min radius 300); //max radius //Draw circles on image foreach (CircleF circle in circles[0]) { image.Draw(circle, new Gray(255), 1); }
一開始先透過高斯模糊的處理來減低影像的雜訊

再使用HoughCircles這個方法來做

這裡和HoughLines的方法有些不同

在Canny algorithm的threshold的設定只有high threshold

而low threshold直接設為high threshold的一半

透過這樣的參數處理出來的結果如下:

那由於有經過高斯模糊處理,所以畫面看起來有失焦的感覺!

偵測結果的好壞要透過參數的設定來調整

大家可以多試試看一些參數來玩玩看!!

下一篇來介紹如何透過給定的點來取得直線的資訊

沒有留言:

張貼留言