2024年7月21日日曜日

簡易的な暗視カメラ Nocto Camera を作った

OpenCV の練習で簡易的な暗視カメラ Nocto Camera を作りました。 暗視カメラと書いていますが、露出不足の環境でも綺麗に撮影ができるカメラアプリです。 画像のコントラストを補正する画像アプリとしても使えます。 暗視カメラとか使ったことないし、使う人もそんなにいない気がするのですが、 今回は OpenCV のアルゴリズムの精度と速度を確認する勉強目的で作ったので、まあ良いです。



たとえばこんな感じになります。



アルゴリズムは CLAHE ヒストグラム平均化を利用しています。 類似アルゴリズムとしては ToneMap を使った HDR (High Dynamic Range Imaging) があります。

Tonemap

ToneMap は露出時間の異なる撮影を行った画像が複数枚必要なので、 CLAHE ほど手軽には使えないアルゴリズムなのかなと理解しています。 ToneMap を使うとしたら露出時間の異なる撮影データを自動で用意しないといけません。

Web 上だとカメラ撮影でも複数の撮影データを自動で用意するのはなかなか難しいです。 iPhone/Android の 自動 HDR はおそらく ToneMap を利用していますが、 カメラが 1つしかない iPhone 7 時代から HDR 機能はあるので、 露出時間を変えたものを同時に撮影して ToneMap をしていると予想できます。 ただこれと同じようなことを Web 上で実現しようとすると、 まずは exposureTime を設定してカメラを起動する必要があります。 iOS では exposureTime の設定自体が存在しないので、現状できません。 iOS 以外だとカメラの設定変更と撮影を繰り返せば実現はできそうですが、 切替に多少時間が掛かるため撮影に時間が掛かりそうです。

ビデオ撮影の場合、最近の iPhone のようにカメラが複数付いていれば、 露出時間をそれぞれ変化させて動画撮影して ToneMap させたり、 カメラの撮影条件を微妙に変えて推定できるのかなと思ったりしましたが、 ハード依存が強いのでパスしました。

CLAHE

さて CLAHE についてですが、完全に真っ暗の環境で Webcam 撮影した時は、あまりうまく行きませんでした。 暗すぎると物体があるかどうかすらきちんと判断できないので、 綺麗な表示をするためにはある程度の光源が必要です。 光源が強くないときちんと動作しないようでは暗視カメラとしては残念ですけね。

ただ表示の綺麗さを求めなければ、 clip limit を 0 にしたとき良い感じの暗視カメラとして動作します。 これは輝度値が 0/1 の差しかなくても反応するモードなのでノイズが非常に多いですが、物体も発見しやすくなります。 パソコンの黒画面程度の光しかない環境でも、近場にあるものは非常に綺麗にカラー判別できることがわかりました。 ちなみにパソコンの白画面程度の光があれば、数メートル離れたところにあるものは何となく判別できる、くらいの精度では動作します。

ノイズが大きいのは 8bit で処理しているせいもあるかも知れませんが、ビット数を増やすと処理速度の問題が出てきそうです。 確認していませんが、CLAHE は 16bit で処理させることもできるようです。clip limit = 0 の時には使えるかも?

equalizeHist, Gamma correction

equalizeHist() でもだいたい良い感じの結果は得られます。ただ明るい部分だけが明るくなりすぎるのが欠点です。 Gamma correction は色を暗い環境に合せて表示できるので、安定した結果が得られます。 ただ暗すぎるときは詳細を得られません。 色を変えずに詳細部分を強調したいなら CLAHE が向いていますが、暗すぎるとあまりうまく行きません。 そこである程度暗いときには equalizeHist() + CLAHE か、Gamma correction + CLAHE のように組み合わせるのが良い感じです。 詳細を得るにはやはり CLAHE はあったほうが良さそうです。 どちらのメソッドも 8bit で動くので、ノイズに関してはあまり深く考えないほうが良いかも。 ただこれらは 8bit でも影響は少ない気がします。

TODO

とりあえず現状でもまあまあ使えるかも知れませんが、カメラの起動オプションなどを弄ればさらに精度は上がる可能性があります。 ただ Web API からいじるのは現状だと不安定感があり、iOS のサポートもできないので、 現状ではこれ以上は欲張らないほうが良さそうです。 iOS が advanced options をサポートしたらまた改良してみます。

0 件のコメント: