ハフ変換の理解を支援


19

MATLABでハフ変換を機能させようとしていますが、問題があります。修正する必要のあるピークを検出する方法は非常に悪いですが、その前にハフ変換を逆にしてラインを正しく作成できるようにする必要があります。これは私が今得ているもののタイプです:

ここに画像の説明を入力してください

90度回転しているように見えますが、その理由はわかりません。私のハフのスペースが間違っているのか、それとも私がハフを解いて線を引くのかがわかりません。また、誰かが私のピーク検出を改善するのを助けることができますか?コードで使用されている画像はこちら

%% load a sample image; convert to grayscale; convert to binary

%create 'x' image (works well)
a = eye(255);
b = flipud(eye(255));
x = a + b;
x(128,128) = 1;

%image = rgb2gray(imread('up.png')) < 255;
%image = rgb2gray(imread('hexagon.png')) < 255;
%image = rgb2gray(imread('traingle.png')) < 255;
%%% these work
%image = x;
%image = a;
image = b;    

%% set up variables for hough transform
theta_sample_frequency = 0.01;                                             
[x, y] = size(image);
rho_limit = norm([x y]);                                                
rho = (-rho_limit:1:rho_limit);
theta = (0:theta_sample_frequency:pi);
num_thetas = numel(theta);
num_rhos = numel(rho);
hough_space = zeros(num_rhos, num_thetas);

%% perform hough transform
for xi = 1:x
    for yj = 1:y
        if image(xi, yj) == 1 
            for theta_index = 1:num_thetas
                th = theta(theta_index);
                r  = xi * cos(th) + yj * sin(th);
                rho_index = round(r + num_rhos/2);                      
                hough_space(rho_index, theta_index) = ...
                     hough_space(rho_index, theta_index) + 1;
            end
        end
    end
end  

%% show hough transform
subplot(1,2,1);
imagesc(theta, rho, hough_space);
title('Hough Transform');
xlabel('Theta (radians)');
ylabel('Rho (pixels)');
colormap('gray');

%% detect peaks in hough transform
r = [];
c = [];
[max_in_col, row_number] = max(hough_space);
[rows, cols] = size(image);
difference = 25;
thresh = max(max(hough_space)) - difference;
for i = 1:size(max_in_col, 2)
   if max_in_col(i) > thresh
       c(end + 1) = i;
       r(end + 1) = row_number(i);
   end
end

%% plot all the detected peaks on hough transform image
hold on;
plot(theta(c), rho(r),'rx');
hold off;


%% plot the detected line superimposed on the original image
subplot(1,2,2)
imagesc(image);
colormap(gray);
hold on;

for i = 1:size(c,2)
    th = theta(c(i));
    rh = rho(r(i));
    m = -(cos(th)/sin(th));
    b = rh/sin(th);
    x = 1:cols;
    plot(x, m*x+b);
    hold on;
end

リンク: ハフ変換された画像のデハフイングを行う方法


問題を解決できましたか?私は同様の問題に直面しています。おかげで
エレズポズナー

変換変換hough sous matlab検出器プラス楕円楕円

回答:


11

まず、MatlabにはBuilt Hough Transformがあります。車輪を再発明する必要はありません。

[H,T,R] = hough(BW,'RhoResolution',0.5,'Theta',-90:0.5:89.5);

画像には必ずしもエッジ検出が必要ではありませんが、使用することで処理時間とアルゴリズムの有効性を改善できます。三角形には、白と黒の太い領域があります。理想的には、三角形は1pxの太さで三角形のエッジをマークします。Canny Edge Detectionを使用する

BW = edge(Image,'canny');

90<θ<900<θ<1800<θ<π90π/2

アキュムレータマトリックスには隣接するピークが大きくなる可能性があるため、間違ったピークを選択する可能性があります。ここには多くのアルゴリズムがありますが、過去にハフ変換で使用されているのを見たことがあります:

1) Define a region shape (typically its square) 
2) Define an accumulator threshold  
3) Select one pixel in the accumulator matrix
4) If it is a peak (i.e., larger than neighboring values above a threshold)
       a) look at the points within the region shape.
       b) If there is a larger value
              this is not a peak
          Else
              this is a peak
 5) Move to next pixel in accumulator matrix.

ハフ変換線、結果の表示については、HoughLinesをご覧ください。

http://www.mathworks.com/help/toolbox/images/ref/houghlines.html

Canny Edge Detectorを使用した効果

エッジ検出により、三角形の各辺が2本の線に変わる可能性があります。

キャニーエッジ検出の目標は、非最大サプレッションを使用して最大限に細い/狭いエッジを生成することです

簡単に言えば、Canny Edge Detection(出典:Digital Image Processing、Gonazalez)

1) Smooth input Image using a Gaussian Filter
2) Compute the Gradient magnitude and angle (Sobel, Perwitt or robert cross filters)
3) Apply Nonmaxima suppression (this is where the thinning happens) 
   a) Figure out which direction the edge is
   b) If the edge's magnitude is smaller than one of its two neighbors in the direction of the edge
          set the edge point to zero
      Else
          leave it alone
4) Use double thresholding and connectivity analysis to detect and link edges

返信いただきありがとうございます。私はそれをより良く理解するためにゼロからやっています。キャニーエッジ検出では、まだ2つの三角形が得られます。1つは内側のエッジ用、もう1つは外側のエッジ用です。私は、シータが0:piであるというウィキペディアから理論を学びました。私は組み込み関数が-pi / 2:pi / 2を使用することを知っていますが、本当の違いはないはずですか?
-waspinator

すぐに、範囲は違いを生じるべきではありません。(180度回転した線の違いを教えていただけますか?)しかし、画像補正アルゴリズムにハフ変換を使用している場合、これは違いを生じます。(それは、上向きの画像と逆さまの画像の違いを意味します)
サイバーメン

エッジ検出では、1行のみを検索する2行が生成されませんか?太い線の中心を見つけた方が良いでしょう。
エンドリス

@endolith元の投稿にエッジ検出に関する少しの議論が含まれていました
Cyber​​Men

「車輪を再発明する必要はありません」?それを私のインストラクターに教えてください;-)
ネイサンシュヴェルマン

3
    if image(xi, yj) == 1 

に変更する必要があります

    if image(yj, xi) == 1 

ラインがdehoughで機能するため


1

3つのループを使用した答えは最適とは言えず、改善される可能性があります。ここでは、より直感的なアプローチ/視点を示します。

有効なポイントの各ペアは、一意のa&bを設定しy = ax + bます。ラインには同じa&b値を持つペアがたくさんあるため、長いラインがピークとして存在します。これは、極座標のrおよびteta座標にも当てはまります。

各ポイントを個別に処理する代わりに、ドットのペアを使用します。すべての(通常はまばらな)ポイントを別のリストに保存できる場合は良いですが、必須ではありません。

  1. 各ペアを取り、そのa&bを計算します。(離散値に丸められます)
  2. 配列内の特定の場所に移動し、1を追加します。

長い行->同じa、bを持つ多くのペア。
散発的なポイント->特定のセルの小さなカウント->混乱のよう。


別の見方は、ラドン/射影の観点からです。

  • 線は垂直の「収集線」に強く投影されるため、スコアが高くなります。
  • ラインと「収集ライン」の間の角度が90度でない場合、または収集ラインがこの「収集ライン」に投影されたすべてのラインポイントを収集しない場合、スコアは低くなります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.