天天看點

hough變換直線檢測_基于Hough變換原理實作圖像直線檢測【附源代碼】

hough變換直線檢測_基于Hough變換原理實作圖像直線檢測【附源代碼】

本文由SimpleHappy (QQ:129****987)投稿,在此公衆号特别感謝! 空間域的n個點在變換域中對應為n條曲線(如下左圖),這些曲線交點在空間域對應一條直線(如下右圖),這條直線經過之前空間域的若幹點,hough變換的目的就在于選出這樣的直線。程式中,Hough變換根據較高投票數确定,通過反變換得到直線。

hough變換直線檢測_基于Hough變換原理實作圖像直線檢測【附源代碼】
hough變換直線檢測_基于Hough變換原理實作圖像直線檢測【附源代碼】

以下是兩者的變換關系: ① 空間域到變換域:

hough變換直線檢測_基于Hough變換原理實作圖像直線檢測【附源代碼】

其中,

hough變換直線檢測_基于Hough變換原理實作圖像直線檢測【附源代碼】

注意上式的最值,程式設計中需要據此預定義投票矩陣。 ② 變換域到空間域:由

hough變換直線檢測_基于Hough變換原理實作圖像直線檢測【附源代碼】

知:

hough變換直線檢測_基于Hough變換原理實作圖像直線檢測【附源代碼】

注意此反變換,程式設計中利用投票矩陣找到後據此需要做變換得到直線。

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
           

處理效果圖

hough變換直線檢測_基于Hough變換原理實作圖像直線檢測【附源代碼】

好不好用隻有用了才知道!若覺得好,别忘分享給和您一樣愛學習研究的小夥伴哦!

hough變換直線檢測_基于Hough變換原理實作圖像直線檢測【附源代碼】

長按加入資源分享園地星球

封面圖檔:來源于alibaba.com.cn

hough變換直線檢測_基于Hough變換原理實作圖像直線檢測【附源代碼】

繼續閱讀