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的分辨率;

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

  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值