1

以下の方法を使用して成功しましたが、以下の方法のような近似ではなく、正確な回転角度を提供するためのより時間効率の良い代替手段が他にあるはずです。フィードバックをお待ちしております。

この手順は、次の手順に基づいています。

  1. テンプレート イメージをインポートします (例: 方向が 0º の場合)。
  2. 同じ画像の個別の配列を作成しますが、それぞれが最も近いものと比較して 360º/rotatesteps で回転します (つまり、30 から 50 の回転した画像)

# python 3 / opencv 3

# Settings:
rotate_steps = 36
step_angle = round((360/rotate_steps), 0) # one image at each 10º

# Rotation function
def rotate_image(image, angle):
# ../..
return rotated_image

# Importing a sample image and creating a n-dimension array where to store images in:
image = cv2.imread('sample_image.png')
image_Array = np.zeros((image.shape[1], image.shape[0], 1), dtype='uint8')

# Rotating sample image and saving it into the array as a new channel:
while rotation_angle <= (360 - step_angle):
                           angles.append(rotation_angle)
                           image_array[:,:,channel] = rotate_image(image.copy(), rotation_angle)
# ../..

だから私は得る:

角度 = [0, 10.0, 20.0, 30.0, .../..., 340.0, 350.0]

image_array = [image_1, image_2, image_3, ...] ここで、image_i は numpy 配列の別のチャネルです。

  1. 以前に回転して配列に保存したサンプル画像と比較して、角度を見ている「test_image」を取得します
  2. 一連の cv2.matchTemplate() と cv2.minMaxLoc() に従って、回転した画像の角度が「test_image」に最もよく一致するものを見つけます。

for i in range(len(angles)):
  res = cv2.matchTemplate(test_image, image_array[:,:,i], cv2.TM_CCOEFF_NORMED)
  min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
  # ../..

  1. そして最後に、サンプル画像に一致する離散化された角度を、「max_val」の最高値を持つテンプレート画像に対応するものとして選択します。

これは、結果の精度が、回転したテンプレート画像の量に応じてより高い/より低い精度の近似に基づいていること、および回転したテンプレートの数が増加したときにかかる立ち上がり時間に基づいていることを念頭に置いてうまく機能することが証明されています...

画像の一種の「方向ベクトル」を生成するなど、さまざまな方法に基づいた他のよりスマートな代替手段があるに違いないと確信しており、結果の数値だけをサンプルテンプレートから以前に知られている数値と比較します...

あなたのフィードバックは非常に高く評価されます。

4

1 に答える 1

0

あなたの問題には簡単な解決策がないと思います。実際には、画像を別の画像に合わせてゆがめる (この場合は回転させる) レジストレーションの問題です。セグメンテーションと同様に、これは既知の難しい問題です。

画像処理の研究者が「セグメンテーションとレジストレーションをマスターする者は画像処理をマスターする」と言うのを聞いたことがありますが、これは少し大げさかもしれませんが、一般的な考え方を示しています。

とにかく、あなたのテクニックは私がそれで行った方法です。researchgate ( https://www.researchgate.net/post/How_can_one_determine_the_rotation_angle_between_two_images ) を見ると、多くの回答も思いのままです。別の方法は機能マッチングを使用することですが、ソリューションよりも高速かどうかはわかりません。

おそらく、OpenCV 登録メソッドhttp://docs.opencv.org/trunk/db/d61/group__reg.htmlを見ることができます(このリンクのメソッドはピクセル マッチングを使用し、機能マッチングを使用しないため、おそらく高速です)

于 2016-12-13T08:34:41.737 に答える