matlab練習程序(霍夫變換檢測直線斜率)


  這個過去用就寫過,這次正好有人問這個算法,所以在這里又把C代碼改為了matlab了。

  霍夫變換是把原圖像中的直線上的每一個點轉換到參數空間對應的曲線上,由於每一個點對應一條曲線,因此在參數空間中所有曲線會相交到一個點,形成一個最值。因此原圖尋找直線斜率的問題就變成了參數空間尋找最值的問題了。

代碼如下:

clear all;
close all;
clc;


%%
%以下只是做一個帶直線的圖像而已
r=300;           
jiaodu=30;      %更改這個值測試,90度270度時不管用
jiaodu1=mod(jiaodu,360);     
flag=0;

if jiaodu1>=0 && jiaodu1<90
    jiaodu1=jiaodu1;
    flag=1;
end

if jiaodu1>=90 && jiaodu1<180
    jiaodu1=180-jiaodu1;
    flag=2;
end

if jiaodu1>=180 && jiaodu1<270
    jiaodu1=jiaodu1-180;
    flag=3;
end

if jiaodu1>=270 && jiaodu1<360
    jiaodu1=360-jiaodu1;
    flag=4;
end

H=floor(r*sin(jiaodu1*pi/180));
W=floor(r*cos(jiaodu1*pi/180));

if mod(H,2)==0
    H=H+1;
end

if mod(W,2)==0
    W=W+1;
end

w=zeros(H,W);
if jiaodu1 ~= 90 && jiaodu1 ~= 270
    for i=1:H
        for j=1:W
            tmp=floor(j*tan(jiaodu1*pi/180));
            if tmp+1==i
                w(i,j)=r;
            end
        end
    end
else
    for i=1:H
        w(i,1)=r;
    end
end
if flag==1 || flag==3       %如果角度在1,3象限,卷積矩陣上下翻轉
    w=flipud(w);        
end
%%
%下面是真正的霍夫變換
img=mat2gray(w);      %處理這個圖像
[m n]=size(img);
imshow(img);

data=zeros(314,2*(m+n));
for i=1:m                       %將圖像二維空間的一個點映射到p=x*cos(theta)+y*sin(theta)方程對應的參數空間的一條曲線
    for j=1:n
        if img(i,j)==1            
            for theta=0.01:0.01:3.14
                data(round(theta*100),round(i*sin(theta)+j*cos(theta)+m+n))= ...
                data(round(theta*100),round(i*sin(theta)+j*cos(theta)+m+n))+1;
            end        
        end
    end
end

theta=0;
ma=0;
for i=1:314                 %尋找曲線相交最多的那個點,即找最大值
    for j=1:2*(m+n)
        if data(i,j)>ma
            ma=data(i,j);
            theta=i/100;
            rou=j-m-n;
        end
    end
end
figure;imshow(data)     %形象的顯示參數空間曲線

sr_k=tan(jiaodu*pi/180)     %設置的斜率
re_k=cos(theta)/sin(theta)  %求得的斜率

做出的一條直線

參數空間中的曲線

30度時斜率是0.5774,霍夫變換求得的斜率是0.5736。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM