霍夫變換與直線檢測

背景

霍夫變換應(yīng)該是在邊緣檢測的基礎(chǔ)上的,如果要在如下這張圖中做直線的檢測,opencv有很多邊緣檢測的算法得到一個8bit的圖,本文所述的霍夫變換的原理也是在這個邊緣檢測的結(jié)果上進行的

邊緣檢測結(jié)果

算法基礎(chǔ)

極坐標(biāo)變換

笛卡爾坐標(biāo)系中的任意一點(x,y)都可以表示成ρ=x·cosθ+y·sinθ,的形式,而后者(ρ,θ)是極坐標(biāo)。而在這個極坐標(biāo)系下,一個(ρ, θ)是可以表示一條直線,如下圖。

(ρ, θ)表示的直線

這樣的直線的表示方式具有以下性質(zhì):

  1. 極坐標(biāo)中的一個點(ρ, θ)就表示笛卡爾坐標(biāo)系中的一條直線
  2. 笛卡爾坐標(biāo)系中過某一個點(x,y)的所有直線在極坐標(biāo)中變?yōu)橐粭l正弦曲線

證明:假設(shè)點(x,y),令sinα=x/sqrt(x2+y2),cosα=y/sqrt(x2+y2)。
ρ=sqrt(x2+y2)·(sinα·cosθ+cosα·sinθ)=sqrt(x2+y2)·sin(α+θ)。即表示一條振幅為sqrt(x2+y2),相位為α的正弦曲線。

笛卡爾坐標(biāo)系中過某一點的直線在極坐標(biāo)下表示為一條正弦曲線
  1. 笛卡爾坐標(biāo)系中過點A和B的直線(直線AB),在極坐標(biāo)系中表現(xiàn)為兩條正弦曲線的相交(即一條正弦曲線表示過A的所有直線,一條正弦曲線表示過B的所有直線,兩條正弦曲線的交點就表示直線AB)
這張圖表明五點共線,就是五條正弦曲線交點處表示的那條直線

算法

現(xiàn)假設(shè)我們已經(jīng)有上文中所述的邊緣檢測的結(jié)果,這個邊緣檢測的結(jié)果與原圖等大,邊緣檢測結(jié)果中的值都是0-255之間的,假設(shè)一個原圖為640*480,其中邊緣點有n個(n<=640*480)。我們可以針對每一個邊緣點在極坐標(biāo)中畫一條正弦曲線(上述的性質(zhì)2),共n條正弦曲線。然后分別這些正弦曲線兩兩之間的交點坐標(biāo)是多少(只需要0~π之間的交點即可),時間復(fù)雜度是n(n-1)/2。然后尋找穿過的線最多的交點,一個交點有越多的線,就表示有越多點共線。
上述的算法是很顯然的,但是效率是O(n2),太低了。因此[2]作者做了如下的改進:

  1. 把ρ和θ離散化,例如ρ(-R<ρ<R)等分為2R份,步長為1,θ步長為1°,把180度等分180分。
  2. 建立一個二維數(shù)組(accumulator array),大小為2R*180,數(shù)組中的每個元素代表經(jīng)過當(dāng)前(ρ,θ)的直線的點的數(shù)量。
這個例子θ步長為20°,ρ步長為2

步驟

  1. 對每個點,找出他們在圖中的坐標(biāo)(x,y)
  2. 根據(jù)公式ρ=x·cosθ+y·sinθ,把x,y和θ(以上圖為例θ=0°、±20°、±40°、±60°……±160°)帶入算出ρ,在找出accumulator array中找到對應(yīng)的ρ并對數(shù)組中對應(yīng)計數(shù)+1
  3. 計算完所有點后,找出accumulator中最大的一些數(shù)(或設(shè)定一個閾值),他們的索引(ρ,θ)即為最后索引到的直線

OpenCV中的函數(shù)HoughLines

OpenCV中相關(guān)的函數(shù)有

cv2.HoughLinesP() # 與上述步驟略有不同
cv2.HoughLines() # 與上述步驟幾乎完全相同
cv2.HoughCircles() # 利用霍夫變換畫圓

其中,HoughLins中的參數(shù),rho和theta的含義就是上述表格中的ρ和θ的步長,threshold是閾值,即accumulator中大于threshold的直線會被選出,代表至少有threshold個點經(jīng)過了這條直線。min_theta和max_theta代表的是θ的范圍。

可以看出,HoughLines這個函數(shù)的執(zhí)行效率取決于rho、theta、min_theta和max_theta,當(dāng)然,也取決于邊緣檢測結(jié)果中邊緣像素的數(shù)量n。

參考文獻

[1] P.V.C. Hough,Machine Analysis of Bubble Chamber Pictures, Proc. Int. Conf. High Energy Accelerators and Instrumentation, 1959.

[2] Duda, R. O. and P. E. Hart, "Use of the Hough Transformation to Detect Lines and Curves in Pictures,"Comm. ACM, Vol. 15, pp. 11–15 (January, 1972).

[3] https://blog.csdn.net/songzitea/article/details/17027849

[4] https://blog.csdn.net/shanchuan2012/article/details/74010561

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容