Hough 變換檢測直線

2021-06-15 04:14:26 字數 1242 閱讀 3642

hough 變換檢測直線的基本原理是 對x-y 座標系下的每一點(x,y),對應極座標下為:

rho =x*cos(theta) +y* sin(theta)                     (1) 

,因此,對x-y平面內的每一點,對應到極座標系則為一條直線,如果直角座標系下的點共線,則在極座標的直線會相交於一點。因此,求得極座標下相交最多的點,(rho, theta) ,代入(1),則可求出最多的點所在直線的方程。

將theta 劃分為 1到 179 格,每格為1, 由(1),rho 的最大值為 sqrt(x*x+ y*y) , 可以推出

rho =sqrt(x*x+ y*y)* (cos(theta+theta2))    (2)

theta2  為任意角,因此可以知道  - sqrt(x*x+ y*y)      < rho < sqrt(x*x+ y*y) ,取 theta 為 0-179 ,則對每乙個theta ,代入(1)  ,求得rho ,取整,累計求和,統計rho 最大值 ,如果有多個最大值,說明有多條直線? 

以下程式能夠基本實現檢測直線功能,角度會有1度的誤差。劃分的時候以1為單位。 

function [rho,thta]=my_hough(f)

[m,n]=size(f);

[r,c]=find(f); 

l=length(r);

d=ceil(sqrt((m)*(m)+(n)*(n)));  %rho=x*cos()+y*sin() ,rho最大值為sqrt((m)*(m)+(n)*(n))

h=zeros(2*d,180); %%注意現實中是0-179 

for i=1:l

for theta=1:180

rho=ceil(r(i)*cos( theta*pi/180)+c(i)*sin(theta*pi/180));

if rho>0

h(d+rho,theta) = h(d+rho,theta)+1;

else 

h(d+rho,theta) = h(d+rho,theta)+1; 

endend

end[wuro,sita]=find(h==max(h(:))); %可能存在兩種情況

%wuro-d ;%%%求得的rho=aa-d

rho=wuro(1)-d ;

thta=sita(1)*pi/180;

參考文獻 

數字影象處理 matlab 版本 岡薩雷斯  p297 。

學習 opencv 177-183 

Hough變換檢測直線

1 基本原理 hough變換是影象處理中從影象中識別幾何形狀的基本方法之一,即它可以檢測已知形狀的目標,而且受雜訊和曲線間斷的影響小。hough變換的基本思想是利用點 線的對偶性。如下圖1所示 從圖1中可看出,x y座標和k b座標有點 線的對偶性。x y座標中的點p1 p2對應於k b座標中的l1...

通過hough變換檢測直線

函式功能 通過hough變換檢測直線 引數說明 imgbinaryin,表示二值圖象 width,表示圖象寬 height,表示圖象高 houghbuf,表示hough變換需要的緩衝區指標 houghwidth,表示hough變換需要的緩衝區的寬 houghheight,表示hough變換需要的緩衝...

Hough變換檢測直線和圓

1 直線是如何表示的?對於平面中的一條直線,在直角座標系中,常見的有點斜式,兩點式兩種表示方法。然而在hough變換中,考慮的是另外一種表示方式 使用極座標 r,theta 來表示一條直線。其中r為該直線到原點的距離,theta為該直線的垂線與x軸的夾角。如下圖所示。2 如果座標系中有多個點,又怎樣...