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的一半
透過這樣的參數處理出來的結果如下:
那由於有經過高斯模糊處理,所以畫面看起來有失焦的感覺!
偵測結果的好壞要透過參數的設定來調整
大家可以多試試看一些參數來玩玩看!!
下一篇來介紹如何透過給定的點來取得直線的資訊
沒有留言:
張貼留言