豪鬼メモ

一瞬千撃

オリンパス機のRAWファイルの感度特性

オリンパスのRAWファイルの基準感度はISO200だが、実はISO100以下のデータと同じなんじゃないかという説があり、それをdcrawで検証してみた。まず、基準感度であるISO200で撮った写真のカメラJPEG出力をご覧いただきたい。


次に、ISO LOWで撮った写真のカメラJPEG出力をご覧いただきたい。手動でISO LOWに設定すると、ISO64になる。ISO LOWは拡張感度の扱いであり、白飛びしやすいので常用はしないようにとされている。確かに、飛行機の胴体側面のハイライトを見るにつけ、若干白飛びしやすいと思える節もある。

ISO200の作例とISO64の作例の両者は、先日買ったE-M5 Mark IIIを使い、AモードのF2.8固定で、ほぼ同じ時刻(1秒差)に撮っている。ISO64の作例のSSは1/400で、ISO200のSSは1/1250だ。よって、APEXの輝度値(Bv = Brightness Value = 適正露出になるのに必要な明るさ)の計算はそれぞれ以下のようになる。

  • ISO64の作例
    • Av = log2(2.8) = 1.485
    • Tv = log2(400) = 8.643
    • Sv = log2(64/3.125) = 4.356
    • Bv = 1.485 + 8.643 - 4.356 = 5.772
  • ISO200の作例
    • Av = log2(2.8) = 1.485
    • Tv = log2(1250) = 10.287
    • Sv = log2(200/3.125) = 6.0
    • Bv = 1.485 + 10.287 - 6.0 = 5.772

ということで、両者の輝度値は全く同じだ。それなのに、出力画像を見ると、ISO64の作例の方がハイライトの粘りがないような印象がある。当然それは露出値(Ev = Exposure Value = センサーに入ってくる光量 = Av + Tv)と感度(Sv = Sensitivity Value)の組み合わせが異なるからだ。ISO64は拡張感度であり、基準感度よりダイナミックレンジが狭くなるのは自然なことだ。

センサーのダイナミックレンジは基準感度で最大になり、それより減感設定にしても増感設定にしてもダイナミックレンジが狭まるというのは当然のことだ。あらゆるセンサーにもエンジンにもスイートスポットがある。しかし、本稿の趣旨はそこではない。そもそも基準感度のISO200においてハイライト側のダイナミックレンジを広げる措置がなされていて、それ未満の感度に設定するとその措置が解除されることで、特にハイライトのダイナミックレンジが狭まるのではないかということだ。その根拠として、同じシーンで同じ露出値で撮影したISO64、ISO200、ISO400、ISO800のそれぞれの作例を、dcrawで現像した例を載せる。

ISO64
ISO200
ISO400
ISO800

上記を見ると、ISO64の例だけ、RAWデータが明るいことが確認できる。ここで、既に挙げた2つの作例も含めて、カメラJPEGの出力も並べてみる。絵作りの設定は全てデフォルトにしてある。

ISO64
ISO200
ISO400
ISO800

カメラJPEGの出力を見ると、感度を変えてもほぼ同じ露出で撮れているように見える。しかし、RAWデータを見ると、ISO64の例だけ明るく、他は暗くなっている。dcrawはメーカーが指定したトーンカーブを全く無視してRGB値を線形に記録するので、本来のRAWデータの特性を知るのに都合がいい。この結果から推察されるのは、オリンパス機のRAWファイルは、基準感度であるISO200以上の感度設定では、実は暗く撮って記録したRAWデータを現像時に持ち上げているということだ。一方で、ISO64のデータは、その処理をしていないか、その度合いがより低い。dcrawの使い方については以前の記事で詳述しているのでご覧いただきたい。
mikio.hatenablog.com

白飛びを避けるためにRAWで暗く撮って現像時に持ち上げるという手法は常套手段だが、オリンパス機ではカメラ内で暗黙的にそれをやっているということだ。暗く撮っているのだから白飛びしにくいのはメリットだが、持ち上げた際にシャドー部にノイズが乗りやすいということデメリットがある。しかし、多少のノイズであれば現像時にソフトウェア的に対処できるので、とりあえずちょっと暗めに撮っておくというのは実用的な利点がある。私は手動でそれをやっていたが、カメラが暗黙的に同じことをやっているというのは興味深い。そして、ISO LOWにすると白飛びしやすい原因は、この暗めに撮る作戦をカメラ内でやっていないからということになる。

確認のために、Mモードでも比較をしてみた。Mモードで、絞りはF4.0、SSは1/100にして、ISOを64と100にして撮ったデータを、dcrawで現像した。

ISO64
ISO200

もし、ISO200で撮った際に内部的にはISO64と同じ感度で撮ったものを現像時に持ち上げているのならば、上記の二つの画像は同じ明るさになっているはずだ。しかし、今度は若干ながらISO64の方が暗い。つまり、ISO200で暗めに撮っているのは間違いなさそうだが、ISO64の時とISO200の時のセンサーの設定が全く同じというわけではないらしい。ISO200の例の線形RGBとしての平均輝度は6073/65536で、ISO64の例の線形RGBとしての平均輝度は4411/65536なので、比率は0.7263だ。ISO200の例をを基準に単純計算すると、ISO64の例はISO145くらいで撮ったデータのように見える。実際のRAWファイルのスケールが線形であるかどうかは不明なのでこの単純計算は当てにならないけれども。憶測にすぎないが、E-M5M2まではISO100が下限だったので、ISO100あたりが真の基準感度なんじゃないかと思えてくる。残念ながら手動ではISO100に設定できないので確認はできないが。

以上のことから学べるのは、次の点である。まず、ISO LOWにすると白飛びしやすい一因は、ISO200以上で暗黙的に行われている「暗く撮って現像時に持ち上げる作戦」の度合いが弱いことだ。言い換えると、ISO LOWはISO64として記録されるが、実はセンサーの感度はISO200に比べて64/200ほど低くはなっていなくて、自動露出の基準露出値(Ev=Av+Tv)を上げて明るく撮ることで低感度っぽい振る舞いをしつつ、低めのトーンカーブを適用してそれを相殺しているということだ。逆に言うと、ISO200以上では自動露出の基準露出値が相対的に低くなっているとも言える。つまり、オリンパス機のRAWは、ISO200以上ではシャドー部のノイズ増加と引き換えにハイライトの粘りを重視する設定になっている。撮って出しのJPEGだと気づきにくいが、RAW撮りしておけば、現像時にハイライトを下げることでかなりの粘りを期待できる。一方で、白飛びが心配ないようなシーンでも暗黙的に暗く撮る作戦が行われてノイズが増えてしまっていることになる。よって、最高画質を目指すなら、ISO200で白飛びしないギリギリまで明るめに撮って現像時に露出を下げるか、撮影時に感度をISO LOWに手動で設定した上で適正露出で撮るのが望ましい。真の基準感度がISO100だとすると、ISO64は減感設定なのでダイナミックレンジはやや下がるかもしれない。もしそうなら、ISO200で明るく撮る方が無難かもしれない。というかISO100に手動設定できないのはなぜなんだ。

そもそもISO感度の規格はフィルムのために作られたものだ。デジタルカメラのセンサーにおけるISO感度の表記においては、例えばISO100は、「フィルムでのISO100相当」とかいった意味合いしかない。言い換えると、「ISO100のフィルムを使っている時と同じ要領で絞りやSSを指定すると使いやすいんじゃないですかね」くらいの意味に過ぎず、センサーのアンプ処理やRAWデータを作る際の変換処理で何が行われるかが規定されているわけではない。よって、絞りとSSを一定にした条件下で、ISO100で撮ったRAWファイルとISO200で撮ったRAWファイルが実はほぼ同じデータだったとしても何ら問題はない。両者とも実用性があるなら、そこに嘘や誤魔化しがあるわけでもない。オリンパス機がISO200以降でハイライトの粘りを重視した味付けにしているのは、小さめのセンサーでの利便性を最大化する工夫と言えるだろう。「暗めに撮って持ち上げる」とかいうのを手動でやるのは直感的とは言い難いので、それを暗黙的にやってくれるのは有り難いことだ。

ここで改めて、E-M5M3でISOボタンが一等地にある理由を思い返してみる。フルサイズ機に比べてセンサーサイズが小さく、ダイナミックレンジにも高感度耐性にも劣る代わりに可搬性を高めているのがM43規格のレゾンデートルだ。その限られたダイナミックレンジを最大限に活用するには、感度の設定を撮影シーンに合わせて手動でやった方がいい。別にオートのままでも全く問題なく使えるのだけれど、裏のカラクリが分かっている中級者以上にとっては、感度を手動で設定するというのは撮影の楽しみの一つになり得る。ならば、中級機以上でISOボタンがそこにあるのは合点がいく。

ちなみに、ISO LOWで撮ってJPEGでは白飛びしているように見えるデータでも、現像時にハイライトを下げれば意外に粘っていることが多い。dcrawで現像してからトーンカーブを修正した例とLightroomで露出補正をして現像した例を以下に挙げる。両者とも完璧に使える画像であることが確認できる。理論的にはISO200の例よりISO64の例の方が画質が上であるはずだ。カメラ内現像でハイライトを下げても同じことができる。何が言いたいかというと、ISO LOWだとISO200に比べて白飛びしやすいのは事実だが、それでも酷い逆光でもない限りはそう簡単には飛ばないということだ。

ISO64 dcraw現像
ISO64 Lightroom現像

RAW撮りしてPCで現像していたとしても、ISO LOWとISO200のRAWデータの特性の違いには気づきにくい。なぜなら、オリンパス純正のOlympus Workspace(現OM Workspace)はもちろん、Lightroomなどの汎用現像ソフトでも、プロプライエタリのほとんど製品ではメーカー指定のトーンカーブを無視することができないようになっているからだ。オープンソースであるdcrawやそれを使ったRawTherapeeだとこれを回避できる。なお、おさらいになるが、dcrawによる現像は以下のコマンドでできる。

$ dcraw -T -6 -w -g 1 1 -H 5 -n 100 hogehoge.ORF

そうするとhogehoge.tiffというファイルができるのだが、これは線形RGBかつ色深度16ビットのTIFFである。これをGIMPなりPhotoShopなりに取り込んでトーンカーブを調整すれば、現像工程が一応は完了する。自動化するために線形TIFFImageMagickでJPGに変換するには、以下のようにする。

$ convert hogehoge.tiff -set colorspace RGB -colorspace RGB -colorspace sRGB hogehoge.jpg

明るくするスケール対数補正コントラストを高めるシグモイド補正とWeb用のリサイズ処理も入れるなら、以下のようになる。

$ convert hogehoge.tiff -set colorspace RGB -colorspace rgb -evaluate log 16.0 -sigmoidal-contrast "10.0x45%" -resize 1600x1600 -colorspace srgb hogehoge.jpg

上のコマンドの出力がこの画像である。WISIWIGでトーンカーブを調整しなくても、まあまあ見られる画像にはなる。明るさは主にスケール対数補正(-evalute log)の値で調整するのが良い。ガンマ補正(-gamma)はシャドーが持ち上がりすぎるので、そうしたい時以外は使わないのが無難だ。

まとめ。オリンパス機の基準感度はISO200だが、内部的にはそれより低い感度と同じ設定でセンサーを動かしていて、現像時に露出補正的な処理をして輝度を持ち上げているっぽい。そのおかげでハイライトがよく粘るようになっている。ISO LOWが白飛びしやすい一因はその工夫が無効化されるからだ。一方で、基準感度では持ち上げる処理でノイズが増えているので、白飛びの心配がないときは明るめに撮って現像時に下げ補正するか、ISO LOWを使うと若干ながら画質が向上するはずだ。