レンズの歪曲収差と対応方法(5)
前回(第4回)に引き続き安倍晋三元首相がツイートされた光学歪みのある写真を、ImageMagickとopenCVを用いた補正を行いつつ関連した解説を行います。
手順
- 歪んだ写真(元写真)を用意する
- 公式写真を用意して元写真と(中心から)同じ位置同じ顔の大きさに合わせる
- 公式写真にdistortion処理をかけ複数枚の写真(distortion写真)を得る
- 元写真とdistortion写真を顔認証処理(FACE01 IMAGER)にかけ、最もdistanceが小さいdistortion写真の歪み係数(ImageMagick)を得る
- チェスボード画像に対して同じ値のdistortion処理をかけ歪んだチェスボード画像を得る(ImageMagick)
- 歪んだチェスボード画像に対してopenCVを用いてキャリブレーション処理をかけ、各種値を得る
- 元写真に、得られた各種値を使ってopenCVによるundistort処理を行う
- 得られた写真を検証する
歪み画像補正からチェスボードの歪みエミュレートまで
公式写真と比べ元写真には光学歪みがかかっていることが分かります
公式写真を元写真と同じ光学歪みが発生する様、中心からの距離・傾き・大きさを考慮して配置します
ImageMagickによって生成した多数の歪み画像をFACE01 IMAGERに処理させます。
最も顔距離が近いものを補正後画像として補正前の画像と比較しました。
ImageMagickによる補正前後と元写真を比べてみます。おおよそ狙った光学歪みがエミュレート出来ていると思います。
得られた歪み係数を用いて元画像をImageMagickで補正し、補正前後で比較しました
チェスボード画像に対して得られた歪み係数を用いると以下のような光学歪みがエミュレート出来ます
歪みエミュレートからopenCVによるパラメータ取得と補正まで
さて光学歪みをエミュレートしたチェスボード画像に対してopenCVのundistort()関数を用いて補正し、各々を比較したのが下図です
これにより得られた各パラメータを用いて補正し比較したものが下図です
まとめ
単純な樽型・糸巻き歪みであればImageMagick・openCV問わずエミュレートしたり補正したりすることが出来ます。ただ残念なことにImageMagickのPythonバインドライブラリはパッとしない印象を持っています(古かったりWandの様に別途ImageMagickのインストールが必要であったり)。第1回から今回の第5回まで全てシステムインストールしたImageMagickをPythonから呼んで使っています。Python(とそのライブラリ)以外はシステムインストールに制約がある場合足かせとなってしまいます。
光学歪み特性はカメラによって異なります。異なるカメラで撮影した顔画像同士を顔認証すると精度低下の主たる原因となります。
これを解決するには全てのカメラをキャリブレーションした状態で用いるか、どれかの顔を補正エミュレートする必要があります。しかしながら顔認証用機材に使われるカメラをキャリブレーションしても、既に撮影済みの証明用顔写真データをキャリブレーションエミュレートしたとして揃えられている全てのイメージデータが一つのカメラで、しかも等距離で揃えられていると考えて認証データとして扱ってしまうのは危険です。
この様にキャリブレーションする事を考えずに正しい認証データを得るには使用する顔認証用機材に使われるレンズで証明用顔写真データを取得する必要があります。
例えばFACE01に学習モードをつけユーザーに確認を促すことで認証用写真データを取得することが出来ます。予め用意されたキャリブレーションされていない顔写真データを使用する際、一定以上の顔距離の場合にユーザーに確認するようにします。他人である場合にはこの処理をスキップするようにすればよいのではと思いました。
ノートパソコンのカメラやWEBカメラの場合広角レンズを使っていることが多いことから光学歪みが多く発生します。この場合新設するキャリブレーションを用いると良いと思います。
話は変わりますが、顔領域の歪み補正といえば2019年にGoogleから「Distortion-Free Wide-Angle Portraits on Camera Phones」という論文が出ています(MIT)。背景への影響は最小限に顔領域だけ歪み補正をかけるアルゴリズムが紹介されています。顔認証目的ではありませんが素晴らしい技術だと思います。
今回かなりざっくりでしたが補正エミュレートの一例を紹介しました。あれやってこれやってと色々やっていますが実際にはプログラム中で行われますので煩雑ではありません。スクショ用に画像を用意するほうが大変でした。今回でImageMagickとopenCVを用いた歪み補正のシリーズを終了します。写真を歪ませたり補正したりいじくっていただけですが「こんな風に歪んでこんな風に補正する」雰囲気が伝われば嬉しいです。また光学歪みがある顔写真が顔認証に使えない(使えるけど精度が著しく落ちる)理由を感じ取って頂ければ望外の喜びです。
最後までお読み頂きありがとうございました。