5

ロゼッタコードでMATLABのハフ変換の実装を見つけましたが、理解するのに苦労しています。また、元の画像と再構成された線(デハフ)を表示するように変更したいと思います。

それを理解し、脱ハフするのに助けていただければ幸いです。ありがとう

  1. 画像が反転するのはなぜですか?

    theImage = flipud(theImage);

  2. ノルム関数に頭を包むことができません。その目的は何ですか、そしてそれは避けることができますか?

編集:ノルムはユークリッド距離の同義語です:sqrt(width ^ 2 + height ^ 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. 線を再作成するためにハフ空間をどのようにデハフしますか?

アイデンティティ(目)関数を使用して作成された対角線の10x10画像を使用して関数を呼び出す

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
4

1 に答える 1

5

ハフ変換は、各画像ポイントが画像内の特定の線(線分ではない)の存在に投票する「投票」アプローチです。投票は、線のパラメーター空間で実行されます。これは、法線ベクトルの極座標表現です。

パラメータ空間を離散化し、各画像ポイントがポイントを通る線と互換性のあるパラメータを提案できるようにします。各質問は、パラメーター空間がコードでどのように扱われるかという観点から対処できます。ウィキペディアには、物事を明確にする可能性のある実用的な例を含む優れた記事があります (概念的な問題がある場合)。

特定の質問について:

  1. 画像は反転されているため、原点は右下隅になります。私が知る限り、このステップは技術的に必要ではありません。離散化の問題により、結果が多少変わります。Rosetta Code の他の実装では、画像は反転されません。
  2. rhoLimit極座標での画像点の最大半径を保持します (ベクトルのノルムはその大きさであることを思い出してください)。
  3. rhoおよびthetaは、サンプリング レートに応じた極座標平面の離散化です。houghSpace個別の rho/theta 値の可能な組み合わせごとに要素を持つ行列を作成します。
  4. ハフ変換は推定線の長さを指定しません。投票空間のピークは、線の法線ベクトルの極座標を指定するだけです。ピークを選択して対応する線を描くか、可能性のあるすべての線を描き、投票数をグレースケールの重みとして使用することで、「脱ハフ」することができます。ハフ変換から元の画像を再作成することはできません。変換によって識別された行 (および投票のしきい値設定スキーム) だけです。

質問の例に従うと、次のグラフが生成されます。グリッド ラインとデータヒント カーソルの配置は、少し誤解を招く可能性があります (ただし、ヒントの変数値は正しいです)。これはパラメーター空間の画像であり、画像空間ではないため、選択したサンプリング レートによって各変数のビン数が決まります。このサンプリング レートでは、イメージ ポイントは複数の可能なラインと互換性があります。言い換えれば、10x10 の画像ではオーバーラップせずには描画できないという意味で、線はサブピクセル解像度を持っています。

normal の線に対応するようなピークを選択したら、選択した(rho,theta) = (6.858,0.9)方法でその線を画像に描くことができます。自動化されたピーク ピッキング (賛成票の多い行を見つけるためのしきい値処理) は、それ自体の問題です。DSPのトピックまたは特定のアルゴリズムについて、ここで別の質問をすることができます。

メソッドの例については、MATLABおよび関数のコードとドキュメントを参照してください。houghpeakshoughlines

ここに画像の説明を入力

于 2012-03-28T22:57:38.950 に答える