一、簡介
霍夫變換(Hough Transform)是影像處理中的一種特征提取技術,它通過一種投票演算法檢測具有特定形狀的物體,該程序在一個引數空間中通過計算累計結果的區域最大值得到一個符合該特定形狀的集合作為霍夫變換結果,霍夫變換于1962年由Paul Hough 首次提出[53],后于1972年由Richard Duda和Peter Hart推廣使用[54],經典霍夫變換用來檢測影像中的直線,后來霍夫變換擴展到任意形狀物體的識別,多為圓和橢圓,
霍夫變換運用兩個坐標空間之間的變換將在一個空間中具有相同形狀的曲線或直線映射到另一個坐標空間的一個點上形成峰值,從而把檢測任意形狀的問題轉化為統計峰值問題,上一節中已經介紹了車道的直線特征,本節中介紹hough變換檢測直線的原理和檢測結果,
我們知道,一條直線在直角坐標系下可以用y=kx+b表示, 霍夫變換的主要思想是將該方程的引數和變數交換,即用x,y作為已知量k,b作為變數坐標,所以直角坐標系下的直線y=kx+b在引數空間表示為點(k,b),而一個點(x1,y1)在直角坐標系下表示為一條直線y1=x1·k+b,其中(k,b)是該直線上的任意點,為了計算方便,我們將引數空間的坐標表示為極坐標下的γ和θ,因為同一條直線上的點對應的(γ,θ)是相同的,因此可以先將圖片進行邊緣檢測,然后對影像上每一個非零像素點,在引數坐標下變換為一條直線,那么在直角坐標下屬于同一條直線的點便在引數空間形成多條直線并內交于一點,因此可用該原理進行直線檢測,

如圖 所示,對于原圖內任一點(x,y)都可以在引數空間形成一條直線,以圖中一條直線為例有引數(γ,θ)=(69.641,30°),所有屬于同一條直線上的點會在引數空間交于一點,該點即為對應直線的引數,由該圖中所有直線所得到的(γ,θ)在引數空間中得到一系列對應曲線見圖 霍夫統計變換結果,

二、源代碼
clear all;
close all;
i=imread('yanjing.bmp');
imshow(i);
iii=i;
%把輸入圖象二值化,用canny演算法回傳閾值
sigma=3.0;
thresh=[0.03,0.09];
bw_1=i>70;
edgerm=edge(bw_1,'canny',thresh,sigma);
figure,imshow(edgerm);
t1=280;
s=0;
while t1>10
t2=1;
while t2<310
%查找第一個邊緣點
if edgerm(t1,t2)==1
u1=t1;
u2=t2;
s=1;
end
if s==1
break;
end
t2=t2+1;
end
t1=t1-1;
end
po=1;
sum2=0;
%第一個邊緣點
o1=u1;
o2=u2;
hang=zeros(0,0);
lie=zeros(0,0);
while (po==1)
while (po==1)
sum1=0;
for t3=1:5
for t4=1:5
% 第一個邊緣點的左上方5個像素內有邊緣點
if edgerm(u1-t3+1,u2+t4-1)==1
% 第一個邊緣點周圍的邊緣點個數
sum1=sum1+1;
sum2=sum2+1;
% 第sum1個邊緣點位置x
hang(sum1,1)=u1-t3+1;
% 第sum1個邊緣點位置y
hang(sum1,2)=u2+t4-1;
lie(sum2,1)=u1-t3+1;
lie(sum2,2)=u2+t4-1;
end
end
end
% 邊緣點只有一個
if sum1==1
po=0;
% 沒有邊緣點
elseif sum1==0
po=0;
else
% 以最后的邊緣點為起點,進行下一輪搜索
u1=hang(sum1,1);
u2=hang(sum1,2);
po=1;
end
end
% 邊緣點個數小于30個
if sum2<30
u1=o1;
u2=o2+1;
po=1;
sum2=0;
% 橫坐標不變,改變縱坐標值得到邊緣點
while (edgerm(u1,u2)~=1)
while (edgerm(u1,u2)~=1)&(u2<310)
% 不是邊緣點,縱坐標加1
u2=u2+1;
end
% 沒有得到邊緣點
if u2==310
u1=u1-1;
u2=1;
end
end
% x不變,改變y重新得到邊緣點
o1=u1;
o2=u2;
else
break;
end
end
% 邊緣點個數
a1=size(lie);
w1=lie(a1(1),1);
w2=lie(a1(1),2);
po1=1;
while (po1==1)
sum1=0;
for t1=1:3
for t2=1:5
% 邊緣點向左方3個像素,上方5個像素
if edgerm(w1-t1+1,w2-t2+1)==1
sum1=sum1+1;
sum2=sum2+1;
lie(sum2,1)=w1-t1+1;
lie(sum2,2)=w2-t2+1;
hang(sum1,1)=w1-t1+1;
hang(sum1,2)=w2-t2+1;
end
end
end
% 邊緣點只有一個
if sum1==1
po1=0;
else
po1=1;
w1=hang(sum1,1);
w2=hang(sum1,2);
end
end
po2=1;
while (po2==1)
sum1=0;
for t1=1:7
for t2=1:15
if edgerm(w1+t1-1,w2-t2+1)==1
sum1=sum1+1;
sum2=sum2+1;
lie(sum2,1)=w1+t1-1;
lie(sum2,2)=w2-t2+1;
hang(sum1,1)=w1+t1-1;
hang(sum1,2)=w2-t2+1;
end
end
end
if sum1==1
po2=0;
else
po2=1;
w1=hang(sum1,1);
w2=hang(sum1,2);
end
end
%不止一個邊緣點
while (w1~=lie(1,1))&(w2~=lie(1,2))
sum1=0;
for t1=1:5
for t2=1:5
%向右向上5個像素搜索邊緣點
if edgerm(w1+t1-1,w2+t2-1)==1
sum1=sum1+1;
sum2=sum2+1;
lie(sum2,1)=w1+t1-1;
lie(sum2,2)=w2+t2-1;
hang(sum1,1)=w1+t1-1;
hang(sum1,2)=w2+t2-1;
end
end
end
w1=hang(sum1,1);
w2=hang(sum1,2);
end
for t1=1:280
for t2=1:320
% 初始化Hough矩陣
e(t1,t2)=0;
end
end
% 邊緣點個數
for t1=1:size(lie)
% 將是邊緣點的位置設為1
e(lie(t1,1),lie(t1,2))=1;
end
%確定瞳孔的邊緣的上下限
minl=320;
maxl=1;
minh=280;
maxh=1;
for t1=1:280
for t2=1:320
if (e(t1,t2)==1)&(t2<minl)
minl=t2;
end
if (e(t1,t2)==1)&(t2>maxl)
maxl=t2;
end
if (e(t1,t2)==1)&(t1<minh)
minh=t1;
end
if (e(t1,t2)==1)&(t1>maxh)
maxh=t1;
end
end
end
% 采用二值化的方法求得瞳孔的面積sum3
sum3=0;
t1=minh;
while t1<=maxh
t2=minl;
while t2<=maxl
if (bw_1(t1,t2)==0)
sum3=sum3+1;
end
t2=t2+1;
end
t1=t1+1;
end
% 得到瞳孔r1半徑向上取整,sum3表示瞳孔的面積
r1=ceil(sqrt(sum3/pi));
% 向下取整 估算出瞳孔圓心x坐標
c(1,1)=floor((maxh-minh)/2+minh);
c(1,2)=ceil((maxl-minl)/2+minl);
r2=ceil(r1/3);
r3=2*r2;
for t1=1:ceil(r1/6)*2
for t2=1:ceil(r1/6)*2
pu(t1,t2)=0;
end
end
%pu中存放有相同圓心點的個數,以下找一個最大的pu認為是瞳孔的圓心
t1=minh;
while t1<=maxh
t2=minl;
while t2<=maxl
if (e(t1,t2)==1)
for a=1:2*ceil(r1/6)
for b=1:2*ceil(r1/6)
if (((t1-(c(1,1)+ceil(r1/6)-a))^2+(t2-(c(1,2)-ceil(r1/6)+b))^2-r1^2)>-10)&(((t1-(c(1,1)+ceil(r1/6)-a))^2+(t2-(c(1,2)-ceil(r1/6)+b))^2-r1^2)<10)
% 以a,b為圓心的圓累加個數
pu(a,b)=pu(a,b)+1;
end
end
end
end
t2=t2+1;
end
t1=t1+1;
end
ma=pu(1,1);
% 選取同心圓最多的圓心
for a=1:2*ceil(r1/6)
for b=1:2*ceil(r1/6)
if (ma<pu(a,b))
ma=pu(a,b);
row=a;
col=b;
end
end
end
% 圓心坐標
c(1,1)=c(1,1)+ceil(r1/6)-row;
c(1,2)=c(1,2)-ceil(r1/6)+col;
j=double(i);
for t1=1:280
for t2=1:320
%虹膜內邊緣設為白色
if ((t1-c(1,1))^2+(t2-c(1,2))^2-r1^2<80)&((t1-c(1,1))^2+(t2-c(1,2))^2-r1^2>-80)
i(t1,t2)=255;
end
end
end
row1=c(1,1);
col1=c(1,2);
%以上找到圓心(row1,col1),半徑r1;
ha=row1;
li=col1;
sh1=1;
zong=0;
while sh1<=3
sh2=1;
while sh2<=3
zong=zong+1;
% 圓心向左、不變、向右移動2
row1=ha-4+sh1*2;
col1=li-4+sh2*2;
j1=double(i);
u=zeros(0,0);
for t1=1:row1
t2=col1;
while t2<=310
%第一像限的影像對角變換
u(row1-t1+1,t2-col1+1)=j1(t1,t2);
t2=t2+1;
end
end
u1=double(u);
%第一像限影像的行列數
yy=size(u);
%瞳孔半徑r1
rr=r1+40;
l1=r1+40;
l2=1;
ll1=0;
n1=l1;
sq1=0;
%yy(1,2)表示第一像限的矩陣列數,yy(1,1)行數
while (l2<l1)&(l1<yy(1,2))&(l2<yy(1,1))
pk=(l1-1/2)^2+(l2+1)^2-rr^2;
%半徑在rr+40范圍內
if pk<0
%沿著l1方向灰度值累加
sq1=sq1+u1(l2+1,l1);
%記錄sql的個數
ll1=ll1+1;
l1=l1;
l2=l2+1;
else sq1=sq1+u1(l2+1,l1-1);
ll1=ll1+1;
l1=l1-1;
l2=l2+1;
end
end
三、運行結果




四、備注
完整代碼或者代寫添加QQ 1564658423
往期回顧>>>>>>
【信號處理】基于matlab HMM的睡眠狀態檢測【含Matlab原始碼 050期】
【信號處理】基于matlab CDR噪聲和混響抑制【含Matlab原始碼 051期】
【信號處理】基于matlab最小二乘法解決稀疏信號恢復問題【含Matlab原始碼 052期】
【信號處理】基于matlab小波變換的音頻水印嵌入提取【含Matlab原始碼 053期】
【信號處理】基于matlab ICA演算法信號分離【含Matlab原始碼 054期】
【信號處理】基于matlab GUI界面的脈搏信號之脈率存檔【含Matlab原始碼 237期】
【信號處理】基于matlab GUI界面的虛擬信號發生器(各種波形)【含Matlab原始碼 271期】
【信號處理】基于matlab GUI界面信號發生器之電子琴【含Matlab原始碼 272期】
【信號處理】基于matlab的數字電子琴設計與實作【含Matlab原始碼 273期】
【雷達通信】基于matlab的雷達數字信號處理【含Matlab原始碼 281期】
【雷達通信】基于matlab線性調頻(LFM)脈沖壓縮雷達仿真【含Matlab原始碼 283期】
【雷達通信】基于mtatlab距離多普勒(RD)、CS、RM演算法的機載雷達成像【含Matlab原始碼 284期】
【雷達通信】《現代雷達系統分析與設計》大作業【含Matlab原始碼 285期】
【信號處理】基于matlab GUI語音信號綜合處理平臺【含Matlab原始碼 290期】
【信號處理】基于matlab GUI語音信號采集【含Matlab原始碼 291期】
【信號處理】基于matlab GUI語音幅度調制【含Matlab原始碼 292期】
【信號處理】基于matlab GUI語音合成【含Matlab原始碼 293期】
【信號處理】基于matlab GUI語音基頻識別【含Matlab原始碼 294期】
【信號處理】基于matlab GUI語音信號加密解密【含Matlab原始碼 295期】
【信號處理】基于matlab小波變換的語音增強【含Matlab原始碼 296期】
【信號處理】基于matlab GUI語音傅立葉變換降噪混頻【含Matlab原始碼 297期】
【信號處理】基于matlab GUI維納濾波之語音增強【含Matlab原始碼 298期】
【音頻處理】基于matlab GUI語音信號處理2【含Matlab原始碼 299期】
【雷達通信】基于matlab GUI雷達定位【含Matlab原始碼 302期】
【雷達通信】基于matlab GUI雷達脈沖壓縮【含Matlab原始碼 303期】
【雷達通信】基于matlab GUI雷達定位模擬【含Matlab原始碼 304期】
【雷達通信】基于matlab SVM識別雷達資料【含Matlab原始碼 305期】## 標題
【邊緣檢測】基于matlab插值法亞像素邊緣檢測【含Matlab原始碼 306期】
【模式識別】基于matlab GUI貝葉斯最小錯誤率手寫數字識別【含Matlab原始碼 308期】
【模式識別】基于matlab PCA手寫數字識別【含Matlab原始碼 309期】
【模式識別】基于matlab 特征匹配的英文印刷字符識別【含Matlab原始碼 310期】
【模式識別】基于matlab知識庫的手寫體數字識別【含Matlab原始碼 311期】
【模式識別】基于matlab之銀行卡數字識別【含Matlab原始碼 312期】
【影像識別】基于matlab表情檢測【含Matlab原始碼 317期】
【影像檢測】基于matlab LSD直線檢測【含Matlab原始碼 318期】
【影像融合】紅外與可見光的融合與配準演算法【含Matlab原始碼 319期】
【影像識別】基于matlab幀差法跌倒檢測【含Matlab原始碼 320期】
【影像識別】基于matlab組合BCOSFIRE過濾器進行墻體裂縫識別【含Matlab原始碼 321期】
【模式識別】基于matlab中值濾波和二值化的跌倒檢測【含Matlab原始碼 344期】
【影像隱寫】基于matlab DCT的影像隱寫【含Matlab原始碼 365期】
【影像隱寫】基于matlab LSB的影像隱寫提取【含Matlab原始碼 366期】
【影像隱寫】基于matlab高斯模型的JPEG影像隱寫【含Matlab原始碼 367期】
【影像隱寫】基于matlab影像自適應隱寫演算法wow【含Matlab原始碼 368期】
【模式識別】基于matlab GUI SVM和PCA的人臉識別【含Matlab原始碼 369期】
【視頻識別】基于matlab軌跡方法行為識別【含Matlab原始碼 375期】
【模式識別】基于matlab GUI HSV和RGB模型水果分類【含Matlab原始碼 380期】
【影像處理】基于matlab GUI數字影像處理平臺【含Matlab原始碼 381期】
【影像分割】基于matlab的視網膜影像分割【含Matlab原始碼 382期】
【模式識別】基于matlab k-means聚類的手勢識別【含Matlab原始碼 386期】
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263817.html
標籤:其他
