複数画像の位置合わせによって白飛びを緩和する方法の検討

概要

光沢のある物体を撮影すると、光の反射によって一部の領域が白潰れしてしまうことがある。
撮影位置をずらしたり様々な対処法はあるが、ここでは微妙に撮影角度を変えて撮影した複数画像を使って対処する方法を考えたので共有したい。

まず扱う問題は以下のような白潰れである。

f:id:KYudy:20201123190648j:plain
白潰れが起きている画像の例

このように白飛びが起きていると、例えば画像からテキストが正しく読み取れなくなる。
試しにGCPOCRにかけてみるとこうなる

f:id:KYudy:20201123190944p:plain
GCPOCRのテキスト読み取り結果

CORONAのOが読み取れていないことがわかる。

手法の詳細

考案した手法の発想は微妙に角度をずらしながら撮影すれば照明が反射する場所を少しずつ変えることができ、それらの画像を平均することで白潰れを緩和できるのではないかというものだ。
ただし、角度を変えながら撮影すると画像上の対象物の位置が変わってしまうため単純に画像の画素の平均は意味をなさない。
そのために画像の位置合わせを行うことでこれに対処する。

画像の位置合わせの手法は以下を大いに参考にさせていただいた。
qiita.com

さて全体のアルゴリズムを図示するとこのようになる。

f:id:KYudy:20201123191808p:plain
手法の概要図
  • 1ステップ目では複数枚撮った写真の中で一つを参照画像(Reference Image)とし、それ以外の画像をReference Imageに対して位置合わせする。
  • 2ステップ目であh位置合わせされたすべての画像の画素値の平均をとりそれを出力とする。

非常に単純である。

ためしに先程のCORONAのストーブを撮影した下記の動画からフレームを抽出しこの手法を適用してみよう。
youtu.be

以下がその結果である。人目にCORONAがはっきり読み取れることがわかる。

f:id:KYudy:20201123193327j:plain
考案した手法の適用結果

次に適用前と比較する目的でGCPOCRにこれをかけてみる。

f:id:KYudy:20201123193433p:plain
GCP OCRの適用結果(考案手法適用後)

今度は正しくCORONAを読み取ることができた。
単純な手法だが、有効であることがわかった。

ソースコードGithubに掲載した。
github.com