位置合わせとは
位置合わせは、2枚の画像の位置ずれを補正する処理のことです。この処理は、同じシーンの複数の画像を比較する時などに用います。
PythonとOpenCVを用いた位置合わせ
PythonとOpenCVを用いて、手持ちで撮影した複数枚連写写真の位置合わせを行うことができます。この処理により、手持ちなのに、三脚使って連写したような画像を作ることが可能となります。
特徴に基づくアプローチ
2000年代初期から、画像位置合わせに特徴に基づくアプローチが用いられてきました。このアプローチは、キーポイントの検出と特徴の記述、特徴のマッチング、画像の変換の3つのステップから成ります。
キーポイントの検出と特徴の記述
キーポイントは画像において重要かつ特徴的なもの(角やエッジなど)を定義します。各キーポイントは、記述子で表されます。記述子は、キーポイントの本質的な特徴を含む特徴ベクトルです。記述子は、画像変換(ローカリゼーションやスケール、輝度など)に対して頑健でなければいけません。
import cv2
import numpy as np
def get_keypoints(img, pt1=(0, 0), pt2=None):
if pt2 is None:
pt2 = (img.shape[1], img.shape[0])
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
mask = cv2.rectangle(np.zeros_like(gray), pt1, pt2, color=1, thickness=-1)
sift = cv2.AKAZE_create()
return sift.detectAndCompute(gray, mask=mask)
特徴のマッチング
両方の画像でキーポイントを求めた後、対応するキーポイントを関連付けるか、「マッチング」する必要があります。そのためのメソッドの一つは、BFMatcher.knnMatch()
です。
def get_matcher(img, kp2, des2):
kp1, des1 = get_keypoints(img)
if len(kp1) == 0 or len(kp2) == 0:
return None
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
good = []
for m, n in matches:
if m.distance < 0.7 * n.distance:
good.append(m)
if len(good) == 0:
return None
target_position = []
base_position = []
for g in good:
target_position.append([kp1[g.queryIdx].pt[0], kp1[g.queryIdx].pt[1]])
base_position.append([kp2[g.trainIdx].pt[0], kp2[g.trainIdx].pt[1]])
return np.array(target_position), np.array(base_position)
以上のように、PythonとOpenCVを用いて画像の位置合わせを行うことができます。これにより、画像処理におけるさまざまなタスクを効率的に行うことが可能となります。