あらいさん日記(仮)

あらい日記

活動の記録

鏡面球を用いたパノラマ画像の生成

概要

鏡面球は360°全ての方向のシーンが写り込んでいます(球自身によって隠れている領域を除いて).そこで,鏡面球を撮影してパノラマ画像を生成します.

鏡面球における反射

鏡面球において,入射光のベクトルを\boldsymbol{s},観測面からの視線ベクトルを\boldsymbol{v}とすると,鏡面球の単位法線ベクトル\boldsymbol{n}は次式のように表せられます.

\displaystyle \boldsymbol{n} = \frac{\boldsymbol{s}+\boldsymbol{v}}{\|\boldsymbol{s}+\boldsymbol{v}\|}

f:id:raccoon15:20181222171109p:plain

鏡面球での反射

変換の流れ

正距投影図形式のパノラマ画像に変換します.パノラマ画像の幅 \thetaを-180^ \circから180^ \circ,高さ \phiを0^ \circから180^ \circとして,(\theta, \phi)方向の輝度を表すとします.鏡面球を撮影した画像はアスペクト比が1:1として,撮影した球の中心が原点とする単位円として表すとします.

f:id:raccoon15:20181221133022p:plain

鏡面球の画像からパノラマ画像への変換

このとき,入射光のベクトル\boldsymbol{s}は次式で表せられます. 

s_{x} = \sin (\phi) \sin(\theta)

s_{y} = \cos (\phi)

s_{z} = -\sin (\phi) \cos(\theta)

視線ベクトル\boldsymbol{v}(0, 0, -1)と表します.\boldsymbol{s}\boldsymbol{v}が定まったので,(\theta, \phi)方向の入射光に対応する球の単位法線ベクトル\boldsymbol{n}を求めることができます.

鏡面球の画像を単位円で表したので,単位法線ベクトルのx軸成分とy軸成分がそのまま,画像中の座標に対応します.これにより,パノラマ画像の座標と鏡面球の画像の座標の関係が定まるので,鏡面球の画像からサンプリングすればパノラマ画像に変換することができます.

鏡面球の撮影

鏡面球を対象とする場所に設置して撮影します.このとき,カメラのレンズは出来るだけ望遠である方が正射影モデルに近づけることができるので好ましいです.また,カメラを遠くに置いて撮影できるので,カメラ自身の映り込みも少なくて済みます.

f:id:raccoon15:20181222202334j:plain

撮影の様子

撮影した画像を適当な画像処理ソフトでアスペクト比が1:1になるように切り出します.

f:id:raccoon15:20181222202502j:plain

撮影した鏡面球

パノラマ画像への変換結果

先ほどの鏡面球の画像をパノラマ画像に変換した結果です.

f:id:raccoon15:20181222202506j:plain

パノラマ画像に変換した結果

画像の中央の領域はいい感じになってます.しかし,画像の端の方の領域は歪んでしまっています.この領域は撮影した球の端の領域に対応しています.

プログラム

鏡面球の画像からパノラマ画像に変換するプログラムをGitHubに置いておきます. 

github.com