Homography
ホモグラフィは、ビュー間で平面を対応付ける射影変換であり、透視補正、画像レジストレーション、パノラマスティッチングを可能にします。
ホモグラフィは、直線を保ちながら、一方の平面上の点を別の平面上の点に対応付ける可逆な射影変換です。コンピュータービジョンでは、平面が異なる視点からどのように見えるかを表します。たとえば、斜めから撮影した長方形のページを、正面向きの長方形に変換できます。ホモグラフィは、画像レジストレーション、透視補正、パノラマスティッチングに利用されます。「射影変換」は同義語です。一方、言語学用語の「同形異義語」は、綴りが同じ単語を指します。
ホモグラフィ行列の仕組み#
ホモグラフィは、通常 H と呼ばれる 3 x 3 の行列で表されます。この行列は、2次元の点を3つの値で表す同次座標に対して演算します。行列乗算の後、出力値の最初の2つを3つ目の値で割ると、通常の画像座標が得られます。
H は9つの要素を持ちますが、独立したパラメーターは8つ、つまり自由度は8です。すべての要素に同じゼロ以外の数を掛けても、マッピングは変わりません。この平面画像マッピングの幾何学により、適切な4組の点対応からホモグラフィを特定できる理由がわかります。
アフィン変換は、平行線を保つ制約付きのホモグラフィです。一般的なホモグラフィは、消失点に向かって平行な辺が収束する現象など、透視効果も表します。距離や角度は一般に変化します。ミシェル・シャルルは、1837年の双対性とホモグラフィに関する論考でこの概念を発展させました。
ホモグラフィの推定方法#
推定は対応点から始まります。対応点とは、2枚の画像内で同じ物理的特徴を示す位置です。手動で選択したコーナーや、特徴抽出によって得られた対応するキーポイントを使用できます。Scale-Invariant Feature Transformなどの手法では、ビュー間で特徴を照合するための記述子、つまり局所的な見た目を数値で要約したものを生成します。
必要な最小数は4組の点であり、どちらの集合でも3点が同一直線上にあってはなりません。直接線形変換(DLT)アルゴリズムは、点の座標関係を線形方程式系に変換します。測定にノイズが含まれる場合は、対応点を追加することで推定精度が向上します。
誤ったマッチには、ロバストなフィッティングが必要です。ランダムサンプルコンセンサス(RANSAC)は、小さなサブセットから候補変換を繰り返し推定し、候補と整合するマッチであるインライアを特定します。再投影誤差は、変換後の始点と観測された終点との距離を測定します。OpenCV のホモグラフィ推定 APIでは、この処理を cv2.findHomography を通じて実行でき、H とインライアマスクの両方が返されます。
Python でホモグラフィを適用する#
OpenCVには、行列の推定と画像のワーピングを行う個別の処理が用意されています。pip install opencv-python numpy で依存関係をインストールします。この例では、サンプル画像の長方形の境界を台形に変換します。
from urllib.request import urlopen
import cv2
import numpy as np
image_url = "https://ultralytics.com/images/bus.jpg"
with urlopen(image_url) as response:
encoded = np.frombuffer(response.read(), dtype=np.uint8)
image = cv2.imdecode(encoded, cv2.IMREAD_COLOR)
height, width = image.shape[:2]
# 両方の配列で、同じ時計回りのコーナー順序を維持します。
source = np.float32([[0, 0], [width - 1, 0], [width - 1, height - 1], [0, height - 1]])
target = np.float32([[120, 80], [width - 121, 80], [width - 1, height - 1], [0, height - 1]])
matrix, _ = cv2.findHomography(source, target)
warped = cv2.warpPerspective(image, matrix, (width, height))
cv2.imwrite("homography_result.jpg", warped)保存された画像では、透視による短縮が見られます。上辺は狭くなりますが、シーン内の直線の辺は直線のままです。
ホモグラフィの用途#
- ドキュメント処理: 透視補正では、平面文書の4つのコーナーを長方形に対応付けます。この前処理により、光学文字認識の前にテキストのレイアウトを整えます。これは、OpenCV の透視補正の例で示されている平面ワープの幾何学と同じ原理に基づいています。
- パノラマスティッチング: 重なり合う写真は、ブレンドする前に位置合わせされます。Matthew Brown と David Lowe のAutostitch システムは、対応する局所特徴を使ってパノラマの作成を自動化します。順序付けされていないコレクションから、重複する画像を特定する処理も含まれます。
Ultralytics YOLO では、RandomPerspective augmentationがトレーニング中に射影ワープを適用し、画像と、それに対応するバウンディングボックス、セグメンテーションの輪郭、キーポイントをまとめて変換します。perspective 設定は、このデータ拡張における透視成分を制御します。
幾何学的な限界と関連概念#
単一のホモグラフィで、1つの平面を撮影した理想的なピンホールカメラのビュー間、または投影中心を中心にカメラを回転させて撮影したビュー間の関係を正確に表せます。カメラが並進し、異なる深度に物体がある場合、視差によって深度に応じた変位が生じます。背景平面を位置合わせすると、前景の物体はずれて残り、スティッチング画像に二重の輪郭やゴーストが発生します。
カメラキャリブレーションでは、平面の位置合わせの前に補正が必要な、画像の幾何学的形状を曲げるレンズ歪みを扱います。一般的な3次元シーンでは、エピポーラ幾何により、対応点が直線上にあるという制約が課されます。ホモグラフィは対応点の位置を直接予測します。ステレオビジョンでは、エピポーラ線上に残る位置が視差情報となり、深度推定に利用されます。










