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