JA EN

パノラマ合成のアルゴリズム詳解 - 特徴点検出からシームレスブレンディングまで

· 約 9 分で読めます

パノラマ合成の全体像 - 処理パイプラインの構成

パノラマ合成 (Image Stitching) は、重なり領域を持つ複数の画像を幾何学的に整合させ、1 枚の広視野画像に統合する技術です。スマートフォンのパノラマモード、Google Street View、衛星画像のモザイク処理など、日常的に利用されている技術の背後にある高度なアルゴリズムを解説します。

処理パイプライン:

前提条件: パノラマ合成が正しく機能するためには、(1) 隣接画像間に 20-40% の重なりがあること、(2) カメラの回転のみで撮影されていること (並進が小さいこと)、(3) シーンが静的であること (動く物体がないこと) が理想的です。これらの条件が満たされない場合、ゴースト、歪み、接合部の不連続が発生します。

OpenCV の高レベル API: cv2.Stitcher_create() で上記パイプライン全体を 1 行で実行できますが、各ステップの理解とパラメータ調整が品質向上の鍵です。

特徴点マッチングとホモグラフィ推定 - 幾何学的整合の基盤

パノラマ合成の最初のステップは、画像間の幾何学的関係を特定することです。特徴点マッチングで対応点を見つけ、RANSAC でロバストにホモグラフィを推定します。

特徴点検出の選択: パノラマ合成では SIFT が最も信頼性が高く、大きなスケール変化や回転に対応できます。速度が重要な場合は ORB (リアルタイムスティッチング) や AKAZE (バランス型) を選択します。各画像から 1000-3000 点を検出するのが一般的です。

画像ペアの決定: N 枚の画像がある場合、全ペア (N(N-1)/2) でマッチングを試みるか、撮影順序が既知なら隣接ペアのみを処理します。マッチ数が閾値 (通常 30 点) 以上のペアを「接続あり」と判定します。

ホモグラフィの推定: 2 枚の画像間の射影変換は 3x3 のホモグラフィ行列 H で表されます。H は 8 自由度を持ち、最低 4 組の対応点から計算できます。RANSAC により外れ値を除去しながら推定します。

H, mask = cv2.findHomography(pts_src, pts_dst, cv2.RANSAC, 4.0)

バンドル調整 (Bundle Adjustment): 3 枚以上の画像を合成する場合、ペアワイズのホモグラフィを連鎖させると誤差が蓄積します。バンドル調整は全画像のカメラパラメータを同時に最適化し、累積誤差を最小化します。OpenCV の Stitcher はこの処理を内部で実行しています。

カメラモデル: 回転のみのパノラマでは球面射影モデルが適切です。焦点距離 f が既知 (EXIF から取得可能) であれば、ホモグラフィから回転行列を分解し、球面座標系での合成が可能になります。これにより 360° パノラマも生成できます。

画像ワーピングと座標系の設計 - 歪みを最小化する投影法

ホモグラフィが推定されたら、全画像を共通の座標系に変換 (ワーピング) します。投影面の選択が最終的なパノラマの歪みと自然さを決定する重要な設計判断です。

平面投影 (Planar/Perspective): 最もシンプルな投影で、1 枚の基準画像の座標系に他の画像を変換します。視野角が狭い (60° 以下) 場合に適していますが、広角になると端部の歪みが顕著になります。2-3 枚の合成に適しています。

円筒投影 (Cylindrical): 画像を円筒面に投影します。水平方向の歪みが抑制され、水平パノラマ (180° 程度) に適しています。垂直方向には歪みが残るため、水平回転のみの撮影が前提です。

K = np.array([[f, 0, cx], [0, f, cy], [0, 0, 1]]) # カメラ内部行列

円筒座標への変換: x' = f × arctan((x-cx)/f), y' = f × (y-cy) / √((x-cx)² + f²)

球面投影 (Spherical): 画像を球面に投影します。全方向の歪みが均一で、360° パノラマや広視野 (180° 以上) の合成に最適です。Google Street View はこの投影を使用しています。

ワーピングの実装:

warped = cv2.warpPerspective(img, H, (width, height))

出力画像のサイズは、全画像のワーピング後の範囲を包含するように計算する必要があります。各画像の 4 隅を変換し、全体のバウンディングボックスを求めます。

補間法の選択: ワーピング時の補間にはバイリニア (cv2.INTER_LINEAR) が速度と品質のバランスに優れます。最高品質が必要な場合は Lanczos (cv2.INTER_LANCZOS4) を使用しますが、処理時間は 2-3 倍になります。

露出補正とゲイン補償 - 明るさの統一

異なるタイミングで撮影された画像は、自動露出やホワイトバランスの変動により明るさや色味が異なります。これを補正しないと、パノラマの接合部に明暗の段差が生じ、不自然な仕上がりになります。

ゲイン補償 (Gain Compensation): 各画像に乗算係数 (ゲイン) を適用して明るさを統一する最もシンプルな手法です。重なり領域のピクセル値の比率から各画像のゲインを推定します。

N 枚の画像のゲイン g1, g2, ..., gN を、重なり領域での差分 Σ(gi×Ii - gj×Ij)² を最小化するように最適化します。制約条件として Σgi = N (平均ゲインを 1 に保つ) を設定します。

ブロックベースのゲイン補償: 画像全体に単一のゲインを適用すると、画像内の照明勾配 (ビネッティング、光源の方向性) に対応できません。画像を 8x8 や 16x16 のブロックに分割し、ブロックごとにゲインを計算する手法が有効です。ブロック間はバイリニア補間で滑らかに接続します。

色補正: RGB チャンネルごとに独立してゲイン補償を行うと、色味の差も補正できます。ただし、チャンネル間のバランスが崩れると不自然な色になるため、輝度チャンネル (Lab 色空間の L) のみを補正し、色度 (a, b) は保持する方法も有効です。

ヒストグラムマッチング: 基準画像のヒストグラムに他の画像のヒストグラムを合わせる手法です。ゲイン補償より柔軟で、非線形な明暗の差にも対応できますが、計算コストが高くなります。scikit-image の match_histograms() で実装可能です。

実測効果: ゲイン補償なしのパノラマでは接合部の輝度差が平均 15-30 (8bit 値) ですが、ゲイン補償後は 3-5 に低減されます。ブロックベースではさらに 1-2 まで改善されます。

シーム検出 - 最適な接合線の決定

重なり領域のどこで画像を切り替えるか (シーム: 接合線) の決定は、パノラマの視覚的品質に大きく影響します。エッジや物体の境界を避け、目立たない位置にシームを配置するアルゴリズムを解説します。

なぜシーム検出が重要か: 重なり領域の中央で単純に切り替えると、動く物体のゴースト、露出差による明暗の段差、幾何学的なミスアライメントが目立ちます。最適なシームはこれらのアーティファクトが最小になる経路を通ります。

最小コストシーム (Graph Cut): 重なり領域の各ピクセルにコスト (2 枚の画像の差分の絶対値) を割り当て、コストの合計が最小になる経路をグラフカットアルゴリズムで求めます。差分が小さい領域 (2 枚の画像が似ている場所) を通るシームが選択されます。

動的計画法 (DP) によるシーム検出: 水平方向のシームを求める場合、各行で左から右へ最小コスト経路を動的計画法で計算します。計算量は O(W×H) (W: 幅、H: 高さ) で、グラフカットより高速ですが、最適性は劣ります。

Voronoi ベースのシーム: 各画像の中心からの距離に基づいてシームを決定する最もシンプルな手法です。品質は劣りますが計算が高速で、リアルタイムスティッチングに使用されます。

OpenCV での実装: cv2.detail.VoronoiSeamFinder()cv2.detail.GraphCutSeamFinder()cv2.detail.DpSeamFinder() が利用可能です。GraphCut が最高品質ですが、4K 画像で約 500ms かかります。Voronoi は 5ms 以下です。

動的シーン対策: 動く物体 (歩行者、車) がシーム付近にある場合、ゴーストが発生します。対策として、(1) 動体検出でマスクを生成し、動体領域のコストを高く設定する、(2) 一方の画像のみから動体を取得する、(3) 時間的に最新のフレームを優先する、などの手法があります。

マルチバンドブレンディング - シームレスな画像融合

シームが決定されても、接合部での微小な色差やアライメント誤差が視認される場合があります。マルチバンドブレンディングは、周波数帯域ごとに異なるブレンド幅を適用し、人間の目に自然な融合を実現する高度な手法です。

単純なアルファブレンディングの問題: 重なり領域で線形にアルファ値を変化させる (フェザリング) と、低周波成分 (大きな明暗の差) はぼけて見え、高周波成分 (エッジ) は二重に見えるダブルイメージが発生します。

マルチバンドブレンディングの原理: Burt & Adelson (1983) が提案した手法で、画像をラプラシアンピラミッド (周波数帯域ごとに分解) に分解し、各帯域で異なるブレンド幅を適用します。

実装手順:

OpenCV での実装: cv2.detail.MultiBandBlender() が利用可能です。バンド数 (ピラミッドレベル数) は通常 5 で、値を増やすとブレンドが滑らかになりますが計算コストが増加します。

パフォーマンス: 4K パノラマ (3 枚合成) で、Voronoi シーム + マルチバンドブレンディング (5 バンド) の処理時間は約 200ms です。GraphCut シーム + マルチバンドブレンディングでは約 700ms になります。品質と速度のトレードオフに応じて選択します。

関連記事

パノラマ画像の作成と活用 - スティッチングの原理から実践まで

パノラマ画像の撮影テクニック、スティッチングアルゴリズム、Web での表示方法を解説。360 度パノラマから部分パノラマまで幅広く紹介します。

パース補正の原理と実践 - 建築写真の歪みを正確に修正する技術

透視変換の数学的原理からソフトウェアでの実践的な補正手順まで解説。建築写真やドキュメントスキャンのパースペクティブ歪みを正確に修正する方法を紹介します。

カメラキャリブレーションの基礎 - 内部パラメータと歪み補正の実践ガイド

カメラキャリブレーションの原理から実践まで完全解説。ピンホールモデル、Zhang 法、歪み補正の手順を OpenCV コード例とともに詳しく紹介します。

ブレ除去 (デブラー) の原理と実践 - モーションブラーからピンボケまで

画像のブレ除去技術を体系的に解説。ウィーナーフィルタ、ブラインドデコンボリューション、深層学習ベースの最新手法まで原理と実装を網羅します。

特徴点マッチングの基礎 - SIFT、ORB、AKAZE の原理と実装比較

画像間の対応点を見つける特徴点マッチングを解説。SIFT、ORB、AKAZE の検出・記述アルゴリズムの違い、マッチング手法、外れ値除去までを実装例で紹介します。

ヒストグラムマッチングによる色調統一 - 複数画像の色合わせ技術

ヒストグラムマッチング (仕様化) の原理と実装を解説。映像制作やパノラマ合成での色調統一、CDF ベースの変換手法を具体例とともに紹介します。

関連用語