基于Hough变换原理实现图像直线检测【附源代码】

2fb1f493ad69609df03e08177d0ec6c9.png

本文由SimpleHappy (QQ:129****987)投稿,在此公众号特别感谢!


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

f97f833969bf78d0cb97c5ecab6ab83d.png239a8d2c4e64924c30abd5c78a07dfba.png

以下是两者的变换关系:

① 空间域到变换域:

57309c84cf9287e019500f0ec0e7c8cf.png

其中,

e8558d7a22a09c674b39081fdc539bf1.png

注意上式的最值,编程中需要据此预定义投票矩阵。

② 变换域到空间域:

d90df878d0cd7a89dc1ff750379535d3.png

知:

425e163f72cc2c4a43890f37c6585f44.png

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

4114ff8d48b12e10c0fb3b67f426def3.jpeg

(本素材来源于alibaba.com.cn)

图像二值化与边缘检测

clear;clc
I1=imread('p1.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');

投票矩阵H的计算

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

处理效果图

622539c71f6d4063bd32c251ed1db44c.jpeg

好不好用只有用了才知道!若觉得好,别忘分享给和您一样爱学习研究的小伙伴哦!

长按加入资源分享园地星球

封面图片:来源于alibaba.com.cn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值