參數化
圓可以用三條信息完整地描述:圓心(a,b)和半徑。(中心由兩部分組成,因此共有三部分)
x = a + Rcosθ
y = b + Rsinθ
當θ從0°變化到360°時,會生成壹個半徑為R的完整圓。
因此,利用圓霍夫變換,我們期望找到(x,y,R)的三元組,它們很可能是圖像中的圓。也就是說,我們想要找到三個參數。因此,參數空間是3D的…這意味著如果妳不慢慢來,事情會變得很糟糕。即使您的編程語言使用虛擬內存,內存不足錯誤也是常見的。
所以我們從簡單的開始。
假設R已知
首先,我們假設妳在尋找特定半徑的圓,也就是說,R是已知的。每個圓的方程式是:
x = a + Rcosθ
y = b + Rsinθ
所以,xy空間中的每壹個點都等價於ab空間中的壹個圓(R不是參數,我們已經知道了)。這是因為重新排列方程,我們得到:
a = x 1–rcosθ
b = y 1–rsinθ
對於特定的點(x1,y1)。θ從0度到360度掃描。
所以,事件的流程是這樣的:
加載圖像
檢測邊緣並生成二值圖像
對於每個“邊緣”像素,在ab空間中生成壹個圓
對於ab空間中圓上的每壹點,在累加器單元中進行“投票”
票數較多的單元格為中心
當R未知時
當半徑未知時,最簡單的解決方案就是猜測。假設R = 1,然後運行同樣的算法。然後假設R = 2,再運行壹次。假設R = 3…諸如此類。
R的上限是多少?壹個安全的限制是圖像對角線的長度。圖像上不可能有半徑大於或等於對角線的圓。