霍夫變換和匹配_霍夫變換原理及實現(xiàn)_matlab練習(xí)程序(霍夫變換檢測直線斜率)
本文關(guān)鍵詞:霍夫變換,由筆耕文化傳播整理發(fā)布。
這個過去用就寫過,這次正好有人問這個算法,所以在這里又把C代碼改為了matlab了。
霍夫變換是把原圖像中的直線上的每一個點轉(zhuǎn)換到參數(shù)空間對應(yīng)的曲線上,由于每一個點對應(yīng)一條曲線,因此在參數(shù)空間中所有曲線會相交到一個點,,形成一個最值。因此原圖尋找直線斜率的問題就變成了參數(shù)空間尋找最值的問題了。
代碼如下:
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; (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; i=1:H w(i,1)=r; flag==1 || flag==3 %如果角度在1,3象限,卷積矩陣上下翻轉(zhuǎn) 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)方程對應(yīng)的參數(shù)空間的一條曲線 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; 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; figure;imshow(data) %形象的顯示參數(shù)空間曲線 sr_k=tan(jiaodu*pi/180) %設(shè)置的斜率 re_k=cos(theta)/sin(theta) %求得的斜率
30度時斜率是0.5774,霍夫變換求得的斜率是0.5736。
本文關(guān)鍵詞:霍夫變換,由筆耕文化傳播整理發(fā)布。
本文編號:96153
本文鏈接:http://sikaile.net/wenshubaike/shangbiaozhuanli/96153.html