Hough變換提取直線 Matlab實現

2021-10-05 22:29:10 字數 3456 閱讀 9055

%用hough變換提取直線

%在對圖形進行直線檢測之前,需要對圖形進行邊緣檢測、二值化處理,用拉普拉斯演算法或canny提取邊緣

%hough變換思想

%1.在ρ、θ的極值範圍內對其分別進行 m,n 等分,設乙個二維陣列的下標與 ρi 、 θj 的取值 對應;

%2.對影象上的所有邊緣點作 hough 變換,求每個點在 θj (j=0,1,…,n)hough 變換後的 ρi,判斷( ρi 、 θj )與哪個陣列元素對應,則讓該陣列元素值加 1;

%3.比較陣列元素值的大小,最大值所對應的( ρi 、 θj )就是這些共線點對應的直線方程的引數。

close all

;clear;clc;

a=imread(

'fw6.tif');

figure;

a=a(:,

:,1)

;subplot(

221)

;imshow(a)

; bw1=lapulas(a)

;%呼叫自己編寫的拉普拉斯演算法進行邊緣檢測

subplot(

222)

;imshow(bw1)

;%bw1=edge(a,

'canny'

,0.2);

%imshow(bw1)

;subplot (

223)

;[h,theta,rho]

=*****hough(bw1)

;%呼叫自己編寫的hough函式,h為hough變換矩陣,theta和rho為霍夫變換的角度和半徑

imshow(h,

,'xdata'

,theta,

'ydata'

,rho,

'initialmagnification'

,'fit');

%畫出hough空間

xlabel(

'\theta (degrees)'

), ylabel(

'\rho');

axis on, axis square, hold on;

p = houghpeaks(h,6)

;%提取6個極值點

x = theta(p(:,

2));

y = rho(p(:,

1));

plot(x,y,

's',

'color'

,'red');

%標出極值點

title(

'hough空間');

lines = houghlines(bw1,theta,rho,p)

;%提取線段

subplot(

224)

imshow(a)

,hold on;

%為了在原圖上畫出直線段

for k =

1:length(lines)

xy =

[lines(k)

.point1; lines(k)

.point2]

; plot(xy(:,

1),xy(:,

2),'linewidth',1

,'color'

,'green');

%畫出線段

plot(xy(1,

1),xy(1,

2),'o'

,'linewidth',1

,'color'

,'yellow');

%起點plot(xy(2,

1),xy(2,

2),'o'

,'linewidth',1

,'color'

,'red');

%終點end

%hough變換函式

function [ hough, theta_range, rho_range ]

= *****hough(i)

[rows, cols]

= size(i)

;theta_maximum =90;

rho_maximum = floor(sqrt(rows^

2+ cols^2)

)-1;

theta_range =

-theta_maximum:theta_maximum -1;

rho_range =

-rho_maximum:rho_maximum;

hough = zeros(length(rho_range)

, length(theta_range));

for row =

1:rows

for col =

1:cols

if i(row, col)

>

0%only find: pixel >

0 x = col -1;

y = row -1;

for theta = theta_range

rho =

round

((x * cosd(theta))+

(y * sind(theta)))

; rho_index = rho + rho_maximum +1;

theta_index = theta + theta_maximum +1;

hough(rho_index, theta_index)

= hough(rho_index, theta_index)+1

; end

endend

endend

%拉普拉斯邊緣提取

function [p]

= lapulas(e)

r=e;

[m,n]

=size(e)

;%影象二值化後,拉普拉斯演算法提取邊緣

dd=sum

(sum

(e)/

(m*n));

for x=1:m

for y=1:n

if(r(x,y)

>=dd)

r(x,y)

=255

;else

r(x,y)=0

; end

endendsubplot(2,

2,3)

,imshow(r)

;title(

'二值化後影象');

p=zeros(m-

1,n-1)

;for ii=

2:m-

1for jj=

2:n-

1 p(ii,jj)

=r(ii,jj+1)

+r(ii,jj-1)

+r(ii+

1,jj)

+r(ii-

1,jj)-4

*(r(ii,jj));

endendp=uint8(p)

;end

小白練手,敬請斧正。

Hough 變換檢測直線

hough 變換檢測直線的基本原理是 對x y 座標系下的每一點 x,y 對應極座標下為 rho x cos theta y sin theta 1 因此,對x y平面內的每一點,對應到極座標系則為一條直線,如果直角座標系下的點共線,則在極座標的直線會相交於一點。因此,求得極座標下相交最多的點,rh...

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變換需要的緩衝...