天天看點

hough變換了解

###hough變換概念

在計算機中,經常需要将一些特定的形狀圖形從圖檔中提取出來,如果直接用像素點來搜尋非常困難,這時候需要将圖像從像素按照一定的算法映射到參數空間。hough變化提供了一種從圖像像素資訊到參數空間的變換方法。對于像直線,圓,橢圓這樣的規則曲線hough是一種常用的算法。hough變化最大的優點在于特征邊緣描述中間隔的容忍性并且該變換不受圖像噪聲的影響。

###hough變換原理

hough變換是一種将圖像上的點映射到累加的參數空間,實作對已知解析式曲線的識别。

####參數空間

由于直線斜率k存在無窮大的情況,這裡hough變換将原圖像空間轉換到極坐标系表示的參數空間。即直線 y = k ∗ x + b y=k*x+b y=k∗x+b轉換到極坐标系空間 ρ = x c o s θ + y s i n θ \rho=xcos\theta+ysin\theta ρ=xcosθ+ysinθ, ρ \rho ρ表示直線到原點的距離, θ \theta θ限定了直線的斜率(這裡隻是說限定,沒說是直線的斜率)。任意一條直線都可以通過 ( ρ , θ ) (\rho,\theta) (ρ,θ)來表示。參數空間 H ( ρ , θ ) H(\rho,\theta) H(ρ,θ)表示有限個點的集合。參數空間 H ( ρ , θ ) H(\rho,\theta) H(ρ,θ)每一個點都代表一條直線。

如圖所示:

hough變換了解

####參數空間的累加投票

在進行hough變換前,先需要将圖像的邊緣圖像提取出來,在邊緣圖像的基礎上進行hough變換。經過邊緣圖像每一個點的直線有很多,如下圖:

hough變換了解

經過某一點的直線在參數空間的表示像一條正弦曲線。

在邊緣圖像中,隻有表示邊緣的像素點才有可能構成直線。現在回到參數空間,在參數空間 H ( ρ , θ ) H(\rho,\theta) H(ρ,θ)中,将經過邊緣圖像中每一個有效像素點(邊緣像素點)的所有直線資訊都加到 H ( ρ , θ ) H(\rho,\theta) H(ρ,θ)上。比如,像素點 ( x , y ) (x,y) (x,y)代表構成邊緣的一個像素點,周遊 θ \theta θ,根據公式 ρ = x c o s θ + y s i n θ \rho=xcos\theta+ysin\theta ρ=xcosθ+ysinθ我們可以計算出所有經過點 ( x , y ) (x,y) (x,y)的直線資訊。比如下圖:

hough變換了解

這兒三個點在一條直線上,不同顔色的線代表經過不通點的直線,圖下面的表顯示了直線的參數。将直線參數表示在參數空間的曲線上,如圖所示:

hough變換了解

每一條曲線都是由經過一個點的所有直線參數構成的。我們發現三條曲線在(60,81)附近交叉了,這表明 θ = 60 , ρ = 81 \theta=60,\rho=81 θ=60,ρ=81這條直線上有三個點。這就表明了我們如何從參數空間 H ( ρ , θ ) H(\rho,\theta) H(ρ,θ)上尋找直線資訊。将 H H 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
           
hough變換了解

參考文獻:《數字圖像處理matlab版》-左飛

《數字圖像處理第三版》 http://blog.csdn.net/poem_qianmo/article/details/26977557

https://en.wikipedia.org/wiki/Hough_transform

http://homepages.inf.ed.ac.uk/rbf/HIPR2/hough.htm

繼續閱讀