霍夫變換(轉(zhuǎn))
本文關(guān)鍵詞:霍夫變換,由筆耕文化傳播整理發(fā)布。
霍夫變換(轉(zhuǎn))
Hough變換用來(lái)在圖象中查找直線。它的原理很簡(jiǎn)單:假設(shè)有一條與原點(diǎn)距離為s,方向角為θ的一條直線,直線上的每一點(diǎn)都滿(mǎn)足方程7.1:
s = xcosθ + ysinθ
可以利用這個(gè)變換找出圖中最長(zhǎng)的直線,實(shí)現(xiàn)算法如下:
1.創(chuàng)建一個(gè)二維數(shù)組hDistAlpha,其中第一維表示距離s(計(jì)算可能出現(xiàn)的最大距離為,用來(lái)確定數(shù)組第二維的大小),第二維表示方向角θ(書(shū)上正好和我說(shuō)的相反,但看了程序以后我更堅(jiān)持自己的想法)。
2.創(chuàng)建一個(gè)二維數(shù)組Line,計(jì)算每條直線的上下兩個(gè)端點(diǎn)。
3.對(duì)圖像中的每個(gè)黑點(diǎn),角度的變化范圍從00到1780(角度每次增加20 ),按方程(7.1)求出對(duì)應(yīng)的距離s來(lái),相應(yīng)的數(shù)組元素[s][]加1,同時(shí)相應(yīng)的填寫(xiě)數(shù)組Line的內(nèi)容。
4.所有的象素都算完后,找到數(shù)組元素中最大的,就是最長(zhǎng)的那條直線。直線的端點(diǎn)可以在Line中找到。
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:
y = kx + b表示。對(duì)于直線上一個(gè)確定的點(diǎn)(x0,y0),有
y0 = kx0 + b這表示參數(shù)平面(k-b)中的一條直線。因此,圖像中的一個(gè)點(diǎn)對(duì)應(yīng)參數(shù)平面中的一條直線,圖像中的一條直線對(duì)應(yīng)參數(shù)平面中的一個(gè)點(diǎn)。對(duì)圖像上所有的點(diǎn)作霍夫變換,最終所要檢測(cè)的直線對(duì)應(yīng)的一定是參數(shù)平面中直線相交最多的那個(gè)點(diǎn)。這樣就在圖像中檢測(cè)出了直線。在實(shí)際應(yīng)用中,直線通常采用參數(shù)方程
p = xcosθ + ysinθ.霍夫變換是圖像處理中從圖像中識(shí)別幾何形狀的基本方法之一,應(yīng)用很廣泛,也有很多改
進(jìn)算法。最基本的霍夫變換是從黑白圖像中檢測(cè)直線(線段)。
我們先看這樣一個(gè)問(wèn)題:設(shè)已知一黑白圖像上畫(huà)了一條直線,要求出這條直線所在的位置
。我們知道,直線的方程可以用y=k*x+b 來(lái)表示,其中k和b是參數(shù),分別是斜率和截距。過(guò)某一點(diǎn)
(x0,y0)的所有直線的參數(shù)都會(huì)滿(mǎn)足方程y0=kx0+b。即點(diǎn)(x0,y0)確定了一族直線。方程y0=kx0+b在
參數(shù)k--b平面上是一條直線,(你也可以是方程b=-x0*k+y0對(duì)應(yīng)的直線)。這樣,圖像x--y平面上的
一個(gè)前景像素點(diǎn)就對(duì)應(yīng)到參數(shù)平面上的一條直線。我們舉個(gè)例子說(shuō)明解決前面那個(gè)問(wèn)題的原理。設(shè)
圖像上的直線是y=x, 我們先取上面的三個(gè)點(diǎn):A(0,0), B(1,1), C(22)。可以求出,過(guò)A點(diǎn)的直線
的參數(shù)要滿(mǎn)足方程b=0, 過(guò)B點(diǎn)的直線的參數(shù)要滿(mǎn)足方程1=k+b, 過(guò)C點(diǎn)的直線的參數(shù)要滿(mǎn)足方程
2=2k+b, 這三個(gè)方程就對(duì)應(yīng)著參數(shù)平面上的三條直線,而這三條直線會(huì)相交于一點(diǎn)(k=1,b=0)。 同
理,原圖像上直線y=x上的其它點(diǎn)(如(3,3),(4,4)等) 對(duì)應(yīng)參數(shù)平面上的直線也會(huì)通過(guò)點(diǎn)(k=1,b=0)
。這個(gè)性質(zhì)就為我們解決問(wèn)題提供了方法:
首先,我們初始化一塊緩沖區(qū),對(duì)應(yīng)于參數(shù)平面,將其所有數(shù)據(jù)置為0.
對(duì)于圖像上每一前景點(diǎn),求出參數(shù)平面對(duì)應(yīng)的直線,把這直線上的所有點(diǎn)的值都加1。
最后,找到參數(shù)平面上最大點(diǎn)的位置,這個(gè)位置就是原圖像上直線的參數(shù)。
上面就是霍夫變換的基本思想。就是把圖像平面上的點(diǎn)對(duì)應(yīng)到參數(shù)平面上的線,最后通過(guò)
統(tǒng)計(jì)特性來(lái)解決問(wèn)題。假如圖像平面上有兩條直線,那么最終在參數(shù)平面上就會(huì)看到兩個(gè)峰值點(diǎn),
依此類(lèi)推。
在實(shí)際應(yīng)用中,y=k*x+b形式的直線方程沒(méi)有辦法表示x=c形式的直線(這時(shí)候,直線的斜
率為無(wú)窮大)。所以實(shí)際應(yīng)用中,是采用參數(shù)方程p=x*cos(theta)+y*sin(theta)。這樣,圖像平面
上的一個(gè)點(diǎn)就對(duì)應(yīng)到參數(shù)p---theta平面上的一條曲線上。其它的還是一樣。
在看下面一個(gè)問(wèn)題:我們要從一副圖像中檢測(cè)出半徑以知的圓形來(lái)。這個(gè)問(wèn)題比前一個(gè)還
要直觀。我們可以取和圖像平面一樣的參數(shù)平面,以圖像上每一個(gè)前景點(diǎn)為圓心,以已知的半徑在
參數(shù)平面上畫(huà)圓,并把結(jié)果進(jìn)行累加。最后找出參數(shù)平面上的峰值點(diǎn),這個(gè)位置就對(duì)應(yīng)了圖像上的
圓心。在這個(gè)問(wèn)題里,圖像平面上的每一點(diǎn)對(duì)應(yīng)到參數(shù)平面上的一個(gè)圓。
把上面的問(wèn)題改一下,假如我們不知道半徑的值,而要找出圖像上的圓來(lái)。這樣,一個(gè)辦
法是把參數(shù)平面擴(kuò)大稱(chēng)為三維空間。就是說(shuō),參數(shù)空間變?yōu)閤--y--R三維,對(duì)應(yīng)圓的圓心和半徑。
圖像平面上的每一點(diǎn)就對(duì)應(yīng)于參數(shù)空間中每個(gè)半徑下的一個(gè)圓,這實(shí)際上是一個(gè)圓錐。最后當(dāng)然還
是找參數(shù)空間中的峰值點(diǎn)。不過(guò),,這個(gè)方法顯然需要大量的內(nèi)存,運(yùn)行速度也會(huì)是很大問(wèn)題。
有什么更好的方法么?我們前面假定的圖像都是黑白圖像(2值圖像),實(shí)際上這些2值圖像
多是彩色或灰度圖像通過(guò)邊緣提取來(lái)的。我們前面提到過(guò),圖像邊緣除了位置信息,還有方向信息
也很重要,這里就用上了。根據(jù)圓的性質(zhì),圓的半徑一定在垂直于圓的切線的直線上,也就是說(shuō),
在圓上任意一點(diǎn)的法線上。這樣,解決上面的問(wèn)題,我們?nèi)圆捎?維的參數(shù)空間,對(duì)于圖像上的每
一前景點(diǎn),加上它的方向信息,都可以確定出一條直線,圓的圓心就在這條直線上。這樣一來(lái),問(wèn)
題就會(huì)簡(jiǎn)單了許多。
接下來(lái)還有許多類(lèi)似的問(wèn)題,如檢測(cè)出橢圓,正方形,長(zhǎng)方形,圓弧等等。這些方法大都
類(lèi)似,關(guān)鍵就是需要熟悉這些幾何形狀的數(shù)學(xué)性質(zhì)。霍夫變換的應(yīng)用是很廣泛的,比如我們要做一
個(gè)支票識(shí)別的任務(wù),假設(shè)支票上肯定有一個(gè)紅顏色的方形印章,我們可以通過(guò)霍夫變換來(lái)對(duì)這個(gè)印
章進(jìn)行快速定位,在配合其它手段進(jìn)行其它處理。霍夫變換由于不受圖像旋轉(zhuǎn)的影響,所以很容易
的可以用來(lái)進(jìn)行定位。
霍夫變換有許多改進(jìn)方法,一個(gè)比較重要的概念是廣義霍夫變換,它是針對(duì)所有曲線的,
用處也很大。就是針對(duì)直線的霍夫變換也有很多改進(jìn)算法,比如前面的方法我們沒(méi)有考慮圖像上的
這一直線上的點(diǎn)是否連續(xù)的問(wèn)題,這些都要隨著應(yīng)用的不同而有優(yōu)化的方法。
posted on
本文關(guān)鍵詞:霍夫變換,由筆耕文化傳播整理發(fā)布。
本文編號(hào):67052
本文鏈接:http://sikaile.net/wenshubaike/shangbiaozhuanli/67052.html