日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Hough变换原始形式-直线检测

發(fā)布時(shí)間:2025/3/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hough变换原始形式-直线检测 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)

x=ρcosθ
y=ρsinθ

注:圖中的r與上面的 ρ是同樣的描述

4.某一點(diǎn)直角坐標(biāo)轉(zhuǎn)換為極坐標(biāo)

  • θ
的具體取值還需要根據(jù)點(diǎn)P具體位于哪個(gè)象限進(jìn)行調(diào)整,根據(jù)點(diǎn)的直角坐標(biāo)可以判斷其位于哪個(gè)象限,具體判斷方法如下圖如示
根據(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(θ?φ)

  • 然后,對(duì)該式利用三角函數(shù)展開,可以得到
    ρ=r?cos(θ?φ)=r?cos(θ)cos(φ)+r?sin(θ)sin(φ)

  • 又根據(jù)點(diǎn)P的直角坐標(biāo)系(x,y)與極坐標(biāo) (φ,r)之間 的關(guān)系
r?cos(φ)=xr?sin(φ)=y,可以得到
ρ=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
,根據(jù)該圖像尺寸,設(shè)定hough變換的參數(shù)空間取值范圍
  • 原點(diǎn)距離直線的距離:ρ[?2N,2N]

原點(diǎn)到直線的垂線與x軸正方向的夾角: θ[0,π]

按照參數(shù)的取值范圍,將參數(shù)分為m×n

個(gè)網(wǎng)格,即將 θ[0,π]分為m份,將 ρ[?2N,2N]分為n份,然后,設(shè)定一個(gè) m×n

的累加單元,用來存儲(chǔ)圖像中某一條直線出現(xiàn)的次數(shù)

接下來,對(duì)圖像中原圖像中每一個(gè)像素點(diǎn)(x,y),分別進(jìn)行如下操作:

  • 在參數(shù)θ
對(duì)應(yīng)的每一取值,分別按照公式 ρ=xcosθ+ysinθ計(jì)算相應(yīng)的參數(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ù)θ
的所有取值;輸出rho為數(shù)值向量,存儲(chǔ)劃分參數(shù)空間的參數(shù) ρ
  • 的所有取值
[H, theta, rho] = hough(BW, ParameterName,ParameterValue)
  • 這里增加了一組用來指定參數(shù)θ
ρ的區(qū)間范圍(及間隔)‘RhoResolution’:指定參數(shù) θ的區(qū)間的間隔‘ThetaResolution’:指定參數(shù) ρ的區(qū)間的間隔‘Rho’:指定參數(shù) ρ的區(qū)間的范圍(及間隔),例如:1:0.5:100(注:默認(rèn)值為(0,norm(size(BW))),即最大值為圖像對(duì)角線長(zhǎng)度,間隔為1)‘Theta’:指定參數(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ū)間間隔rho為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í),限制了θ

的范圍,所以,得到的H矩陣只對(duì)應(yīng)了[44:0.5:46]這個(gè)范圍內(nèi)的參數(shù),具體地, θ

的取值為[44,44.5,45,45.5,46];

4.顯示hough變換結(jié)果中的極值點(diǎn)
將hough變換矩陣中的前10個(gè)峰值提取出

% 顯示霍夫變換矩陣中的極值點(diǎn) P = houghpeaks(H,10,'threshold',ceil(0.3*max(H(:)))); % 從霍夫變換矩陣H中提取50個(gè)極值點(diǎn) x = T(P(:,2));%極值點(diǎn)的theta值,即P的第二列存放的是極值點(diǎn)的theta值 y = R(P(:,1));%極值點(diǎn)的rho值,即P的第二列存放的是極值點(diǎn)的rho值 hold on;plot(x,y,'s','color','black');
  • 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

% 以紅色線高亮顯示最長(zhǎng)的線 plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','red');
  • 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

  • stackoverflow=explain hough transformation.http://stackoverflow.com/questions/4709725/explain-hough-transformation
  • Polar and Cartesian Coordinates. https://www.mathsisfun.com/polar-cartesian-coordinates.html
  • 百度百科.http://baike.baidu.com/link?url=mSklh9U7fzEEBhsSzfU1rkB4LOKwyptqZREe6KSd1VoNddlX4KVw92d644BVODlklByXHBv2V0fsemww4pD61q
  • http://www.nabla.hr/Z_MemoHU-015.htm
  • hough變換是如何檢測(cè)出直線和圓的? http://blog.163.com/yuyang_tech/blog/static/21605008320130233343990/
  • 現(xiàn)代數(shù)字圖像處理技術(shù)提高及應(yīng)用案例詳解(MATLAB版). 趙小川

  • 總結(jié)

    以上是生活随笔為你收集整理的Hough变换原始形式-直线检测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。