首页/文章/ 详情

用matlab实现Hough直线检查

3年前浏览1921

image.png

 过冷水诚挚邀请你加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载,群号:927550334 

QQ图片20210424105303.png

        空间域的n个点在变换域中对应为n条曲线(如下左图),这些曲线交点在空间域对应一条直线(如下右图),这条直线经过之前空间域的若干点,hough变换的目的就在于选出这样的直线。程序中,Hough变换根据较高投票数确定,通过反变换得到直线。

untitled7.jpguntitled8.jpg

以下是两者的变换关系:

空间域到变换域:

image.png            

变换域到空间域:

image.png

注意此反变换,编程中利用投票矩阵找到后据此需要做变换得到直线。

untitled6.jpg


clear;clc
I1=imread('1.jpg');              % 可以自行找图片素材
I1=I1(:,:,1);
thresh=graythresh(I1);            %自动确定二值化阈值
I3=im2bw(I1,thresh);              %对图像二值化 
BW=edge(I3,'sobel');              %边缘检测
[m,n]=size(BW);
[r,c]=find(BW==1);                %找到待判断点
f=waitbar(0,'1','Name','进度');   %设置进度条
set(f,'color','w');

maxRou=ceil(max(sqrt(r.^2 c.^2)));     %rou=Asin(a b),其中maxrou=A=(x^2 y^2)^1/2;
H=ones(181,maxRou*2 1);                %初始化投票矩阵
for i=1:length(r)
    x=r(i);y=c(i);
    for theta=0:180
        rou=ceil(x*cosd(theta) y*sind(theta)); %ρ 
        ii=theta 1;                            %theta>=-90
        jj=rou maxRou 1;                       %rou>=-maxRou
        H(ii,jj)=H(ii,jj) 1;
    end
    waitbar(i/length(r),f,sprintf(['已完成: ',num2str(i/length(r)),'%']));
end

K=90;                %检测阈值
[row,line]=find(H>K);
theta=0:180;
imshow(I1);
for i=1:length(row)
    theta0=theta(row(i));
    rou0=line(i)-maxRou;
    %求对应的直线
    x=1:m;
    y=-x*cotd(theta0) rou0/sind(theta0);
    hold on
    plot(y,x,'g-','LineWidth',3);%plot起点在图像左上角,按(col,row)画图
end

图片

        过冷水发表于 仿真秀 平台原创文章,未经授权禁止私自转载,如需转载请需要和作者沟通表明授权声明,未授权文章皆视为侵权行为,必将追责。如果您希望加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载均可加群:927550334。

精品回顾

 matlab绘制农夫过河动态图

分子动力学的原子空间运动轨迹演示编程

过冷水带你用matlab制作演示动画

python批量移动文件&重命名代码分享

过冷水和你分享 matlab读取存储各种文件的方法 文末有独家金曲分享

image.png

理论科普代码&命令MATLAB
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2021-05-05
最近编辑:3年前
过冷水
博士 | 讲师 讨论号:927550334
获赞 361粉丝 184文章 107课程 11
点赞
收藏
作者推荐

¥5 5.0
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈