任务一:Hough变换直线检测演示
在matlab中构建脚本m文件,执行下述语句,并对每句语句进行注释;熟悉hough、houghpeaks、houghlines函数的用法。
程序代码:
I=imread('chepai.jpg');
I=rgb2gray(I);
figure,imshow(I);
rotI=imrotate(I,14, 'crop');%旋转图像
BW=edge(rotI,'canny');%边缘检测图像
[H,T,R]=hough(BW);%H是函数返回的Hough变换矩阵 ,T和R分别是对应变换过来的极坐标(ρ,θ)中的θ和ρ
imshow(H,[],'XData',T,'YData',R,...
'InitialMagnification','fit');%以极坐标的形式显示检测的直线
xlabel('\theta'),ylabel('\rho');
axis on,axis normal,hold on;
P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));%选出hough变换中的五个极值点,筛选的阈值为最大值乘以0.3
x=T(P(:,2));y=R(P(:,1));
plot(x,y,'s','color','white');%将五个极值点标出来
lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);
%当两条线的距离小于5时,houghlines函数就会将这两条线合并成一条线,否则就保存。
figure,imshow(rotI),hold on
max_len=0;
%将检测到的直线和端点显示出来。
for k=1:length(lines)
xy=[lines(k).point1;lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
len=norm(lines(k).point1-lines(k).point2);
if(len>max_len)
max_len=len;
xy_long=xy;
end
end
%将最长的直线用蓝色表示。
plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','blue');
运行结果:
任务二:自编hough变换函数
自编matlab函数文件执行Hough变换,实现上述hough(houghpeaks、houghlines)函数的与houghpeaks及houghlines的性能做对比分析。
程序代码:
function [H,T,R] = my_hough(BW)
[m,n]=size(BW);
BW=imrotate(BW,14, 'crop');%旋转图像
theta_max=90;
rho_max=floor(sqrt(m^2+n^2))-1;
T=-theta_max:theta_max-1;
R=-rho_max:rho_max;
H=zeros(length(R),length(T));
for i=1:1:m
for j=1:1:n
if BW(i,j)>0
x=j-1;
y=i-1;%转换坐标系
for theta=T
rho=round((x*cosd(theta))+(y*sind(theta)));
rho_index=rho+rho_max+1;
theta_index=theta+theta_max+1;
H(rho_index,theta_index)=H(rho_index,theta_index)+1;
end
end
end
end
imshow(H,[],'XData',T,'YData',R,...
'InitialMagnification','fit');%以极坐标的形式显示检测的直线
xlabel('\theta'),ylabel('\rho');
axis on,axis normal,hold on;
P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));%选出hough变换中的五个极值点,筛选的阈值为最大值乘以0.3
x=T(P(:,2));y=R(P(:,1));
plot(x,y,'s','color','white');%将五个极值点标出来
lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);
%当两条线的距离小于5时,houghlines函数就会将这两条线合并成一条线,否则就保存。
end
运行结果:
并与houghpeaks做对比分析。