最近在看圖像處理的東西夜只,為了檢測直線蒜魄,可以用的一個(gè)神奇的東西---Hough變換谈为。
一條直線可以用如下的方程來表示:y=kx+b,k是直線的斜率粘茄,b是截距秕脓。
圖像是一個(gè)個(gè)離散的像素點(diǎn)構(gòu)成的,如果在圖像中有一條直線嘹朗,那也是一系列的離散點(diǎn)構(gòu)成的屹培。那么怎樣檢測這些離散的點(diǎn)構(gòu)成了直線呢怔檩?
我們?cè)倏瓷厦娴闹本€方程:y=kx+b,(x,y)就是點(diǎn)。我們轉(zhuǎn)換下變成:b=-kx+y媒吗。我們是不是也可以把(k乙埃,b)看作另外一個(gè)空間中的點(diǎn)介袜?這就是k-b參數(shù)空間。
我們看到辙喂,圖1中巍耗,在x-y圖像空間中的一個(gè)點(diǎn),變成了k-b參數(shù)空間中的一條直線灸蟆,而x-y圖像空間中的2點(diǎn)連成的直線亲族,變成了k-b參數(shù)空間中的一個(gè)交點(diǎn)孽水。
如果x-y圖像空間中有很多點(diǎn)在k-b空間中相交于一點(diǎn)城看,那么這個(gè)交點(diǎn)就是我們要檢測的直線测柠。這就是霍夫變換檢測直線的基本原理。
當(dāng)然谒主,有一個(gè)問題需要注意赃阀,圖像空間中如果一條直線是垂直的,那么斜率k是沒有定義的(或者說無窮大)观游。為了避免這個(gè)問題懂缕,霍夫變換采用了另一個(gè)參數(shù)空間:距離-角度參數(shù)空間王凑。
平面上的一個(gè)點(diǎn)也可以用距離-角度來定義索烹,也就是極坐標(biāo):
那么在圖像中术荤,每一個(gè)點(diǎn)都可以用距離和角度來表達(dá):?但是,使用距離-角度后端圈,點(diǎn)(x,y)與距離舱权,角度的關(guān)系變成了:
ρ=xcosθ+ysinθ? ?(1)
x=ρcosθ宴倍,xcosθ=ρcosθ^2? (2)? ?y=ρsinθ,? ? ysinθ=ρsinθ^2? ? ?(3)
由(2)加(3)便可得到(1)
于是,在新的距離-角度參數(shù)空間中俗他,圖像中的一個(gè)點(diǎn)變成了一個(gè)正弦曲線(比如阔逼,當(dāng)x=1嗜浮,y=1時(shí),ρ=xcosθ+ysinθ=cosθ+2sinθ=根號(hào)2*sin(θ+pi/4)?)畏铆,而不是k-b參數(shù)空間中的直線了辞居。這些正弦曲線的交點(diǎn)就是圖像空間中我們要檢測的直線了寨腔。
我們普通圖片是的線條可以表示為 y=m0x+b0 ,在霍夫(參數(shù))空間就是一個(gè)點(diǎn)
相反迫卢,圖片上的點(diǎn)在霍夫空間就可以表示為線倚搬,我們要檢測線條的話,就可以把圖像上的每個(gè)點(diǎn)轉(zhuǎn)換到霍夫空間去乾蛤,找到霍夫空間上線條相交的點(diǎn)每界,就可以確定參數(shù)m, b
但是我們知道如果是垂直線的話,它的斜率不存在家卖,那又怎么辦呢?
這樣就有了另一種直線表達(dá)方法 ρ=xcosθ+ysinθ
無論采用xy坐標(biāo)還是極坐標(biāo)眨层,原空間的點(diǎn)都對(duì)應(yīng)參數(shù)空間的曲線,原空間的直線都對(duì)應(yīng)著參數(shù)空間中曲線的交點(diǎn)上荡。如下圖所示趴樱,可以根據(jù)在參數(shù)空間中每個(gè)grid相交點(diǎn)的出現(xiàn)次數(shù)尋找原空間中的直線。
意思就是叁征,屬于同一條直線上點(diǎn)在極坐標(biāo)空間(ρ,θ)必然在一個(gè)點(diǎn)上有最強(qiáng)的信號(hào)出現(xiàn)纳账,根據(jù)此反算到平面坐標(biāo)中就可以得到直線上各點(diǎn)的像素坐標(biāo),從而得到直線捺疼。
說了這么多原理疏虫,那么對(duì)于一張具體的圖片,我們?nèi)绾螜z測其中的直線呢啤呼?
首先對(duì)圖像邊緣檢測卧秘,二值化(即灰度值為0(黑),灰度值為255(白))官扣,這樣我們的圖像中就只看到了白色的物體邊緣翅敌,其他的都是黑的,然后提取出這些灰度值為255(白色)的像素惕蹄,對(duì)每個(gè)像素進(jìn)行Hough變換哼御。
一個(gè)像素點(diǎn)在參數(shù)空間對(duì)應(yīng)一條正弦曲線(上面的理論說過),也有原圖像中的一條直線在參數(shù)空間中對(duì)應(yīng)一點(diǎn)(ρ焊唬,θ)。這也就是說看靠,找到像素點(diǎn)對(duì)應(yīng)正弦曲線的交點(diǎn)(ρ0赶促,θ0),反變換回來便得到由像素點(diǎn)構(gòu)成的直線(把ρ0挟炬,θ0帶入?ρ=xcosθ+ysinθ中鸥滨,就是ax+by-c=0,這是一條直線鞍妗)婿滓。
就說這么多吧,以后有新的體會(huì)再補(bǔ)充粥喜。