2012-03-28 60 views
5

我發現了霍夫變換在MATLAB中的實現Rosetta Code,但我無法理解它。另外我想修改它以顯示原始圖像和重建線(去Houghing)。霍夫變換在MATLAB中不使用霍夫函數

任何幫助理解它和de-Houghing是讚賞。謝謝

  1. 爲什麼圖像翻轉?

    theImage = flipud(theImage);

  2. 我不能換我的頭周圍的規範功能。它的目的是什麼,可以避免嗎?

編輯:規範僅僅是歐幾里得距離的同義詞:SQRT(寬度^ 2 +高度^ 2)

rhoLimit = norm([width height]);

  1. 有人可以提供如何解釋/爲什麼要計算rho,theta和houghSpace?

    rho = (-rhoLimit:1:rhoLimit);   
    theta = (0:thetaSampleFrequency:pi); 
    
    numThetas = numel(theta); 
    houghSpace = zeros(numel(rho),numThetas); 
    
  2. 我該如何解開Hough空間來重新創建線條?

使用對角線的10×10圖像調用函數使用標識(眼)函數

theImage = eye(10) 
thetaSampleFrequency = 0.1 
[rho,theta,houghSpace] = houghTransform(theImage,thetaSampleFrequency) 

實際功能

function [rho,theta,houghSpace] = houghTransform(theImage,thetaSampleFrequency) 

    %Define the hough space 
    theImage = flipud(theImage); 
    [width,height] = size(theImage); 

    rhoLimit = norm([width height]); 
    rho = (-rhoLimit:1:rhoLimit);   
    theta = (0:thetaSampleFrequency:pi); 

    numThetas = numel(theta); 
    houghSpace = zeros(numel(rho),numThetas); 

    %Find the "edge" pixels 
    [xIndicies,yIndicies] = find(theImage); 

    %Preallocate space for the accumulator array 
    numEdgePixels = numel(xIndicies); 
    accumulator = zeros(numEdgePixels,numThetas); 

    %Preallocate cosine and sine calculations to increase speed. In 
    %addition to precallculating sine and cosine we are also multiplying 
    %them by the proper pixel weights such that the rows will be indexed by 
    %the pixel number and the columns will be indexed by the thetas. 
    %Example: cosine(3,:) is 2*cosine(0 to pi) 
    %   cosine(:,1) is (0 to width of image)*cosine(0) 
    cosine = (0:width-1)'*cos(theta); %Matrix Outerproduct 
    sine = (0:height-1)'*sin(theta); %Matrix Outerproduct 

    accumulator((1:numEdgePixels),:) = cosine(xIndicies,:) + sine(yIndicies,:); 

    %Scan over the thetas and bin the rhos 
    for i = (1:numThetas) 
     houghSpace(:,i) = hist(accumulator(:,i),rho); 
    end 

    pcolor(theta,rho,houghSpace); 
    shading flat; 
    title('Hough Transform'); 
    xlabel('Theta (radians)'); 
    ylabel('Rho (pixels)'); 
    colormap('gray'); 

end 
+0

對[DSP.SE](http://dsp.stackexchange.com/)更好的問題。 – Phonon 2012-03-29 01:33:33

+1

@Phonon爲什麼?這是一個關於特定算法實現細節的問題。 – 2012-03-29 04:50:49

回答

5

霍夫變換是「表決創建「方法,其中每個圖像點對某一行的存在投了票(不是一行分段)在圖像中。投票是在線的參數空間中進行的:法向量的極座標表示法。

我們離散參數空間,並允許每個圖像點建議參數,這些參數將與點通過的線相容。您的每個問題都可以通過代碼中參數空間的處理方式來解決。 Wikipedia有一個很好的文章與工作的例子,可能會澄清事情(如果你有任何概念上的麻煩)。

爲了您的具體問題:

  1. 圖片翻轉,使得原產地是右下角。據我所知,這一步在技術上並非必要。由於離散化問題,它的確會改變結果。 Rosetta Code上的其他實現不會翻轉圖像。
  2. rhoLimit在極座標中保留圖像點的最大半徑(回想一下矢量的範數就是它的大小)。
  3. rhotheta是根據採樣率的極座標平面的離散化。houghSpace爲離散ρ/θ值的每種可能組合創建一個元素矩陣。
  4. 霍夫變換沒有指定的推定的行中的長度;投票空間中的峯值僅指定該線的法向矢量的極座標。您可以通過選擇峯值並繪製相應的線條,或者通過繪製每條可能的線條並使用投票數量作爲灰度權重來「解開霍夫」。從Hough變換中重新創建原始圖像是不可能的,只需通過變換(以及您的投票的閾值方案)確定的線條即可。

在從問題的示例產生下面的曲線圖。網格線和數據提示光標的放置可能有點誤導(儘管'提示中的變量值是正確的)。由於這是參數空間,而不是圖像空間我們選擇了採樣速率是確定在每個可變區間的數目的圖像。在這個採樣率下,圖像點與多個可能的線條兼容;換句話說,我們的線具有亞像素分辨率,因爲它們不能在10x10圖像中不重疊地繪製。

一旦我們已經選擇了一個峯,例如對應於線與正常(rho,theta) = (6.858,0.9),我們可以得出該行的圖像中但是我們選擇。自動化高峯採摘,即閾值找到高度上投系,是自己的問題 - 你可以詢問有關議題的另一個問題在DSP或有關特定算法在這裏。

例如方法參見MATLAB的houghpeakshoughlines函數的代碼和documentation

enter image description here

+0

謝謝。我們爲什麼要讓原點位於右下角?我怎麼讀這個[輸出](http://i.imgur.com/LuVLI.png)。 Theta會是1還是1.5? Rho會是6.858還是上面那個?還是這些值的平均值?尋找霍夫變換中所有'熱點'的好方法是什麼?繪製線條的最佳方式是什麼?從wikipeida我可以看到表達式y = mx + b,其中M = - (COS(THETA)/ SIN(THETA))和b = R/SIN(THETA)。我會根據這些參數繪製一條線嗎?謝謝 – waspinator 2012-03-29 02:57:08

+0

它看起來像matlabs實現可以檢測行的開始和結束。我的目的不是必需的,但很有趣。我只需要基礎知識。在我明白這一點之前,我還有很多事情要做,但是你已經幫了很大的忙。謝謝。在我離開這個問題之前,你能否澄清爲什麼我們希望原點位於右下角而不是左側? – waspinator 2012-03-29 14:33:38

+0

要猜測線段的端點,您必須使用圖像中的其他信息。 MATLAB似乎找到了最有意思的像素對,它們對像素有貢獻,並將它們視爲終點。 – 2012-03-29 20:38:26