用matlab实现Hough直线检查

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

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

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

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读取存储各种文件的方法 文末有独家金曲分享
