霍夫變換直線檢測及原理理解

2021-08-17 20:43:03 字數 1497 閱讀 5328

今天有小夥伴提到直線檢測,我便講了霍夫變換,歸納分享下:

首先,介紹笛卡爾空間,就是我們常見的那個幾何空間啦,通過 y=kx+b,可以表示直線。

然後,想一下,如果把上面方程變形一下,b=-xk+y,(k和b作為變數,xy作為常量),那麼是不是又是一條另外的直線呢?對了,這就是霍夫空間了。

然後,你一不小心,發現兩個規律:

①霍夫空間,笛卡爾空間中的直線,對應到霍夫空間中是乙個點;

②笛卡爾空間中共線的點,在霍夫空間中對應的直線相交。(這個很重要,因為在笛卡爾空間中,我要做直線檢測,豈不就是要找到最多的點所在的那條線嘛,我把所有的點都對映到霍夫空間中,找到最多的線公共交點就可以了。)

再然後,你會發現乙個問題,如果是一條垂直於x軸的直線,那麼k豈不是正無窮,怎麼辦?

沒關係,引進極座標表示直線:ρ=xcosθ+ysinθ(ρ為原點到直線的距離),如圖所示:

再然後,就可以將笛卡爾空間和霍夫空間做映**。

總結下上面的過程,如下圖:

繼續然後,上面紅色字型:找到最多的線公共交點就可以了,怎麼找?

哈哈,直接小白方式尋找,把霍夫空間網格化(就是乙個很大的矩陣,初始值全是0),直線經過的地方標註1,沒經過的地方還是0。再找出值最大的一些點就可以了。

好了,舉個栗子:

對一幅影象進行直線檢驗(如下圖)

①對其進行邊緣檢測

②邊緣檢測後並二值化,就可以通過找非零點的座標確定資料點

③對資料點進行霍夫變換,就形成了下面那個第三個圖,好像乙個水管,其實是很多很多曲線組成

④找出其中數值較大的一些點,通常可以給定乙個閾值,threshold一下,上面不是說了嘛,數值較大的點(我用紅框框出來了)說明對應笛卡爾空間共線。

⑤最後得到那個有彩色直線的圖,完成了直線檢測。

上面的過程講述原理,到此結束,算了,再舉個栗子吧:

ok,這裡over了。

還要然後,這個怎麼coding啊?不急,直接opencv了。

c++的函式,直接呼叫就好:

void houghlines(inputarray image, outputarray lines, double rho, double theta, int threshold, double srn=0, double stn=0 )

霍夫變換檢測直線

對於結構化道路的檢測,常用的方法是採用霍夫變換檢測道路中的直線段。一條直線可以看做是影象上的若干個畫素點組成,也可以用一條直線方程來表示,如 y kx b,那麼霍夫變換檢測直線段其實是將影象畫素點空間變換到引數空間,對於直線來說就是引數 k,b 也可以用來檢測其他形狀如圓和橢圓,只是引數空間表示不一...

霍夫變換檢測直線

對於線性目標提取時,霍夫變換是個很好的手段,博主在這裡做了 實驗,在乙個影象中畫上圓和矩形,通過霍夫變換提取矩形的邊緣。編譯環境為matlab2014a,如下。霍夫變換,找到矩形影象的邊界,用彩色表示出來,矩形和圓不重疊 clc clear all close all i zeros 256,256...

霍夫變換 檢測直線

將笛卡爾座標系的直線用統計展示 座標系a中的點 座標系b中的線 座標系a中的線 座標系b中的點 a中多點的連線 b中多曲線的交點 先理解這樣乙個思維 那麼x y座標系中,點a對應k b座標系的綠直線,點b對應k b座標系的紅直線,連線a b兩點的直線對應,紅綠直線的交點 這裡呼應了上一部分第4點 直...