霍夫變換和匹配_霍夫變換原理及實(shí)現(xiàn)_matlab練習(xí)程序(霍夫變換檢測(cè)直線斜率)
本文關(guān)鍵詞:霍夫變換,由筆耕文化傳播整理發(fā)布。
這個(gè)過(guò)去用就寫(xiě)過(guò),這次正好有人問(wèn)這個(gè)算法,所以在這里又把C代碼改為了matlab了。
霍夫變換是把原圖像中的直線上的每一個(gè)點(diǎn)轉(zhuǎn)換到參數(shù)空間對(duì)應(yīng)的曲線上,由于每一個(gè)點(diǎn)對(duì)應(yīng)一條曲線,因此在參數(shù)空間中所有曲線會(huì)相交到一個(gè)點(diǎn),,形成一個(gè)最值。因此原圖尋找直線斜率的問(wèn)題就變成了參數(shù)空間尋找最值的問(wèn)題了。
代碼如下:
clear all; close all; clc; %% %以下只是做一個(gè)帶直線的圖像而已 r=300; jiaodu=30; %更改這個(gè)值測(cè)試,90度270度時(shí)不管用 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); %處理這個(gè)圖像 [m n]=size(img); imshow(img); data=zeros(314,2*(m+n)); for i=1:m %將圖像二維空間的一個(gè)點(diǎn)映射到p=x*cos(theta)+y*sin(theta)方程對(duì)應(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 %尋找曲線相交最多的那個(gè)點(diǎn),即找最大值 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度時(shí)斜率是0.5774,霍夫變換求得的斜率是0.5736。
本文關(guān)鍵詞:霍夫變換,由筆耕文化傳播整理發(fā)布。
本文編號(hào):96153
本文鏈接:http://www.sikaile.net/wenshubaike/shangbiaozhuanli/96153.html