本文目錄一覽:
Hough變換
Hough變換是利用圖像全局特性有可能把邊緣象素連接起來組成區域封閉邊界的一種方法。在預先知道區域形狀的條件下,利用Hough變換可以方便地得到邊界曲線,把不連續的邊緣象素點連接起來,還可以直接檢測某些已知形狀的目標,並有可能確定邊界到亞象元精度。其主要優點是受噪聲和曲線間斷的影響小。為了便於理解Hough變換這種功能,先舉一個簡單例子。設給定圖像中的n個點,要從中確定連在同一直線上的點的子集。這可看作已檢測出的若干點,去求出它們所在的直線。一種直接解決辦法是先確定所有由任意兩點決定的直線(約需n2次運算以確定n(n-1)/2 條直線),再找出接近具體直線的點的集合(約需n2次運算以比較n個點中的每一個與n(n-1)/2條直線中的每一條)。這麼大的計算量實際上不易實現。如果用Hough變換:的方法就可用較少的計算量來解決這個問題。這種變換的基本思想是點一線的對偶性,Duality在圖像空間XY中,所有過點(x,y)的直線都滿足方程:
Y=px + q (5-15)
式中P為斜率,q為截距,式(5-15)也可以寫成:
q=- px + Y (5-16)
式(5-16)可以認為是代表參數空間PQ中過點(p,q)的一條直線。
現在來看圖5-9a表示圖像空間,(b)表示參數空間。在圖像空間XY中,過點(xi,yi)的通用直線方程按式(5-15)可寫為yi=pxi+q,也可以按式(5-16)寫為q=-pxi+yi;它表示在參數空間PQ里的另一條直線。設這兩條直線在參數空間PQ里相交於點(p′,q′),這裡點(p′,q′)對應圖像空間XY中一條過點(xi,yi)和(xi,yi)的直線,因此在圖像空間XY中過點(xi,yi)和(xj,yj)的直線上的每個點都對應在參數空間PQ里的一條直線,這條直線相交於點(p′,q′)。
由此可知,在圖像空間中共線的點對應在參數空間里相交的線。反過來在參數空間中相交於同一個點的所有直線在圖像空間里都有共線的點與之對應。這就是點線對偶性。Hough變換就是根據這些關係把在圖像空間中的檢測問題轉換到參數空間里,通過較簡單的累加統計完成檢測任務。
在具體計算時需要在參數空間PQ里建立一個二維累加數組。設這個累加數組為A(p,q),如圖5-10所示。其中[Pmin,Pmax]和[qmin,qmax]分別為預期的斜率和截距的取值範圍。開始時置數組A為零,然後對每一個圖像空間中的給定點,讓p取遍p軸上所有可能的值,並根據式(5-16)算出對應的q,再根據p和q的值(設都已經取整)對A累加:A(p,q)=A(p,q)+1,累加結束後,根據A(p,q)的值就可知道有多少點是共線的,即A(p,q)的值就是在(p,q)處共線點的個數。同時(p,q)值也給出了直線方程的參數,於是我們得到了點所在的線。
圖5-9 圖像空間和參數空間中點和線的對偶性
圖5-10 參數空間里的累加數組示意圖
假設我們把P軸分成K份,即P取K個值,那麼對每一個點(xk,yk)由式(5-16)可得到q的K個值。因為圖中有n個點,所以這裡就需要nK次運算。可見運算量是n的線性函數。如果K比n小,則總計算量必小於n2,這就是Hough變換的優勢所在。
Hough變換不僅可用來檢測直線和連接處在同一條直線上的點,也可以用來檢測滿足解析式f(x,c)=0形式的各類曲線並把曲線上的點連接起來。這裡x是一個坐標矢量,在二維圖像中是一個二維矢量,c是一個係數矢量,它可以根據曲線的不同,從二維、三維到四維等,凡能寫出方程的圖形,都可以利用Hough變換來檢測。
自然界有許多要素有一定的形狀、分布與伸展方向,但可能受其他因素遮蔽而顯現得不清晰或斷斷續續,例如,地質體的線性構造、環形構造等,在地質探礦、地質穩定性分析等方面都有重要意義,可是在遙感圖像上有時反映得不太清楚,如果借鑒Hough變換的基本思想來處理圖像,可能有助於構造信息的提取。
hough變換檢測直線 怎麼確定直線的端點?
這個問題答案在MATLAB幫助文檔里有介紹。在help里搜索houghlines函數。下面的程序是我從幫助文檔里複製過來的,程序的最後是顯示出直線的起點和終點。希望幫到你。
I = imread(‘circuit.tif’);
rotI = imrotate(I,33,’crop’);
BW = edge(rotI,’canny’);
[H,T,R] = hough(BW);
imshow(H,[],’XData’,T,’YData’,R,…
‘InitialMagnification’,’fit’);
xlabel(‘\theta’), ylabel(‘\rho’);
axis on, axis normal, hold on;
P = houghpeaks(H,5,’threshold’,ceil(0.3*max(H(:))));
x = T(P(:,2)); y = R(P(:,1));
plot(x,y,’s’,’color’,’white’);
% Find lines and plot them
lines = houghlines(BW,T,R,P,’FillGap’,5,’MinLength’,7);
figure, imshow(rotI), hold on
max_len = 0;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),’LineWidth’,2,’Color’,’green’);
% Plot beginnings and ends of lines%答案在這裡
plot(xy(1,1),xy(1,2),’x’,’LineWidth’,2,’Color’,’yellow’);
plot(xy(2,1),xy(2,2),’x’,’LineWidth’,2,’Color’,’red’);
如何用Hough變換檢測一幅二值圖像中的最長直線
樓主可以試一下這段代碼,希望能對你有幫助
I = imread(‘E:\pic\2\編號\4.bmp’);%讀取圖像
rotI = imrotate(I,-4,’crop’);%圖像旋轉33°
subplot(221),
fig1 = imshow(I);%在第一幅子圖中繪製旋轉後的圖像
BW = edge(I,’canny’);%使用canny方法檢測目標邊界
subplot(222),
imshow(BW);%顯示邊界的二值圖像
[H,theta,rho] = hough(BW);%hough變換
subplot(223),
imshow(imadjust(mat2gray(H)),[],’XData’,theta,’YData’,rho,…
‘InitialMagnification’,’fit’);%顯示hough變換的變換矩陣
xlabel(‘\theta (degrees)’), ylabel(‘\rho’);
axis on, axis normal, hold on;
colormap(hot)%顏色映射表
P = houghpeaks(H,5,’threshold’,ceil(0.3*max(H(:))));%hough變換的極值點
x = theta(P(:,2));
y = rho(P(:,1));
plot(x,y,’s’,’color’,’black’);%畫出極值點
lines = houghlines(BW,theta,rho,P,’FillGap’,…
5,’MinLength’,7);%返回直線的端點%
subplot(224),
imshow(rotI), hold on
max_len = 0;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),’LineWidth’,2,’Color’,’green’);%檢測到的直線
plot(xy(1,1),xy(1,2),’x’,’LineWidth’,2,…
‘Color’,’yellow’);%起始端點
plot(xy(2,1),xy(2,2),’x’,’LineWidth’,2,…
‘Color’,’red’);%終止端點
len = norm(lines(k).point1 – lines(k).point2);%直線的長度
if ( len max_len)
max_len = len;%確定最長的直線
xy_long = xy;
end
end
plot(xy_long(:,1),xy_long(:,2),’LineWidth’,2,…
‘Color’,’cyan’);%繪製最長的直線
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/127545.html