Hough变换原始形式-直线检测
1.直角坐標(biāo)系與極坐標(biāo)系中的直線表示
1.1 直角坐標(biāo)系與極坐標(biāo)系 中的點(diǎn)的表示及它們之間相互關(guān)系
極坐標(biāo)系(polar coordinates)是指在平面內(nèi)由極點(diǎn)O、極軸L和極徑r組成的坐標(biāo)系,下圖就展示了一個(gè)極坐標(biāo)系,圖中兩個(gè)紅點(diǎn)是要利用極坐標(biāo)表示的兩個(gè)點(diǎn),黑色點(diǎn)是極坐標(biāo)系的極點(diǎn)
那么,極坐標(biāo)系和直角坐標(biāo)系之間什么關(guān)系呢?
1.在直角坐標(biāo)系下,點(diǎn)P的坐標(biāo)表示為(x,y)
2.在極坐標(biāo)系下,點(diǎn)的坐標(biāo)表示為(ρ,theta)
3.某一點(diǎn)由極坐標(biāo)轉(zhuǎn)換為直角坐標(biāo)
y=ρsinθ
注:圖中的r與上面的 ρ是同樣的描述
4.某一點(diǎn)直角坐標(biāo)轉(zhuǎn)換為極坐標(biāo)
- θ
根據(jù)點(diǎn)具體落到四個(gè)象限中的哪一個(gè),在arctan結(jié)果 的基礎(chǔ)上進(jìn)行修正,arctan結(jié)果位于(-π/2,π/2)區(qū)間,具體方法如下:
- 點(diǎn)位于第一象限,則該點(diǎn)的極角為arctan
- 點(diǎn)位于第二象限,則該點(diǎn)的極角為arctan+π
- 點(diǎn)位于第三象限,則該點(diǎn)的極角為arctan+π
- 點(diǎn)位于第四象限,則該點(diǎn)的極角為arctan+2
- 1.2 直角坐標(biāo)系與極坐標(biāo)系中的直線
在極坐標(biāo)系下,應(yīng)該如何表示直線方程呢?如上圖所示,有一直線L,點(diǎn)P是直線L上任意一點(diǎn),其對(duì)應(yīng)的直角坐標(biāo)為(x,y),該點(diǎn)的極坐標(biāo)為(φ,r)
,該直線距 離原點(diǎn)距離為ρ:
- 首先,利用直線距離原點(diǎn)的距離的計(jì)算公式,可得下式
ρ=r?cos(θ?φ)
- 首先,利用直線距離原點(diǎn)的距離的計(jì)算公式,可得下式
- 然后,對(duì)該式利用三角函數(shù)展開,可以得到
ρ=r?cos(θ?φ)=r?cos(θ)cos(φ)+r?sin(θ)sin(φ) - 又根據(jù)點(diǎn)P的直角坐標(biāo)系(x,y)與極坐標(biāo) (φ,r)之間 的關(guān)系
ρ=xcosθ+ysinθ
即直線的極坐標(biāo)方程! 也就是說,每一組參數(shù)ρ
(坐標(biāo)原點(diǎn)到直線的距離)和 θ(垂線 ρ與x軸正方向的夾角 )將唯一確定了一條直線!并且,在極坐標(biāo)系下,直線的方程就是一個(gè)點(diǎn)2.利用Hough變換檢測(cè)直線
2.1 線到點(diǎn)的Hough變換
2.1.1 通俗解釋
下面的例子形象地展示了如何利用Hough變換進(jìn)行直線檢測(cè)的過程,這里應(yīng)該注意,圖像中的一條直線其實(shí)就僅僅對(duì)應(yīng)于極坐標(biāo)系下(參數(shù)空間)的一個(gè)點(diǎn):
- 給定一幅圖像
- 檢測(cè)邊緣
- 對(duì)于任何一個(gè)邊緣點(diǎn),找到所有可能經(jīng)過該點(diǎn)的直線,這些直線每一條都對(duì)應(yīng)著參數(shù)空間中的一個(gè)點(diǎn),而無窮多條之間對(duì)應(yīng)于極坐標(biāo)系下的點(diǎn)將形成一條極坐標(biāo)系下的曲線
- 重復(fù)上面過程,每個(gè)邊緣點(diǎn)都對(duì)應(yīng)于極坐標(biāo)系下的一條曲線,那么,極坐標(biāo)系下 (參數(shù)空間)所有這些曲線的交點(diǎn)一定是原圖像中所有邊緣點(diǎn)共同存在的直線!
2.2 Hough變換檢測(cè)直線的實(shí)現(xiàn)
2.2.1 趙小川教程中的例子
- 假設(shè)一副圖像大小為M×M
- 原點(diǎn)距離直線的距離:ρ∈[?2 ̄√N,2 ̄√N]
原點(diǎn)到直線的垂線與x軸正方向的夾角: θ∈[0,π]
按照參數(shù)的取值范圍,將參數(shù)分為m×n
個(gè)網(wǎng)格,即將 θ∈[0,π]分為m份,將 ρ∈[?2 ̄√N,2 ̄√N]分為n份,然后,設(shè)定一個(gè) m×n的累加單元,用來存儲(chǔ)圖像中某一條直線出現(xiàn)的次數(shù)
接下來,對(duì)圖像中原圖像中每一個(gè)像素點(diǎn)(x,y),分別進(jìn)行如下操作:
- 在參數(shù)θ
- 的取值
- 然后,在相應(yīng)的參數(shù)累加單元中加1
按照上面操作,得到了一個(gè)累加單元,統(tǒng)計(jì)每個(gè)累加單元的取值,大于某個(gè)事先設(shè)定好的閾值,就認(rèn)為該組參數(shù)便是圖像空間內(nèi)的直線的參數(shù)
2.2.2 matlab自帶hough變換相關(guān)函數(shù)
matlab自帶了Hough變換的相關(guān)函數(shù):
- hough:實(shí)現(xiàn)霍夫變換,得到霍夫變換矩陣,用法如下
- [H, theta, rho] = hough(BW)
- 輸入BW為二值邊緣圖像
- 輸出H為參數(shù)空間參數(shù)的累加矩陣;
- 輸出theta為數(shù)值向量,存儲(chǔ)劃分參數(shù)空間的參數(shù)θ
- [H, theta, rho] = hough(BW)
- 的所有取值
- 這里增加了一組用來指定參數(shù)θ
- 的區(qū)間的范圍(及間隔),例如:0:0.5:50,(注:默認(rèn)值為[-90°,90°),間隔為1,單位為度)
houghpeaks:在霍夫變換矩陣?yán)镎覙O值點(diǎn)
- peaks = houghpeaks(H, numpeaks):找到hough變換矩陣中最大的numpeaks個(gè)值
- peaks = houghpeaks(…, param1, val1,param2, val2):對(duì)最大值提取進(jìn)行一些設(shè)置
- ’Threshold’:大于該閾值的點(diǎn)才會(huì)考慮是否為峰值,默認(rèn)值為0.5?max(H(:))
‘NHoodSize’:非極大值抑制窗的大小,默認(rèn)為 size(H)/50
houghlines:從霍夫變換矩陣中提取線段
- lines = houghlines(BW, theta, rho,peaks)
- BW為原始圖像邊緣
- theta為hough返回的參數(shù)θ
- 的區(qū)間間隔
- peaks為houghpeaks提取出來的hough變換的極值點(diǎn)
- lines = houghlines(…, param1, val1,param2, val2)
- 輸入值:’FillGap’:指定了與相同的霍夫變換相關(guān)的兩條線段的距離。當(dāng)兩條線段之間的距離小于指定的值時(shí),函數(shù)houghlines把線段合并為一條線段(默認(rèn)的距離是20個(gè)像素)
- 輸入值:’MinLength’:指定合并的線是保留還是丟棄。如果合并的線比val2指定的值短,就丟棄(默認(rèn)值是40)
- 輸出值:lines結(jié)構(gòu)元胞,分別存放合并后的所有直線的相關(guān)信息
- point1:兩元素向量[r1, c1],指定了線段起點(diǎn)的行列坐標(biāo)。
- point2:兩元素向量[r2, c2],指定了線段終點(diǎn)的行列坐標(biāo)。
- theta:與線相關(guān)的霍夫變換的以度計(jì)量的角度。
- rho:與線相關(guān)的霍夫變換的ρ軸位置。
1. 讀取圖像并得到邊緣圖像
% 讀取matlab自帶的圖像gantrycrane,并提取邊緣 RGB = imread('gantrycrane.png'); I = rgb2gray(RGB); BW = edge(I,'canny'); %提取邊緣 subplot(1,2,1);imshow(RGB);title('原始圖像'); subplot(1,2,2);imshow(BW);title('邊緣圖像');- 1
- 2
- 3
- 4
- 5
- 6
2. 利用Hough函數(shù)對(duì)輸入圖像邊緣進(jìn)行hough變換
% 對(duì)原始圖像邊緣進(jìn)行hough變換,指定參數(shù)的分別率(取樣間隔),區(qū)間利用默認(rèn)值 [H,T,R] = hough(BW,'RhoResolution',0.5,'ThetaResolution',0.5);- 1
- 2
- H為hough transform矩陣,每個(gè)元素分別存放的相應(yīng)參數(shù)對(duì)應(yīng)的累加
- T為存放theta的采樣值的向量
- R為存放rho采樣值的向量
3.顯示hough變換的結(jié)果,即顯示矩陣H(即bins)
% 顯示hough變換的結(jié)果 figure; imshow(imadjust(mat2gray(H)),'XData',T,'YData',R,...'InitialMagnification','fit'); title('Limited Theta Range Hough Transform of Gantrycrane Image'); xlabel('\theta'), ylabel('\rho'); axis on, axis normal; colormap(hot)- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
這里應(yīng)該注意,在進(jìn)行hough變換時(shí),并沒有對(duì)參數(shù)區(qū)間進(jìn)行限制,那么,如果按照下面方式對(duì)theta區(qū)間進(jìn)行限制,會(huì)得到什么結(jié)果呢?
[H,T,R] = hough(BW, 'Theta', 44:0.5:46);
這里可以看到,由于hough變換時(shí),限制了θ
的取值為[44,44.5,45,45.5,46];
4.顯示hough變換結(jié)果中的極值點(diǎn)
將hough變換矩陣中的前10個(gè)峰值提取出
- 1
- 2
- 3
- 4
- 5
其中的P的第一列存放的是提取到的極值點(diǎn)的rho的index,第二列存放的是提取到的極值點(diǎn)的theta的index
5.將提取得到的極值點(diǎn)變換回原圖像,得到提取的直線
% 找原圖中的直線 lines = houghlines(BW,T,R,P,'FillGap',18,'MinLength',80);- 1
- 2
注意到,這里面涉及幾個(gè)參數(shù):
- ‘FillGap’:當(dāng)兩條直線之間距離小于該閾值時(shí),兩條直線被合并為一條直線
- ‘MinLength’:保留的直線的最短長(zhǎng)度(即小于該閾值的直線將被刪除)
6.在原圖像中繪制得到的直線
% 繪制提取得到的直線 figure, imshow(I), hold on max_len = 0; for k = 1:length(lines)% 繪制第k條直線xy = [lines(k).point1; lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');% 繪制第k條直線的起點(diǎn)(黃色)、終點(diǎn)(紅色)plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');% 計(jì)算第k條直線的長(zhǎng)度,保留最長(zhǎng)直線的端點(diǎn)len = norm(lines(k).point1 - lines(k).point2);if ( len > max_len)max_len = len;xy_long = xy;end end title('提取到的直線');- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
3.Hough變換的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 抗噪能力強(qiáng)
- 對(duì)邊緣間斷不敏感
缺點(diǎn):
- 運(yùn)算量大:對(duì)圖像中每一個(gè)像素點(diǎn),都需要計(jì)算所有的theta對(duì)一個(gè)的rho
- 占用內(nèi)存多
Hough變換利用的是一種投票思想
Reference
總結(jié)
以上是生活随笔為你收集整理的Hough变换原始形式-直线检测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue中webpack默认配置_webp
- 下一篇: Hough Transform 的算法思