2

Hough linesを使用して画像内の線を検出した後、それを使用して参照画像の線の角度 (回転) の変化を計算するにはどうすればよいですか?

4

2 に答える 2

3

読者への注意:これはフォローアップの質問です。背景については以下を参照してください。


このプロセスは、以前に示したものと似ています。以下では、以前の質問の画像を使用しています(1 つしか提供されていないため、最初の画像を 10 度回転させてもう 1 つの画像を作成しました)。

まず、2 つの画像の線を検出します。ハフ 変換 関数を使用してこれを行います。両方の画像に適用すると、次のようになります。

線と点の順序が検出された画像

次に、ライン エンドポイントをコントロール ポイントとして使用して、イメージ レジストレーションを実行します。まず、2 つの画像で点が互いに対応していることを確認します。これを行うには、凸包を使用して計算します。これにより、convhull自動的に反時計回りの順序で並べ替えられます (または逆方向です!)。上記の数字は順番を示しています。

最後に、この関数を使用しcp2tformて変換行列を取得します。これを使用して画像を整列し、平行移動、回転、スケーリングを抽出します。

以下は完全なコードです。

%% # Step 1: read and prepare images
%# (since you provided only one, I created the other by rotating the first).
I1 = imread('http://i.stack.imgur.com/Se6zX.jpg');
I1 = rgb2gray( imcrop(I1, [85   35  445  345]) ); %# Get rid of white border
I2 = imrotate(I1, -10, 'bilinear', 'crop'); %# Create 2nd by rotating 10 degrees

%% # Step 2: detect the cross sign endpoints (sorted in same order)
p1 = getCross(I1);
p2 = getCross(I2);

%% # Step 3: perform Image Registration
%# Find transformation that maps I2 to I1 using the 4 control points for each
t = cp2tform(p2,p1,'affine');

%# Transform I2 to be aligned with I1
II2 = imtransform(I2, t, 'XData',[1 size(I1,2)], 'YData',[1 size(I1,1)]);

%# Plot
figure('menu','none')
subplot(131), imshow(I1), title('I1')
subplot(132), imshow(I2), title('I2')
subplot(133), imshow(II2), title('I2 (aligned)')

%# Recover affine transformation params (translation, rotation, scale)
ss = t.tdata.Tinv(2,1);
sc = t.tdata.Tinv(1,1);
tx = t.tdata.Tinv(3,1);
ty = t.tdata.Tinv(3,2);
scale = sqrt(ss*ss + sc*sc)
rotation = atan2(ss,sc)*180/pi
translation = [tx ty]

そして、行のエンドポイントを抽出する関数は次のとおりです。

function points = getCross(I)
    %# Get edges (simply by thresholding)
    I = imfilter(I, fspecial('gaussian', [7 7], 1), 'symmetric');
    BW = imclearborder(~im2bw(I, 0.5));

    %# Hough transform
    [H,T,R] = hough(BW);

    %# Detect peaks
    P  = houghpeaks(H, 2);

    %# Detect lines
    lines = houghlines(BW, T, R, P);

    %# Sort 2D points in counterclockwise order
    points = [vertcat(lines.point1); vertcat(lines.point2)];
    idx = convhull(points(:,1), points(:,2));
    points = points(idx(1:end-1),:);
end

結果:

結果の整列画像

scale =
    1.0025
rotation =
   -9.7041
translation =
   32.5270  -38.5021

回転はほぼ 10 度として復元され (多少の誤差は避けられません)、スケーリングは事実上 1 です (ズームがなかったことを意味します)。上記の例では、十字記号の中心を中心に回転が実行されていないため、平行移動コンポーネントが存在することに注意してください)。

于 2010-01-17T04:08:19.023 に答える
0

ハフ変換のMATLAB実装が何であるかはわかりませんが、線の方向は、線を識別するために使用した角度に対して単純に直角(90度またはpi / 2ラジアン)になります。最初の場所。

それがお役に立てば幸いです。ウェブ上にはハフ変換のまともな報道があ​​り、ウィキペディアは始めるのに良い場所です。

于 2010-01-14T08:07:44.410 に答える