豪鬼メモ

一瞬千撃

AEブラケッティングを介した擬似STFモード

アポダイゼーションフィルタを使って錯乱円の境界を曖昧にすることで、とろけるようなボケを得るSTFレンズというのがある。一方で、絞りを変えながら同一の被写体を連続撮影して平均合成すれば、STFレンズと同様の効果が得られることが知られている。ところで、絞りブラケット撮影機能はあまり普及していないが、Sモード(シャッター優先オート)でAEブラケット(露出ブラケット)撮影をすれば、露出は異なるが絞りを段階的に変えた写真を一気に撮影することができる。ならば、AEブラケットの結果を後処理で露出を揃えてから平均合成すればSTFモードの代替になるのではないかと考えた。結論としては、ちゃんとSTFモードの代替になる。以下のようなとろけたボケが普通のレンズと普通のカメラで出せる。
f:id:fridaynight:20220306112728j:plain


元画像の一枚は以下のF2.0もので、M.Zuiko 45mm F1.8で撮っている。これをはじめとして、F2.2、F2.5、f2.8、F3.2、F3.5、F4.0と、1/3EV刻みの7枚を合成している。ボケが大きいのはF2.0の方だが、ボケが美しいのは疑似STFの方だと感じる人が多いのではないか。
f:id:fridaynight:20220306112741j:plain

AEブラケットを介したSTFモードの再現方法を説明する。まずSモードにして、AEブラケットの設定で1/3EV刻みで7枚撮影を指定する。そうすると、+1EVまでの露出オーバーで3枚、適正露出で1枚、-1EVまでの露出アンダーで3枚を撮影してくれる。白飛びは後処理で回復できないので、露出オーバーの最高値が適正露出になるようにしたい。よって、露出補正を-1EVにする。この状態で、シャッタースピードのみを調整して、絞りが開放より1EV下がった状態になるようにする。F2.0が開放であれば、F2.8になるようにする。M.Zuiko 45mm F1.8の開放はF1.8なので、F2.5にするのが最もボケを大きくできるが、今回はF2.8にしている。そうすると、上に述べたように、F2.0、F2.2、F2.5、f2.8、F3.2、F3.5、F4.0の7枚の合成となる。合成した際に構図に差異があるとブレた画像になってしまうので、三脚を使うなりしてカメラを固定した状態で撮影するのは必須だ。また、主要被写体が静止していることも条件となる。

なんだか面倒と感じるかもしれないが、「Sモード、1/3EVの7枚AEブラケット撮影、露出補正-1」のユーザ設定を作っておけばよい。それをダイヤルから呼び出して、F値が開放1段下になるようにSSを調整してから撮れば良い。あとは、その結果をLightroomなりSilkypixなり各メーカーの現像ソフトなりで露出を合わせてから平均合成すればよい。後述するが、露出を自動的に合わせて平均合成するためのプログラムを自分で書いて、私はそれを使っている。MacWindowsLinuxPythonImageMagickがインストールされていれば動くはずだ。LightroomのstackingとHDR機能で合成しても似たような結果は得られる。


以下、うんちく。昔のミノルタのalpha-7というカメラには、絞りブラケット撮影の結果を平均合成するSTFモードなる機能があったそうだ。それがあれば、STFレンズでない普通のレンズでも、手軽にSTFの効果のある写真を撮ることができたらしい。自分で絞りを変えながら撮影した結果を合成してみても、結構いい感じの絵が出てくることは以前の記事の実験で確認している。以下はその際に手で絞りを調整しながら1枚ずつ撮って合成したものだ。
f:id:fridaynight:20191108192058j:plain

STFモードでは玉ボケにバンディングが出るのが欠点と言われるが、よっぽどでかい玉ボケでなければ視認できないので、問題ないケースも多いだろう。確かに人間の瞳孔は円形であり、その縁がグラデーションにはなっているわけではないので、点光源の錯乱円を均一色の円で描写するのは理にかなっている。よって、縁をグラデーションにしようとする時点で既に不自然さを増す行為とも言える。その模様が段階的であっても不自然さは五十歩百歩といったところだろう。しかし、ある瞬間の人間の視覚的認知を再現可能にするのが写真の目的というのであれば、詳細には認知できないはずの被写界深度の外側の像がどう描画されても違和感が足されるわけではないとも言える。認識できなかったものが認識できる時点で違和感があるはずだからだ。つまり、ボケ部分の陰影が詳細には認識できなかったという事実が再現できればよいとも言える。ボケ部分に鑑賞者の意識が向かないようにすることで結果的に主要被写体を引き立てるというのが撮影者の意図なのであれば、瞳孔の形を再現することよりも、絵画の消失遠近法のように、ボケの輪郭を意図的にとろけさせて目立たなくすることを重視するというのは妥当な選択の一つだ。ちなみに、人や犬の瞳孔は円だが、猫や狐は縦長で、馬や鯨は横長で、ペンギンの瞳孔は正方形で、イカの瞳孔はW型らしい。生物としては、円形絞りだけが正解ではなく、錯乱円が錯乱四角であってもグラデーションであっても何ら問題ない。

話を戻すが、STFの作例では、ボケ量が減っていてもボケが目立たないという特徴だけでなく、被写界深度が深くなっているので主要被写体の陰影がより明瞭になるという特徴がある。結果として、主要被写体の存在がより際立ち、視線誘導の効果がより高まるのが美点だ。言い換えれば、背景や前景と主要被写体を分離するために被写界深度を浅くする過程で主要被写体の全体がくっきりしなくなってしまう問題に悩まされる頻度が減る。個人的にはこの被写界深度を深くできるという点が最も好ましいと思っている。

さて、残念ながら、最近のカメラでSTFモードを実装したものは聞かない。最近発表されたOM-1あたりはコンピュテーショナルフォトグラフィ機能の豊富さを喧伝しているのだから、STFモードが実装されていてもよさそうなものだが、実装されていない。それどころか、絞りブラケット撮影すら実装されていない。オリンパスのカメラはフォーカス位置を変えて撮影するフォーカスブラケットはあるが、絞りブラケットはない。絞りブラケットがあれば、その結果を平均合成するとSTFモードと同じ結果が得られるのだが、残念ながら現在市場にある多くの製品では実装されていない。PENTAXのカメラには被写界深度ブラケットというのがあって、これはまさに絞りブラケットなのだが、3枚しか撮れないらしい。

一方で、AEブラケット(露出ブラケット)は、メーカーを問わず、多くのカメラで実装されている。シャッタースピードを固定するSモード(Tvモード)でAEブラケットを使えば、その露出は絞りを変えて制御されるので、結果的に被写界深度の異なる複数枚の写真を撮ることができる。主要メーカーの大抵のカメラでは0.3EV刻みで7枚のブラケットができるので、STFモードの材料にするには十分だ。しかし、AEブラケットだとそれぞれの画像の露出が変わってしまうので、そのままでは合成ができない。そこで、基準となる1枚にその他の写真の露出を合わせてから、平均合成すればよいと考えた。SモードのAEブラケットで撮った複数の画像をアップロードすると、STFモードのような画像を生成してくれるプログラムを書いた。

ソースコードはこちらである。例によって、実装はPythonからImageMagickのconvertコマンドを呼び出す仕組みになっている。実際のコードはこちらである。実装のポイントを示すと、以下のようになる。

  • 個々の入力画像において、RGB画像としての平均輝度を算出し、全画像の中央値を取得する。
  • 個々の入力画像のRGBの値に対して、中央値と自分の平均輝度の割合を掛ける線形変換を行って露出を合わせる
  • 全画像を平均合成する
  • コマンドのパラメータで指定された線形変換、シグモイド変換、スケール対数変換を適用する
  • 結果をsRGBに変換して、JPEGまたはTIFFで書き出す。入力画像にICCプロファイルがあれば、それを再適用する。

処理結果の例をいくつか挙げておこう。それぞれ違うレンズ(M.Zuiko 45mm F1.8、M.Zuiko 25mm F1.8、Leica Summilux 15mm F1.7)で撮っているが、ちゃんと輪郭がとろけて、STFレンズの作例っぽくなっているだろう。前ボケがジワーっと滲むようになっているのが好印象だ。玉ねぎボケっぽく感じることも全くない。
f:id:fridaynight:20220306114459j:plain
f:id:fridaynight:20220306114512j:plain
f:id:fridaynight:20220306114530j:plain

ボケが小さい場合でも、小さいになりにとろけたボケになるのも美点だ。そんなにボケてないのに、主要被写体が浮き出て見える。以下の例も上記と同じ3つのレンズで撮っている。
f:id:fridaynight:20220306120130j:plain
f:id:fridaynight:20220306120243j:plain
f:id:fridaynight:20220306120338j:plain

他の例も挙げよう。AEブラケットを設定するだけでSTF風にできるようになるので、手で絞りを変えながら1枚1枚撮るのに比べれば随分楽になった。後ボケだけでなく前ボケもとろけるところもSTFの美点だ。
f:id:fridaynight:20220306120938j:plain
f:id:fridaynight:20220306121654j:plain
f:id:fridaynight:20220306161535j:plain
f:id:fridaynight:20220306161616j:plain
f:id:fridaynight:20220306161555j:plain
f:id:fridaynight:20220306161647j:plain
f:id:fridaynight:20220306161720j:plain

欠点もある。まず、画像間での構図の差異を吸収する実装は入れていないので、解像度を維持するためには三脚必須である(追記:後に、手持ちSTFモードも実装した)。上の例ではゴリラポッドなるプラスチックの三脚で撮ったが、そういう簡易的なのだと微妙にブレてしまうので、できればちゃんとした三脚を使うべきだ。また、動体の撮影には向いていないし、風で被写体が揺れても結果がザワザワしてしまう。以下の例は手持ちで撮ったのでだいぶブレた結果になっている。でも、OM-1の50FPS連写とかなら手持ちでもいけるのかもしれない。
f:id:fridaynight:20220306122205j:plain

さらに、AEブラケットの結果を使うことで、HDRに似た癖が出る。つまり、露出オーバー画像を合成することによって基準画像のハイライト部分はより飛びやすくなる一方で、基準画像で既に飛んでいる部分は露出アンダー画像によって救われて多少色を取り戻す。露出アンダー画像のノイズは露出を上げることで増幅されるが、その他の画像を合成することで全体のノイズは低減される。この点を鑑みて、冒頭で述べた撮影手順では、1EV下げて撮影することを提案している。1EVも下げるのは露出オーバー画像の白飛びを防ぐのが最大の理由だが、それだけじゃない。自動合成プログラムが露出アンダーの画像を自動露出補正する際の線形変換で起こりうるオーバーフローによる白飛びを避ける効果もある。結果として、自動合成プログラムの結果は1EVアンダーな暗い画像になる。そのままでは鑑賞に向かないので、後処理で各種の露出補正アルゴリズムを適用できるようにもしている。

実際に自動合成プログラムを利用してみよう。1EVアンダーを基準に撮影した7枚のAEブラケットの画像があるとする。最善の画質を得るためには現像ソフトで16ビットのTIFF画像を出力するべきだが、実際のところ、JPEG画像でも全く問題ない。例として、image001.jpgからimage007.jpgというのが存在するとしよう。それらを合成して、merged.jpgというのを作る。1EVアンダーなのを補うために、シグモイド補正2とスケールログ補正1も指定する。これは、合成画像の平均輝度を変曲点としたシグモイド曲線やスケール対数曲線をトーンカーブとして補正を行うものだ(詳しくはこの記事この記事を参照)。

$ jkzr_combine --sigmoid 2 --slog 1 --sharp 1 merged.jpg \
  image001.jpg image002.jpg image003.jpg image004.jpg \
  image005.jpg image006.jpg image007.jpg

アルゴリズムの挙動を熟知した上で露出を調整するのには慣れが必要だが、--sigmod 2 --slog 1で大体の場合はOKだ。しかし、正直なところ、Lightroom自動露出補正してからPhotoshopで合成した方が楽だ。とはいえアドビ税を払いたくない人も多いだろうから、OSSのコマンドで合成ができるというのも悪くないだろう。

コマンドの詳細な仕様は以下のようになっている。

jkzr_combine [-h] \
   [--multiply num] [--sigmoid num] [--slog num] \
   [--resize num] [--sharp num] \
   output_path input_paths [input_paths ...]

つまり、第1引数に出力ファイルを指定して、第2引数以降に入力ファイルを指定する。出力ファイルと入力ファイルにはJPEGTIFFが指定できる。各種オプションの機能は以下の通り。

  • --multiply num : 出力画像の輝度をN倍する。1が無変化で、1未満なら暗くなり、1超えだと明るくなる。
  • --sigmoid num : 出力画像の中間輝度を変曲点とするシグモイド曲線で補正を行う。0が無変化で、正ならコントラストが高まり、負ならコントラストが低まる。
  • --slog num : 出力画像をスケール対数曲線で補正を行う。0が無変化で、正なら明るくなり、負なら暗くなる。
  • --resize num : 出力画像の長辺がnumピクセルにリサイズする。0なら無変化。
  • --sharp num : 出力画像のシャープネスを増す。0なら無変化。正数ならシャープにし、負数ならぼかす。

ガチな利用法では、RAW現像ソフトで書き出した16ビットTIFFを使うのがよく、その際にはシャープネスはかけずに、コントラストも低めに現像しておくのがよい。明るさは自動調整されるし、合成後の仕上げに明るさやコントラストやシャープネスを調整する方が仕上がりがよくなる。

1EVアンダーで撮影した場合、それを元に戻すには輝度を2倍すればよいことにはなるが、--multiplyは使わない方がよい。白飛びしやすいからだ。--sigmoid 2 --slog 1とか、--sigmod 3 --slog 0.5とかが妥当だろう。シグモイドの変曲点が出力画像の平均輝度に自動設定されるところが重要で、結果的に、明るい画像は暗く調整され、暗い画像は明るく調整される。シグモイドだけで調整するとコントラストが上がりすぎる場合に、スケール対数曲線で微調整する感じだ。シャープネスは0.5から2くらいの間で調整すると良いだろう。


まとめ。SモードでAEブラケットをすると絞りブラケットと同様に絞りを変えて撮影してくれるが、露出が変わってしまう。その露出を後処理で合わせてやって、それから平均合成すれば、古のSTFモードが復活する。面倒な工程が必要ではあるが、結果として得られる画像はかなりいい感じになることが確認できた。露出補正と平均合成は簡単なプログラムで自動化できるので、気軽に試せるようになった。STF処理済みの画像を見てから、処理前の画像を見ると、荒れたボケだなぁと思うようになるだろう。

ていうか、各カメラメーカー様には、ぜひSTFモードをカメラに組み込んでいただきたい。そうすれば、全てのレンズでSTFっぽい絵が得られるのだ。手持ちハイレゾとか電子手ぶれ補正とかで構図のずれを吸収する実装は既に実証されているのだから、手持ちSTFモードだって実装できるはずだ。もっと言えば、露光時間が全速同調時間の4倍以上になるシャッター速度であれば、露光中に絞りを変えることで単写で2EV分の擬似STFが実装できるはずだ。レンズ一体型のカメラなら専用設計できるだろうから、ぜひ検討してみてほしいところだ。検討はした上で優先度の問題で見送りになっている気もするが、そこはファンの声を受けて再検討してほしい。それにはファンが声を上げないと。STFモードがダメでも、せめて絞りブラケットだけは実装してほしい。それがあれば単にPhotoshopとかで平均合成すればSTFモードと同じ結果が得られ、やたら複雑な露出の調整が不要になる。