本文由SimpleHappy (QQ:129****987)投稿,在此公众号特别感谢!
空间域的n个点在变换域中对应为n条曲线(如下左图),这些曲线交点在空间域对应一条直线(如下右图),这条直线经过之前空间域的若干点,hough变换的目的就在于选出这样的直线。程序中,Hough变换根据较高投票数确定,通过反变换得到直线。 以下是两者的变换关系: ① 空间域到变换域:
空间域的n个点在变换域中对应为n条曲线(如下左图),这些曲线交点在空间域对应一条直线(如下右图),这条直线经过之前空间域的若干点,hough变换的目的就在于选出这样的直线。程序中,Hough变换根据较高投票数确定,通过反变换得到直线。 以下是两者的变换关系: ① 空间域到变换域:
其中,
注意上式的最值,编程中需要据此预定义投票矩阵。 ② 变换域到空间域:由 知: 注意此反变换,编程中利用投票矩阵找到后据此需要做变换得到直线。(本素材来源于alibaba.com.cn)
图像二值化与边缘检测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的计算 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
处理效果图 好不好用只有用了才知道!若觉得好,别忘分享给和您一样爱学习研究的小伙伴哦! 长按加入资源分享园地星球
封面图片:来源于alibaba.com.cn