霍夫變換直線檢測基本原理

2021-07-25 09:23:31 字數 2334 閱讀 8146

1、在白紙上畫出乙個直角座標系,任意給出乙個點;

2、那麼,對於點(x0,y0),經過這個點的直線必定滿足y0=k*x0+b, 其中k是直線的斜率,b是直線的截距;

3、上式可以化成b=y0-k*x0,  可以看作是以-x0為斜率,以y0為截距,在k-b空間上的乙個直線方程(k,b為變數);

4、可見,k-b空間上的一條直線,代表了x-y空間經過特定點的所有直線,而x-y上的特定直線責備k-b空間上的特定點表示;

利用這個原理,我們可以通過一下方法檢測可能出線的直線:

1、得到一副邊緣影象;

2、對影象中的每乙個邊緣點,在k-b空間中畫出一條直線;(任意的劃線)

3、在各直線的交點,我們採取「投票」(vote)的方法,即累加:n條直線的交點,改點的值為n;

4、遍歷k-b空間,尋找出先區域性最大值(極值)的點,這些點的座標(k,b)就是影象中可能出線的直線的斜率和截距;

為了容易理解,這裡採用了直線的斜截表達法。

事實上這種方法並不使用,因為某些直線的斜率很大的甚至不存在。

實際操作中,檢測直線的霍夫變換使用含極座標引數的直線表示型式,簡稱極座標式(不是極座標方程,因為還是在笛卡爾座標下表示)

這樣,每條直線對應於theta-p空間下的一條正弦曲線,同樣採用投票求極值的方法尋找曲線

這裡涉及到三個函式:hough,houghpeaks,houghlines:

1、[h,t,r] = hough(bw,'theta',20:0.1:75)    ; (輸入二值影象bw,角度範圍與步進(最大,[-90, 90)),返回 h-霍夫空間,t-theta,r-p);

2、peaks = houghpeaks(h,numpeaks)      ;(輸入霍夫空間和極值數量,返回極值的座標)

3、lines=houghlines(bw,t,r,peaks)        ; (返回lines是乙個包含影象中線段首末點、p、theta的結構體)

ihsv=rgb2hsv(i);
iv=ihsv(:,:,3);%提取v空間
ivl=iv(500:end,:);%擷取下半部
iedge=edge(ivl,'

sobel

');%邊沿檢測 

iedge = imdilate(iedge,ones(3));%影象膨脹 %新建視窗,繪圖用
figure (2) imshow(iedge); hold on %左方直線檢測與繪製
%得到霍夫空間
[h1,t1,r1] = hough(iedge,'

theta

',20:0.1:75); 

%求極值點 peaks=houghpeaks(h1,5);
%得到線段資訊
lines=houghlines(iedge,t1,r1,peaks);

%繪製線段 

for k=1:length(lines)
xy=[lines(k).point1;
lines(k).point2];
plot(xy(:,1),xy(:,2),'

linewidth

',4); 

end
%右方直線檢測與繪製
[h2,t2,r2] = hough(iedge,'

theta

',-75:0.1:-20);

peaks1=houghpeaks(h2,5);
lines1=houghlines(iedge,t2,r2,peaks1);
for k=1:length(lines1)
xy1=[lines1(k).point1;lines1(k).point2];
plot(xy1(:,1),xy1(:,2),'

linewidth

',4);

end

hold off

輸入影象:

Opencv學習 霍夫變換檢測圓的基本原理

為了方便以後檢視,將基本筆記收藏到這裡!原博文 其實檢測圓形和檢測直線的原理差別不大,只不過直線是在二維空間,因為y kx b,只有k和b兩個自由度。而圓形的一般性方程表示為 x a y b r 那麼就有三個自由度圓心座標a,b,和半徑r。這就意味著需要更多的計算量,而opencv中提供的cvhou...

霍夫變換檢測直線

對於結構化道路的檢測,常用的方法是採用霍夫變換檢測道路中的直線段。一條直線可以看做是影象上的若干個畫素點組成,也可以用一條直線方程來表示,如 y kx b,那麼霍夫變換檢測直線段其實是將影象畫素點空間變換到引數空間,對於直線來說就是引數 k,b 也可以用來檢測其他形狀如圓和橢圓,只是引數空間表示不一...

霍夫變換檢測直線

對於線性目標提取時,霍夫變換是個很好的手段,博主在這裡做了 實驗,在乙個影象中畫上圓和矩形,通過霍夫變換提取矩形的邊緣。編譯環境為matlab2014a,如下。霍夫變換,找到矩形影象的邊界,用彩色表示出來,矩形和圓不重疊 clc clear all close all i zeros 256,256...