MATLAB实现的霍夫变换直线拟合 直线检测

实验要求,生成5条直线并添加噪声,使用霍夫变换拟合直线

霍夫变换原理请参考此博客:https://blog.csdn.net/u010712012/article/details/86104053

  • 实验代码
clc  
clear  
%生成五条标准直线用于直线检测%  
% x1=sort(100.*rand(1,100));  
% y1=-4*x1+2;  
% data1=[x1;y1];  
% x2=sort(10+100.*rand(1,100));  
% y2=x2+4;  
% data2=[x2;y2];  
% x3=sort(100.*rand(1,100));  
% y3=14*x3+6;  
% data3=[x3;y3];  
% x4=sort(100.*rand(1,100));  
% y4=-7*x4+8;  
% data4=[x4;y4];  
% x5=sort(100.*rand(1,100));  
% y5=6*x5+10;  
% data5=[x5;y5];  
% data=[data1,data2,data3,data4,data5];%构建点集  
  
%生成五条带噪声直线用于直线拟合%  
%两个数据集二选一使用  
x1=sort(100.*rand(1,100));  
y1=x1+2+2.*rand(1,100);  
data1=[x1;y1];  
x2=sort(100.*rand(1,100));  
y2=-4*x2+4+4.*randn(1,100);  
data2=[x2;y2];  
x3=sort(100.*rand(1,100));  
y3=16*x3+6+6.*rand(1,100);  
data3=[x3;y3];  
x4=sort(100.*rand(1,100));  
y4=-7*x4+8+8.*rand(1,100);  
data4=[x4;y4];  
x5=sort(100.*rand(1,100));  
y5=6*x5+10+10.*randn(1,100);  
data5=[x5;y5];  
data=[data1,data2,data3,data4,data5];%构建点集  
[m,n]=size(data);%统计点数  
%构建霍夫空间  
n_max=300;%霍夫空间的纵轴最大值  
h=zeros(315,2*n_max);  
theta_i=1;  
sigma=70;%设置拟合阈值  
i=0;  
%直线公式推导  
%y=sin(theta)/cos(theta)*x+b  
%->p=b*cos(theta)=-sin(theta)*x+cos(theta)*y  
for theta=0:0.01:3.14  
    p=[-sin(theta),cos(theta)];  
    d=p*data;  
    for i=1:n  
   %由于霍夫空间中d比较大,对d值进行了缩放  
    h(theta_i,round(d(i)/10+n_max))=h(theta_i,round(d(i)/10+n_max))+1;  
    end  
    theta_i=theta_i+1;  
end  
[theta_x,p]=find(h>sigma);%查找投票数大于sigma的位置  
l_number=size(theta_x);%符合直线条数  
r=(p-n_max)*10;%将还原回距离R  
theta_x=0.01*theta_x;%将theta还原  
figure('color','w');  
plot(data(1,:),data(2,:),'*');  
hold on  
x_line=0:20:100;  
  
for i=1:l_number  
    if(abs(cos(theta_x(i)))<0.01)%斜率不存在的情况  
        x=r(i);y=1:100;  
        plot(x,y,'r');  
    else  
        y=tan(theta_x(i))*x_line+r(i)/cos(theta_x(i));%画出拟合曲线  
        plot(x_line,y,'r');  
    end  
end  
hold off  
figure('color','w');  
imshow(uint8(10*h));%展示霍夫空间结果  

实验结果展示

  • 总结反思

当斜率过大时,由于tan函数的性质,小的角度误差,会引起大的斜率误差;想要拟合结果更精确可以增加角度theta的分辨率;

部分错误直线可能由于数据集分布问题,造成某一直线上分布有大量点而引起错误 

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页