過去何回かにわたって、Pythonによる画像処理の勉強がてら、スマホのオートで撮ったイマイチな写真を複数枚合成して、それなりな写真に変換する画像処理に関して考えてみました。基本的な処理はほぼ同じで、シチュエーションや被写体に応じてそれっぽい写真を作ることができたと思っているので、今回はそのまとめをしようと思います。
基本的にはPhotoshopでできることばかりだと思います。がPhotoshopは使いません。Pythonをちょっといじるとここまでできるんだぁ。を共有できればと思います。論文レベルの難しい処理は何もしてないです。
コードも散らかってきました。とはいえPythonさんのすごいところは行数が半端なく少ないこと。OpenCVの力を使っているとはいえCではこうはいかないです。
スマホによる連写撮影
スマホのカメラアプリからだと、あまり撮影条件の調整ができないです。もちろんそのあたりが調整できる多機能なカメラアプリもありますが、デフォルトのアプリは基本的にはオートで撮影することを前提としています。
ただその中でも、通常装備されている機能の一つにバースト撮影という機能があります。いわゆる連写です。連続撮影写真です。シャッターを押してる間写真を撮りまくってくれます。この機能は、動きのある被写体から、これという一枚を取り逃さないようにするのが主目的です。
とはいえ、いっぱい取ってくれます。いっぱいあればいいとこどりができます。基本的な発想は複数枚のイマイチな写真から、このいいとこどりして1枚のいけてる写真に仕上げることです。
この複数の写真のいいとこどりをするにあたってポイントとなるのが、複数の写真の位置合わせとその合成になります。その処理をいろいろ工夫してアプリケーションとして仕上げました。
アプリケーション
それなりに面白い結果が出せていると思います。ノイズ除去、光軌跡、流れ止め、流し撮り、ポートレート風。これらすべてをスマホ、手持ち、オート、連写で撮った写真をソースに実現させます。
ノイズ除去
スマホの画像センサは、いわゆる一眼レフのそれに比べると非常に小さいです。レンズもしょぼいものです。特に暗いところで撮影するとノイズだらけです。スマホ内処理でかなり頑張って補正しています。
通常ノイズを減らそうと思うと、シャッター速度を伸ばします。光をセンサで受ける時間を延ばしてやることでS/Nを改善させます。通常のカメラアプリだとそのあたり調整することができません。また、シャッター速度を伸ばすと今度は手振れを起こします。
複数枚撮影した写真を合成することでこのノイズを除去してやろう。というのが基本的な処理です。1枚1枚はノイズが多くても、それを合成することでノイズ成分を除去することができます。疑似的にシャッター速度を伸ばしたイメージです。マルチショットノイズ除去とか、そんな名前でカメラやスマホにも搭載されている機能です。
これが結果です。ピクセル等倍表示です。拡大したわけではないです。10枚の加算合成でここまでノイズが取れます。
カメラを固定して連写できれば簡単です。画像を足し算するだけです。
ただ、三脚固定は面倒なので、手持ちでやりたくなります。ココでポイントとなるのが複数枚画像の位置合わせです。それらの写真はシフトするし回転します。いわゆるブレです。手持ちなので。
これを位置合わせして直します。OpenCVを使ってやるとなんとも簡単にできました。
ただし、このままでは被写体によってはちょっとうまく行きません。
画角変わることで被写体が変形します。特に近くのもの。遠くの被写体は微小なカメラのぶれに対して、それほど大きな影響はないのですが、テーブルの上の料理とか、近くの被写体だと変形が大きいです。位置合わせをしても、部分的に大きくずれます。近くのものほど左目と右目で見え方が違う。そんなイメージです。
それに対して合成を工夫して、ベースとなる画像からずれが大きい部分は合成対象から外すようなことをします。これで近くの被写体にも対応できました。
今度は、被写体が動くことまで考慮します。複数人を撮影するシチュエーションです。この際には、画像をブロックに分け、位置合わせを局所的に行って、解消させました。
ここまでやると処理時間がエライかかります。5,6枚でも十分な効果が出せます。
暗部のノイズが大きくとれるので、超解像っぽい効果を出すこともできました。
ノイズ除去の効果もばっちりで、スマホ写真ではあまりやりたくなかった後処理(トーン調整やトリミング)をする気になります。
光の軌跡の撮影
複数枚の写真から、光の軌跡だけを残す処理です。これも連写写真からそれっぽい結果を出すことができました。
夜、車の通りが多い道路の写真で、車は消えるが、ヘッドライトやテールライトの軌跡だけが残る。そんな写真です。これも通常は三脚固定の秒単位の長秒露光なのですが、これも処理で模すことができました。
これも先のノイズ除去同様、位置合わせと合成が肝なのですが、この場合は合成の方を工夫する必要がありました。位置合わせは先のノイズ除去と同じもので十分でした。
オートで撮影した適正露出の写真を、疑似的にアンダー露出にトーン調整し変換したうえで合成することで、それっぽい結果になりました。
とはいえ連写なので限界もあります。光の軌跡は破線状になってしまいます。
水面の波を消す
これも長秒露光撮影の定番です。湖の湖面にある波をなくして静かな水面を表現する撮影技法です。滝の撮影でもよくつかわれます。やはり三脚プラス長秒露光。加えてNDフィルターも必要になるかもしれません。いやです。
これに関してはノイズ除去の処理をそのまま使うだけでうまく行きました。
滝撮りに行きたいです。
流し撮り
少し長秒露光とは趣が異なります。カメラの方を動く被写体に合わせて動かして、背景を流す撮影技法です。とても難しいです。これを今回はカメラの方は固定して連写することでそれっぽい効果を出しています。
やはりポイントは位置合わせと合成なのですが、この時の位置合わせは動く被写体をターゲットにする必要があります。その被写体で位置を合わせることで、背景が流れます。
が、連写で撮影した、時間的に連続しない離散的な写真では背景がきれいに流れませんでした。
これに対しては移動ブレを模したフィルタを作ってみました。Photoshopの処理の真似です。これをかけることで疑似的に背景にだけ移動ブレを起こさせてなんとなくそれっぽい写真に仕上げています。
あまり動きの速い被写体には適用できませんでした。ゆっくり動く被写体か、かなり高速連写ができるカメラを用意する必要がありそうです。スマホ限界を感じます。
処理自体は一眼レフの写真に対しても行えるので、それをソースに使った方がいいかもしれません。もしくは動画をソースにするのもありかも。それであれば秒30コマとかそれだけ取れます。
ポートレート風
被写体の背景がぼけ、被写体が際立ついわゆる一眼レフの明るいレンズで撮った「風」の写真です。これもスマホの連写で実現できるか試してみました。
いろいろ脳みそ使って、被写体のエッジ部でボケの影響が背景ににじまないようにとか、ぼかした背景と、しゃっきりした被写体の切り替わりが目立たないようにとか、考えてそれっぽい結果は出てます。
が、まぁまぁってとこですかね…。左がソースで、右が変換後。微妙に違和感なく背景だけぼけてますかね。適当なアプリによる背景ぼかしよりは、マシかな…。そりゃでかいカメラが一番ですって。
まとめ
スマホオート連写をソースとした画像処理をいろいろ試してきたものをまとめてみました。
暇なときにコツコツとコードを書いてあーでもない、こーでもない。と遊んできた結果です。それぞれの記事もとりとめもないですが、より細かく処理を説明してあります。個人的にはデノイズは使えると思います。レタッチに耐えられるようになります。スマホでの撮影は連写にしときます。
ここぞというときにポケットからさっと取り出すのはスマホです。連写で撮っとけば後工程で何とかなりそうです。バースト撮影だとカシャカシャとすごい音がしますけどね…。
この一連の処理の肝になる位置合わせと合成の処理に関してそれぞれまとめとこうと思います。コードもそちらでまとめようと思います。
コメント