hough變換理解
阿新 • • 發佈:2018-12-10
hough變換概念
在計算機中,經常需要將一些特定的形狀圖形從圖片中提取出來,如果直接用畫素點來搜尋非常困難,這時候需要將影象從畫素按照一定的演算法對映到引數空間。hough變化提供了一種從影象畫素資訊到引數空間的變換方法。對於像直線,圓,橢圓這樣的規則曲線hough是一種常用的演算法。hough變化最大的優點在於特徵邊緣描述中間隔的容忍性並且該變換不受影象噪聲的影響。
hough變換原理
hough變換是一種將影象上的點對映到累加的引數空間,實現對已知解析式曲線的識別。
引數空間
由於直線斜率k存在無窮大的情況,這裡hough變換將原影象空間轉換到極座標系表示的引數空間。即直線y=k∗x+b 每一個點都代表一條直線。
如圖所示:
引數空間的累加投票
在進行hough變換前,先需要將影象的邊緣影象提取出來,在邊緣影象的基礎上進行hough變換。經過邊緣影象每一個點的直線有很多,如下圖: 經過某一點的直線在引數空間的表示像一條正弦曲線。 在邊緣影象中,只有表示邊緣的畫素點才有可能構成直線。現在回到引數空間,在引數空間H(ρ,θ)看作為一個累加器,一個表示直線資訊的累加器。設定某一閾值,超過閾值的引數點所代表的直線表明影象中存在這一直線。
hough變換示例
RGB= imread('lines.png');
imshow(RGB),title('original image' );
I = rgb2gray(RGB);
BW = edge(I, 'canny'); % 用canny演算法提取邊緣影象
figure,imshow(BW),title('edge image');
[H, T, R]=hough(BW); % 計算得到的H為引數矩陣,T為限定直線的角度,R為直線到原點的值
figure, imshow(imadjust(mat2gray(H)), 'XData', T, ... % 繪製hough變換的圖
'YData', R, 'InitialMagnification', 'fit'),title('hough image');
xlabel('\theta' ), ylabel('\rho');
axis on; axis normal; hold on;
colormap(hot);
peaks = houghpeaks(H,4); % 該演算法用來提取指定數目的峰值點,也是就是尋找直線
figure, imshow(BW);
hold on;
lines = houghlines(BW, T, R, peaks, 'FillGap',30, 'MinLength',30);
max_len = 0;
for k=1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',3,'Color','b');
plot(xy(1,1),xy(1,2),'x','LineWidth',3,'Color','yellow');
plot(xy(2,1),xy(2,2),'x','LineWidth',3,'Color','red');
len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len)
max_len = len;
xy_long = xy;
end
end