夜や室内などで撮影すると写真にどうしてもザラザラとしたノイズがのって画質が劣化してしまいます。デカいカメラを持って、三脚使って長秒露光すれば良いのですが、いつもそんなのを持ち歩いているわけではないので、どうしてもスマホで「ハイチーズ」になってしまいます。最近キャンプにすらカメラ持って行くの忘れるし。
今回そのノイズを取り去るツールを作ったので覚書で残しておきます。
コンポジット合成
Photoshop使ったコンポジット合成でノイズ除去が実現できるそうです。Photoshop持ってないので比較できませんけど。
複数枚の写真を重ね合わせて平均値(もしくは中央値)を取る方法で処理としてはシンプルです。重ね合わせを自動でやってくれるようなので、多少の手振れは問題なさそうです。
その機能をもう少し改良して、複数枚の写真の中で多少の動きがあってもそれなりにノイズを取ってくれるコードを書いてみました。せっかくなのでツール化してみたのでその使い方をメモしておきます。Photoshopが無くても効果が確認できます。
動きといっても歩いているとかそんなのではなくて、「ハイチーズ」で固まってもらってそれを手持ちで連写するレベルですけどね。
download
ここ
使い方
いたってシンプル。バースト撮影した複数枚の写真を一つのフォルダに入れておき、そのフォルダを指定することで画像を自動で重ね合わせて合成します。スマホにも普通にバースト機能はあるのでそれで撮影した写真をイメージしています。基準となる画像は最後の1枚です。連写した最後の1枚のノイズをそれより手前の写真を使ってノイズ除去します。
面倒なのでなんのパラメータも調整できません。
処理状況をコンソールに出す様にしたのでそれも一緒に立ち上がります。ボタンは2つ迷うことは無いと思います。
拡張子は*.jpgのデータです。OpenCV使っているのでTiffでもなんでもOK何でしょうけど拡張子でフィルタしてしまったので選べません。rawも行けるようにしたのですが使いどころが分からなかったのでjpeg縛りにしました。
一応exifデータも引き継ぐ様にしたつもり。
処理時間はくそ遅いです。処理がとても重たいので…。5,6枚で試してみてください。また起動してからGUIが立ち上がるまで時間がかかります。実行ファイルの大きさもめちゃくちゃデカいです。そんなものです。
処理中。気長に待ってください。終わると”running”が”run”に戻ります。
効果
11枚合成の結果。曇り。日中。ピクセル等倍
2倍拡大
9枚合成。夜間。テントの中。ピクセル等倍
こんな感じ。全体は表示しません。あえて人物の部分を拡大してます。人物なのでもちろん最初のフレームと最終フレームでは多少の動きがあり位置がずれていますが、ボケることなくノイズだけ取れています。
ただゴマ粒状のいわゆるスパイクノイズは取れていません。原理上しょうがないです。画像エッジの先鋭性を保存することを優先させた結果です。
自分もここまでの効果が出せるとは思ってませんでした。
コード
ポイントとなる位置合わせの処理と合成の処理は過去に記事にしたそれをそのまま使っています。
Pythonコードのexe化というのを試し、なんとなく完成したようなのでexeをアップしておきます。
pyinstallerというを使って作ってみました。Web調べながら作ってみたのですが、
ImportError: cannot import name ‘PackagePath‘ from ‘importlib_metadata‘
こんなエラーで引っかかったのですが
pip install importlib_metadata --upgrade
で何とかなりました。解決方法がちょっと直感的に分かりにくかったのでメモとして残しておきます。
他にも色々引っかかったのですが出来上がりはしました。関連するライブラリをすべて飲み込んでいるので、前述の様に実行ファイルがかなり大きいです。全部を使っているわけではないので小さくする事も出来そうですが、面倒なので今回はそのままにしています。またGUIの起動が遅いのもそんなもんらしいです。回避方法もありそうですが、それもまた面倒なので諦めました。
Pythonのコードはバイナリにして配布するのには向かない。という事が学べました。Cで書き直せばもっと処理も速くて実行ファイルも小さくなるのでしょう。その元気もありません。本来スマホで動作するようにするのが一番クールなのでしょう。
コメント