OpenCVで画像の霞・モヤを除去してみる | Nature | Photography | Music | Art

Nature | Photography | Music | Art

日々好奇心の趣くまま

サイト内の写真の使用ならびに無断転用を禁じます。

入梅したのかと思うほど天候不順がずっと続いていてアウトドアに出ることも少なくなっています。
ということで当面は自宅でも遊べるテクニカルな方向へ逃避しようかと…

OpenCVというのはオープンソースのコンピュータービジョン向けのC++ライブラリです。

要は形状認識や動体追跡や顔認識などをはじめとする画像認識、またそれに付随する画像処理などがこれを使うと簡単に出来るわけで、最近トレンドの知的ロボットやDeepLearningのエンジンとしても標準的に採用されており、頻繁に改良や機能追加がされています。

写真・映像系の人々にはあまり関係ない…と思いきや、最新版ではHDRやスティッチングなどフォトグラファー向けの機能なんかも充実してきていて、目が離せないのです。

ということで、個人的には今後もOpenCVとの付き合いが深くなっていきそうなので、新たにOpenCVカテゴリを追加しました。

もちろん、PhotoshopやAfterEffects+プラグインで通常作業のほとんどのところは済んでしまうので、いざそこから一歩出ようとする場合にこれを使うと便利かも…という話です。もちろんプログラムを組めるスキルが前提になりますが。

OpenCVの正当な使い方などは、そちらの専門の方々が数多く書かれていて、Webでも情報が多々あるので、ここでは専ら写真や映像にこのライブラリをどうやって活用するかというニッチな点に絞って書いていければと考えています。
おそらくそういう用途に使っている人々はごく少数派と思われるので。

そういうこともあって、基本的なインストール方法やコンパイル方法については本家サイトや他の専門サイトに詳しく書いてあるので譲ります。

ちなみに以前作成したこの動画もOpenCVを大々的に使ってます。…というかOpenCVがなければ作れなかった一品です。

以上が前置きです。

アウトドアカメラマンにとって、これから春以降に困るのが黄砂やPMや水蒸気などで遠景が霞んでしまって眠い絵になってしまうことで、これをなんとかポスト処理で取り除けないかとWebで情報を探していた際にこんな論文を見つけた。見たところMicroSoftの研究所が出処らしい。

http://research.microsoft.com/en-us/um/people/jiansun/papers/dehaze_cvpr2009.pdf

内容はかなり専門的で、写真からHaze(霞)の量を推定してそれを取り除いた画像を合成しようというもの。

いろいろ数式が並んで難解だが、要旨は次のようなことのようです。

霞がかかった画像の特徴は、「あるピクセルの近傍に黒色が存在しない」ということ。
つまり、本来(空を除く)遠景の中には必ず影などが至るところにあるため黒い部分がほぼ満遍なく存在するはずだが、霞んでしまうとその黒が白くなってしまいコントラストが低くなってしまうわけです。

これを前提にすると、該当する画像上のすべてのピクセル近傍の最も黒い部分を探して、ノイズ除去のために少々スムージングをかければその近傍の霞の量が推定でき、霞によって底上げされた輝度を引き算してやることで本来の霞のない黒色を取り戻すことができるということ。

更に探してみると、このアルゴリズムをOpenCVを使ってC++でインプリメントした方がおられます。ライセンスが不明ですが。

https://github.com/Chrisawa/image-video-dehazing-OpenCV

非常に出来がよいのですが、最近のOpenCVではファイル構造が変わっていてコンパイルが通らないので、少々手直ししたものを以下に張っておきます。(OpenCV 2.4.5で動作確認)

[DL]

個人的に使いやすいように外部から静止画ファイルとw(後述)の値が指定できるようにしています。また、中間画像も保存するようにしています。あと、途中で使用するスムージング用のブラーをmedianからgaussianに代えるとか(16bit tiffでも問題なく処理したいので、制限の少ないgaussianBlurを使った)。

動画用と静止画用の両方が入っており、コメントアウト部分を付け替えることでどちらにも対応できます。(動画部分は弄ってないので少々手直しが必要かと)

コンパイル後、使い方はコマンドプロンプトで

dehazemdcp [画像ファイル] [wの値]

で起動・処理。

例えばhoge.tiffを強度軽めに処理をしたければ

dehazemdcp hoge.tiff 0.65

とか。

処理が終了すると元画像と結果画像が並んで表示され、いずれかのキーをヒットすれば終了します。

終了後に生成される画像は

beforeafter.jpg: 使用前・使用後比較
darkChannel.jpg: ダークチャンネル。白い場所ほど霞が多いと判断される。
t.jpg: 黒いところほど多くの輝度が引き算される。
dehazed.jpg: 結果

前述のwの値ですが、これが効果のかかり方を制御するもので0~1の間の少数、デフォルトでは0.75、これより小さいと効果が少なくなるが現実的に、大きいと効果が大きく現実離れしてくる。

実際やってみた結果が以下です。





ご覧のように、霞みが取り除かれて、白っぽい部分のコントラストが強くなったのが分かるかと思います。

wの値が増えていくと、HDRのトーンマップをかけたような感じなって、なんだか海外の風景写真に良く見かけるような派手な色合いに変貌します。

通常のコントラスト操作との相違は、局所的に最適なレベル操作をしていることで、ただコントラストを弄っているだけではこのような効果は難しいでしょう。

論文内では、「空にかけちゃダメ」と書いてありますが、空にかけるとCPLフィルタをかけたような効果も出るので、そのような使い方もアリのように思います。

生成された画像単体ではウソ臭くなりすぎるので、元画像とうまくミックスして適材適所で使用すると結構使えるような気がしています。