本文由SimpleHappy (QQ:129****987)投稿,在此公衆号特别感謝! 空間域的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