【數字圖像處理】利用霍夫變換檢測圓形

版權聲明:本文爲博主原創文章,歡迎轉載。轉載請註明出處http://blog.csdn.net/jsgaobiao https://blog.csdn.net/jsgaobiao/article/details/51251783

代碼下載:http://download.csdn.net/detail/jsgaobiao/9503229

 

Ø  【作業要求】


Write your own imfindcircles() to simulatematlab function imfindcircles(). The attached images are for testing.

Submit your code, result and report.


Ø  【文件說明】


main.m:

讀取3張測試圖片並且進行轉灰度圖、用Sobel算子邊緣檢測、二值化、調用findcircle函數並將找到的圓繪製在原圖上。

findcircle.m:

利用霍夫變換的方法找到圖片中的圓,並返回圓的座標和半徑。


Ø  【作業思路】


本次作業找圓主要是使用了霍夫變換的方法。

先介紹一下霍夫變換的思想:


霍夫變換是圖像處理中用於識別幾何圖形的一種常用方法。最簡單的應用是檢測黑白圖像上的一條直線。我們用y=kx+b表示一條直線,其中k和b是參數,分別是斜率和截距。如果將k和b視爲變量,考慮參數平面k-b,那麼x-y平面上的一個點對應到k-b參數平面上就是一條直線。

假設在x-y平面上有若干待擬合的散點,那麼他們可以對應到參數平面上的若干條直線。如果x-y平面上的散點都在一條直線上,那麼他們對應在參數平面上的若干條直線必然交與(k0,b0)這一點,其中k0,b0是x-y平面上那條直線的參數。如果參數平面上的直線產生了多個交點,那麼我們就選取經過直線最多的交點。可以理解爲若干直線對於座標點(k,b)的投票,票數最多的參數(k,b)我們認爲就是最好的一組參數。


處理圓的情況更容易理解,因爲我們可以取和圖像平面一樣的參數平面,以圖像上的每一個非零點(因爲該算法處理的是二值化後的圖片,即對原圖進行邊緣提取後的結果)爲圓心,以已知的半徑在參數平面上畫圓(對圓覆蓋的座標點進行投票),最後找出參數平面上的峯值,就對應於原圖中的圓心。

但是這個做法存在一個問題——我們並不知道圓的半徑。一個解決方案是把參數平面拓展爲三維的空間x-y-r,對應圓心座標和半徑。這樣做需要增加相當大的時間、空間複雜度。爲了提高算法的效率,我將圓的半徑範圍作爲參數輸入findcircle函數中,對於不同的圖像採用不同的參數進行處理,可以有效的減少運行的時間。

 

另外,作爲參數輸入findcircle函數的還有二值化後的圖像BW,枚舉半徑的範圍[minR,maxR]和步長stepR和在參數平面畫圓投票的弧度步長stepAngle。

最終的檢測效果如下圖所示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章