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