2016-03-18 2 views
6

2つの画像があります。翻訳されているにもかかわらず、画像を重複させる

これらは同じかほぼ同じです。

ただし、いずれかの画像がいずれかの軸で数ピクセル移動していることがあります。

このような動きがあるかどうかを検出する最も良い方法は何でしょうか?

さらに、画像を操作してこの不要な動きを修正するにはどうすればよいでしょうか?

+1

画像が歪んでいますか?または、単に翻訳されたとして、 "どちらかの軸上のいくつかのピクセルによって動かされる"と示唆していますか?移動したばかりの – ohruunuruus

+0

私はフレーズを修正しました。 –

答えて

2

イメージが実際にほぼ同じで、単純に翻訳されている場合(つまり、ではなく、のスキュー、回転、縮尺など)、相互相関を使用できます。

イメージを相互相関させると(自己相関)、最大値は結果の行列の中央になります。画像を垂直または水平にシフトして元の画像と相互相関させると、最大値の位置がそれに応じてシフトします。予想される位置との相対的な最大値の位置のシフトを測定することにより、画像がどのくらい遠くに平行移動されたかを判断することができます。

ここは、pythonのおもちゃの例です。テスト画像を生成し、いくつかのものをインポートすることで起動し、自己相関を調べる:

import numpy as np 
from scipy.signal import correlate2d 

# generate a test image 
num_rows, num_cols = 40, 60 
image = np.random.random((num_rows, num_cols)) 

# get the auto-correlation 
correlated = correlate2d(image, image, mode='full') 

# get the coordinates of the maximum value 
max_coords = np.unravel_index(correlated.argmax(), correlated.shape) 

これは座標max_coords = (39, 59)を生成します。さて、アプローチをテストし、右の列に画像をシフト、左にいくつかのランダムな値を追加し、再度、相互相関で最大値を見つけること:

image_translated = np.concatenate(
    (np.random.random((image.shape[0], 1)), image[:, :-1]), 
    axis=1) 

correlated = correlate2d(image_translated, image, mode='full') 
new_max_coords = np.unravel_index(correlated.argmax(), correlated.shape) 

これは正しく画像を示す、new_max_coords = (39, 60)を与えます水平方向に1だけオフセットされます(np.array(new_max_coords) - np.array(max_coords)[0, 1]なので)。この情報を使用すると、翻訳を補うためにイメージをシフトできます。

このようにすることを決めた場合、うまくいかない場合があります。画像の次元が与えられた場合、最大座標が相関に従うべきである(すなわち、自己相関を計算することを避け、これらの座標を経験的に決定する)ことを決定する際には、オフ・バイ・ワン・エラーがたくさんあります。行数/列数。上記の例では、中心はちょうど[num_rows-1, num_cols-1]ですが、それがより一般的な安全な仮定であるかどうかはわかりません。

しかし、ほとんどの場合、特に画像がほぼ同じで、のみがに翻訳されている場合、この方法は非常にうまくいくはずです。

関連する問題