前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Hough变换原理实现图像直线检测【附源代码】

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

作者头像
巴山学长
发布2020-05-29 10:43:10
8290
发布2020-05-29 10:43:10
举报
文章被收录于专栏:巴山学长

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

以下是两者的变换关系:

① 空间域到变换域:

其中,

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

② 变换域到空间域:

知:

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

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

图像二值化与边缘检测

代码语言:javascript
复制
clear;clcI1=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的计算

代码语言:javascript
复制
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

寻找较高投票数对应的θ与ρ

代码语言:javascript
复制
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

处理效果图

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 巴山学长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档