社会人研究者が色々頑張るブログ

pythonで画像処理やパターン認識をやっていきます

位相限定相関法による画像の位置合わせ(Image Registration)

はじめに

画像の位置合わせ(Image Registration)とは、異なる視点で撮影された2枚の画像の位置をいい感じにフィッティングする事です。
以下にサーベイ論文[1]にわかりやすい画像があったので、参照させてもらいます。
f:id:nsr_9:20210910163637p:plain

左上と右上の画像について、それぞれの対応関係(図中の+1~+6)を求め、左下の図のようにピッタリと位置が合うように画像変換を行います。
位置が合うように画像変換を行うことで、バラバラに撮影された画像からパノラマ画像のようなものが作成できています。

Image Registrationは、外観検査装置や指紋、虹彩認証、3D-Sensing、物体追跡等々、様々なアプリケーションに応用される汎用的な技術となっています。
今回は、Image Registration手法の中でも特に実用性が高いと言われている、位相限定相関法[2]をPythonで実装します。

位相限定相関法

位相限定相関法は、周波数変換を行った画像の位相成分のみを用いる事で、サブピクセル精度でのImage Registrationを実現しています。
画像はピクセルという最小単位の粒で構成されているのですが、サブピクセル単位で位置調整するという事は、その最小単位以下(例えば0.5ピクセル)の精度で位置合わせができるということです。
凄いですね!

f:id:nsr_9:20210910165736p:plain

位相限定相関法を使うだけならば、OpenCVを使えば簡単にできます。

import cv2
import sys
import numpy as np

if __name__ == "__main__":
    img1 = cv2.imread(sys.argv[1])
    img2 = cv2.imread(sys.argv[2])

    gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY).astype(np.float32)
    gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY).astype(np.float32)

    (x, y), r = cv2.phaseCorrelate(gray1, gray2)
    print(x, y, r)

cv2.phaseCorrelateは2つの入力に対して、位相限定相関法で位置合わせを行う手法になっています。
入力画像はグレースケールのfloat32かfloat64の入力データになります。

スマホで撮った以下の2枚の画像に対して適応してみます。

入力画像1 入力画像2 重ねた画像
f:id:nsr_9:20210910173140j:plain f:id:nsr_9:20210910173147j:plain f:id:nsr_9:20210910173338g:plain

この画像に対して位相限定相関法を適用すると、次のような出力を得ます。

xのズレ量: -103.03237594382273
yのズレ量: 8.51607273664581
感度: 0.19513171376671812

感度は算出した値の信頼度のようなものです。
この結果を用いて入力画像をトリミングするコードは次のようになります。

    W = img1.shape[1]
    H = img1.shape[0]

    if x < 0:
        x11, x12 = abs(int(x)), W
        x21, x22 = 0, W-abs(int(x))
    else:
        x21, x22 = abs(int(x)), W
        x11, x12 = 0, W-abs(int(x))
    
    if y < 0:
        y11, y12 = abs(int(y)), H
        y21, y22 = 0, H-abs(int(y))
    else:
        y21, y22 = abs(int(y)), H
        y11, y12 = 0, H-abs(int(y))
    

    print(W, x12-x11, x22-x21)
    cv2.imwrite("out1.png", img1[y11:y12, x11:x12])
    cv2.imwrite("out2.png", img2[y21:y22, x21:x22])

実行すると次のような画像が生成されます。

出力画像1 出力画像2 重ねた画像
f:id:nsr_9:20210910174237p:plain f:id:nsr_9:20210910174248p:plain f:id:nsr_9:20210910174410g:plain

概ね位置があっていますね! 今回は、手に持ったスマートフォンで2枚の画像を撮影しているため、6軸の自由度(X,Y,Zの並進、パン, チルト, ロールの回転)を持っています。
f:id:nsr_9:20210910175321p:plain

位相限定相関法は、X, Y軸の並進移動(もしくはロール回転)のみに対応している為、重ねた結果がちょっとズレているのだと思います。

まとめ

今回はOpenCVに実装された位相限定相関法を使い、Image Registrationをやってみました。
かなり適当に撮った画像でも位置合わせを行えていたので、前処理や撮影環境を整備すればそのままでも実応用ができそうだと感じました。

[1] Zitova, Barbara, and Jan Flusser. "Image registration methods: a survey." Image and vision computing 21.11 (2003): 977-1000.
[2] 青木孝文, et al. "位相限定相関法に基づく高精度マシンビジョン―ピクセル分解能の壁を越える画像センシング技術を目指して―." 電子情報通信学会 基礎・境界ソサイエティ Fundamentals Review 1.1 (2007): 1_30-1_40.