Hough是基於特徵值提取技術的圖像變換方案。Hough運用兩個坐標空間的之間的變換將在一個空間中具有相同形狀的曲線或直線映射到另一個坐標空間的一個點上形成峰值,從而把檢測任意形狀的問題轉換為統計峰值問題。
基本原理
Hough變換是利用表決原理的參數軌跡技術,說到參數估計,大家能夠想到過冷水做的有關概率統計的推文不?——統計分布講解。基本原理在於利用圖像空間和Hough參數空間點與線的對偶性,把圖像空間中檢測問題轉換為參數空間。通過在參數空間裡進行簡單的累加統計,然後在Hough參數空間尋找累加器峰值的方法找檢測直線。Hough變換的實質是將圖像空間內具有一定關係的像元進行聚類,尋找能把這些像元用某一解析形勢聯繫起來的參數空間累計對應點。在參數空間不超過二維的情況下,這種變換效果理想。將原始圖像空間的給定的曲線表達形式變為參數空間的一個點,這樣就把原始圖像中給定曲線的檢測問題轉化為尋找參數空間的峰值問題,也就是把檢測整體特性轉化為檢測局部特性,例如直線、橢圓、圓、弧線等。
簡而言之,Hough變換思想是:在原始圖像坐標系下的一個點對應了參數坐標系中的一條直線同樣參數坐標系的一條直線對應原始坐標系下的一個點,然後,坐標系下呈現直線的所有點,它們的斜率和截距是相同的,所以它們在參數坐標系下對應於同一個點。這樣在原始坐標系下的各個點的投影到多數坐標系下之後,看參數坐標系下沒有聚集點,這樣的聚集點就對應了原始坐標系下的直線。
在圖像處理中,從圖像中識別幾何形狀的基本方法之一是Hough變換,它有很多改進算法。最基本的Hough變換是從黑白圖像中檢測直線。廣義的Hough變換已經不僅僅局限於提取直線,二值任意可以用表達式表達的曲線都可以提取,例如圓、橢圓、正弦餘弦曲線等。曲線越是複雜.所需參數越多,運算的時間也就越多。Hough 變換的精髓在於投票算法,將圖像空間轉換到參數空間進行求解。假如已知黑白圖像上畫了一 條直線,要求出這條 直線所在的位置。直線的方程用y=kx+b來表示,其中k和b是參數,分別是斜率和截距,過某一點(x0,y0)的所有直線的參數都會滿足方程y0=kx0+b,即點(x0,y0)確定了一組直線。方程y0=kx0+b在參數k-b平面上是一條直線,這樣,圖像x-y平面上的一個像素點就對應到參數k-b平面上的一條直線。Hough變換的基本思想就是把圖像平面上的點對應到參數平面上的線。在實際應用中,y=kx+b形式的直線方程沒有辦法表示x=c形式的直線。
Hough進行邊緣檢測
clear f=imread('11.png'); %讀入彩色圖像,注意不能使用灰度圖像o=f; %保留彩色原圖f=rgb2gray(f); %將彩色圖像轉換為灰度圖像,[檢查下看能否運行,給的代碼裡沒有這個程序。沒有運行結果]f=im2double(f);figure();subplot(231);imshow(o);title('原圖');[m,n]=size(f); %得到圖像矩陣行數m,列數nfor i=3:m-2 for j=3:n-2 %處理領域較大,所以從圖像(3,3)開始,在(m-2,n-2)結束 %LoG算子 l(i,j)=-f(i-2,j)-f(i-1,j-1)-2*f(i-1,j)-f(i-1,j+1)-f(i,j-2)-2*f(i,j-1)+16*f(i,j)-2*f(i,j+1)...-f(i,j+2)-f(i+1,j-1)-2*f(i+1,j)-f(i+1,j+1)-f(i+2,j); endendsubplot(232);imshow(l);title('LoG算子提取圖像邊緣');
%均值化濾波處理[m,n]=size(l);for i=2:m-1 for j=2:n-1 %LoG算子提取邊緣後,對結果進行均值濾波以去除噪聲,為下一步hough變換提取直線作準備 y(i,j)=l(i-1,j-1)+l(i-1,j)+l(i-1,j+1)+l(i,j-1)+l(i,j)+l(i,j+1)+l(i+1,j-1)+l(i+1,j)+l(i+1,j+1); y(i,j)=y(i,j)/9; endendsubplot(233);imshow(y);title('均值濾波器處理後')
%二值化處理q=im2uint8(y);[m,n]=size(q);for i=1:m for j=1:n if q(i,j)>80; %設置二值化的閾值為80 q(i,j)=255; %對圖像進行二值化處理,使圖像邊緣更加突出清晰 else q(i,j)=0; end endendsubplot(234);imshow(q);title('二值化處理後');
%Hough變換檢測直線,使用(a,p)參數空間,a∈[0,180],p∈[0,2d])a=180; %角度的值為0到180度d=round(sqrt(m^2+n^2)); %圖像對角線長度為p的最大值s=zeros(a,2*d); %存儲每個(a,p)個數z=cell(a,2*d); %用元胞存儲每個被檢測的點的坐標for i=1:m for j=1:n %遍歷圖像每個點 if(q(i,j)==255) %只檢測圖像邊緣的白點,其餘點不檢測 for k=1:a %對每個點從1到180度遍歷,取得經過該點的所有直線的p值 p = round(i*cos(pi*k/180)+j*sin(pi*k/180)); %若p大於0,則將點存儲在(d,2d)空間 if(p > 0) s(k,d+p)=s(k,d+p)+1; %(a,p)相應的累加器單元加1 z{k,d+p}=[z{k,d+p},[i,j]']; %存儲點坐標 else ap=abs(p)+1; %若p小於0,則將點存儲在(0,d)空間 s(k,ap)=s(k,ap)+1; %(a,p)相應的累加器單元加一 z{k,ap}=[z{k,ap},[i,j]'];%存儲點坐標 end end end endendfor i=1:a for j=1:d*2 %檢查每個累加器單元中存儲數量 if(s(i,j) >35) %將提取直線的閾值設為35 lp=z{i,j}; %提取對應點坐標 %對滿足閾值條件的累加器單元中(a,p)對應的所有點進行操作 for k=1:s(i,j) o(lp(1,k),lp(2,k),1)=255; %每個點R分量=255,G分量=0,B分量=0 o(lp(1,k),lp(2,k),2)=0; o(lp(1,k),lp(2,k),3)=0; %為滿足閾值要求的直線上的點賦紅色 end end endendsubplot(235)imshow(o);title('hough變換提取邊界直線'); 該代碼案例還包含了其它邊緣檢測的手段,本文沒有提及 方式可以查看往期大神帶你玩轉matlab圖像處理推文。本期過冷水就重點講講Hough變換,對圖像變換其它問題感興趣的可以留言共同探討,往期回顧>>>>>>統計分布講解
三維空間分布函數繪製實例
大神帶你玩轉matlab圖像處理 (一)
一文帶你輕鬆搞定matlab各種數據讀寫
過冷水帶您走進matlab數據轉換新世界
十萬個matlab編程問題徵集,歡迎來問
MATLAB編程愛好者Q群正式升級為2000人群,歡迎加入!
在matlab愛好者公眾號中回復「QQ」,加入公眾號專屬Q群(非免費),與更多matlab愛好者一起交流;回復「原創」,加入原創代碼共享Q群,小編原創matlab代碼任性領!
如需轉載,請在公眾號中回復「轉載」獲取授權,未經授權擅自搬運抄襲的,必將追究其責任!