デジタルコンサルティング事業部のduenoです。
先日開催したSpeeeKaigiで「画像から光源を推定する」と言うテーマで発表しました。
やったこと
- 平面検出機能を利用して光源の推定ができるか試してみる
平面検出機能を持ったいい感じのデバイスが手元になかったので、 とりあえず単一画像から光源の位置、色、明るさが推定できるかどうかを試してみました。
動機
昨今ARアプリをよく見かけますが、描画された3Dオブジェクトが浮いていると感じる場面が結構あります。
何も考えずにカメラで写した像の上に3Dオブジェクトを描画したらこんな感じになります。やっぱりなんか浮いてる。
特に、ライティング処理がもっとやりようがあると思います。 例えば現実の光源を推定して、3Dオブジェクトにかけることができれば、いい感じに見えるのではないかと思いました。 調べてみたところ、光源の推定はインバースレンダリングという分野に該当するそうです。
インバースレンダリング ... 画像から、「物体形状」「反射特性」「光源分布」を推定すること。
今回行いたいことはは「光源推定」なので、 反射特性と幾何形状が既知にしなければいけないそうです。
平面検出を使う。
MicrosoftのMixedRealityToolkitであったり、iOSのARKitであったり、最近平面検出を行うライブラリが結構ある気がします。 平面検出で得られた面を扱うことにすれば、幾何形状は「既知」になると考えました。
光源の色
模様のない板に、ある光が射している画像というものは、 単純な線形グラデーションとして扱うことが出来そうです。
例えば↑の画像は 左から
- 画像上方から緑の光が当たっている壁の一部分
- 画像1全体と、画像1内の最も暗い点との差
- 画像2の最も明るい点
- 画像3の明度を適当に調整したもの
です。 この画像から、光源の色相に関しては取れそうな気がします。
明るさは光源との距離によって変化する(距離減衰)ので、 同じようなサンプル画像を複数の位置でとる事で、光源の明るさも出せそうです。
光源の位置
平面サンプルを複数取り、そのサンプル一つ一つから - どちら側に光源があるか(2択) - その画像の座標、回転情報 の情報が得られれば、光源の座標は出せるんじゃないかと考えました。
大津の二値化(判別分析法)
大津の二値化は画像を二値化(白黒化)する際に、その閾値をうまい具合に決めるためのアルゴリズム、またはそれを用いた二値化処理の事を指します。
↑の画像の「とある壁の画像」は、肉眼で見るとわかりづらいですが、左側がやや明るくなっています。 「とある壁の画像」に対して、大津の二値化を適用すると、「大津の二値化を施したもの」になります。 この画像から、左側が明るく、光源が存在すると推定できそうです。 もう少し処理しやすくするために、2 x 2 ピクセルの画像にしました。
そこまで!
という所までやってみた所でSpeeeKaigi当日になってしまったので以上です。 ここまで試してみて
- 複数光源あることを考慮しなければいけない
- 大津の二値化後の処理はもっとうまくやる余地がありそう。
等、検討しなければいけない事が多数出てきました。
次回機会があれば、実際のデバイスを使って実装してみた所まで発表できればと思います。 ありがとうございました。
参考文献
インバースレンダリング:画像からの光学情報の復元 (佐藤洋一 東京大学 生産技術研究所) http://www.mtl.t.u-tokyo.ac.jp/~katsu-t/ssii05-ysato.pdf