写真のしくみ ㉛ 白飛びを救うHDRとトーンマッピング

Share
💡
シリーズ「写真のしくみ」について
光はまっすぐ進み、レンズは世界をひっくり返す。写真と映像にひそむ小さな「なぜ?」を、数式なしで解き明かす全40回。

窓の外は真っ白、部屋の中は真っ暗

教室で友だちの写真を撮ろうとしたこと、ありますか。

友だちの顔がきれいに写るように明るさを合わせると、窓の外が真っ白にぶっ飛ぶ。逆に、窓の外の景色をきれいに撮ろうとすると、友だちが真っ暗なシルエットになる。目で見ると、友だちの顔も窓の外もどっちもちゃんと見えているのに、カメラで撮るとどちらかが犠牲になる。なんでこうなるのでしょう。

答えは、カメラの「目」は、人間の目ほど明暗の差に対応できないから。

カメラが一度に記録できる「いちばん暗いところ」から「いちばん明るいところ」までの幅には限界があります。この幅のことを、写真の世界ではダイナミックレンジと呼びます。そして今回の主役、HDRは、このダイナミックレンジの限界を乗りこえるための知恵です。

ダイナミックレンジは「バケツの大きさ」

ダイナミックレンジをたとえるなら、バケツの大きさです。

小さなバケツでは、少し水を入れただけであふれてしまいます。大きなバケツなら、たくさんの水を受け止められます。カメラのダイナミックレンジが広いほど、明るいところから暗いところまで、多くの情報を一度にキャッチできるわけです。

写真の世界では、ダイナミックレンジの広さを段(ストップ、stop)という単位で測ります。1段とは、光の量がちょうど2倍になること。2段なら4倍、3段なら8倍。10段だと $2^{10}$ で1,024倍にもなります。つまり「いちばん明るいところは、いちばん暗いところの1,024倍の光を持っている」という意味です。

最近のデジタルカメラは、だいたい12段から15段くらいのダイナミックレンジを持っています。数字だけ見ると、けっこう広そうに聞こえますよね。

ところが、晴れた日の窓がある室内はどうでしょう。いちばん明るい窓の外の空と、いちばん暗い部屋の隅では、明るさの差が20段を超えることもあります。12段や15段のバケツでは、とても受け止めきれません。明るいほうに合わせればバケツから水があふれ(白飛び)、暗いほうに合わせれば底に水が届かない(黒つぶれ)。だから、あの「窓が真っ白、顔が真っ暗」の写真が生まれるのです。

では、人間の目はどうやっているのか。目は、瞳孔(ひとみ)の大きさを変えたり、網膜の感度を場所ごとに調整したりして、ものすごく広い明暗に対応しています。それだけではありません。目はあちこちを素早く見回して、脳がそれらの情報を「いい感じに」つなぎ合わせてくれます。実は、目も一度にすべてを見ているわけではないのです。

HDRの発想は、じつはこの「脳がやっていること」によく似ています。

HDRのアイデアは意外とシンプル

HDRは High Dynamic Range(ハイダイナミックレンジ) の略で、「広い明暗の幅」という意味です。そのアイデアは、驚くほどシンプル。

明るさの違う写真を何枚か撮って、いいとこ取りをする。

これだけです。具体的に見てみましょう。

  1. 暗めの写真を撮る。 シャッタースピードを速くして、光をあまり取り込みません。すると、明るい空がきれいに写ります。そのかわり、暗い部分はつぶれて真っ黒になります。
  2. ふつうの明るさで撮る。 中間の明るさの部分がきれいに写ります。
  3. 明るめの写真を撮る。 シャッタースピードを遅くして、たっぷり光を取り込みます。すると、暗い部屋の隅のディテールがきれいに浮かび上がります。そのかわり、明るい部分は真っ白にあふれてしまいます。

この3枚を重ね合わせて、「明るい部分は暗めの写真から」「暗い部分は明るめの写真から」と、それぞれのいいところだけを選んで1枚に合成します。これがHDRの基本です。

目が明るいところと暗いところを見回して、脳がひとつの風景としてまとめあげるのと、やっていることは同じです。カメラとコンピュータで、脳のはたらきをまねしているわけです。

この「明るさを段階的に変えて何枚も撮る」ことを、ブラケティング(bracketing)と呼びます。多くのカメラにはオートブラケット機能があり、シャッターを押すだけで明るさの違う写真を自動的に連続で撮ってくれます。

スマホはHDRの達人

「何枚も撮って合成するなんて、面倒じゃない?」と思った人、安心してください。みなさんのポケットに入っているスマートフォンは、すでに当たり前のようにHDRをやっています。

スマートフォンのカメラは、レンズもセンサーも小さいので、一枚の写真で記録できるダイナミックレンジはどうしても狭くなりがちです。ところが、スマホの中には強力なコンピュータが入っています。シャッターを切るたびに、何枚もの写真を超高速で撮影し、その場で合成して、あたかも一枚で撮ったかのような写真を瞬時に仕上げてくれるのです。

スマホの「HDR」モードや「オートHDR」とは、まさにこのこと。最近のスマートフォンでは、意識しなくても自動的にHDRが働いていることがほとんどです。逆光で人を撮っても顔が暗くならないのは、スマホが裏側で何枚もの写真をこっそり合成してくれているおかげです。

スマホは「センサーが小さい」という弱点を、「計算の速さ」でカバーしています。小さな体に大きな頭脳。ダイナミックレンジの狭さを、頭の良さで補っているわけです。これをコンピュテーショナルフォトグラフィー(computational photography)と呼ぶこともあります。「計算で写真をつくる技術」という意味です。

もちろん、一眼カメラやミラーレスカメラにも「カメラ内HDR」機能を持つ機種はあります。カメラの中で自動的にブラケティングと合成を行い、完成した1枚のJPEGファイルを出力してくれます。ただし、一眼カメラやミラーレスカメラの場合は、RAW形式で撮影しておいて、パソコンの現像ソフトで後からじっくり合成するほうが、仕上がりを細かくコントロールできます。

トーンマッピングという翻訳作業

HDRで合成された画像には、ものすごく広い明暗の情報が詰まっています。しかし、ここでもうひとつ困った問題が出てきます。

その広大な明暗を、そのまま画面に表示することができない。

私たちが写真を見るモニターやスマホの画面、あるいは印刷された紙は、HDR画像が持つ明暗の幅をそのまま再現できるほどの性能を持っていません。たとえば、一般的なモニターの表示能力は8ビット、つまり明るさの段階が0から255までの256段階しかありません。HDR画像が持つ広大な明暗の世界を、この256段階の「箱」に詰めなければならないのです。

たとえるなら、こうです。幅10メートルの巨大な風景画を、幅30センチの額縁に飾りたい。そのまま押し込んだら、くしゃくしゃになって何が描いてあるかわからなくなります。でも、上手に縮小コピーすれば、全体の雰囲気を残しながら額縁に収められる。

この「広すぎる明暗の情報を、画面が表示できる範囲にうまく変換する」処理のことを、トーンマッピング(tone mapping)と呼びます。「トーン」は明暗の調子、「マッピング」は対応づけ。明暗の調子を、画面の表示範囲に対応づける、という意味です。

トーンマッピングでは、全体を均等にギュッと縮めるのではなく、人間の目が自然に感じるようにバランスを調整します。明るすぎる部分はやや抑えて白飛びを防ぎ、暗すぎる部分は少し持ち上げてディテールが見えるようにする。こうやって「現実の広大な明暗」を「画面に収まる明暗」に翻訳するのです。

HDRが「写真を撮る」段階の技術だとしたら、トーンマッピングは「写真を見せる」段階の技術です。HDRとトーンマッピングは、セットで使われることが多いのです。

「やりすぎHDR」はなぜ不自然に見えるのか

HDRで撮った写真をインターネットで見ていると、ときどき「うわ、なんか不自然だな」と感じる写真に出会うことがあります。色がギラギラしていたり、建物のまわりに光の輪みたいなものが見えたり、現実離れした絵画のような雰囲気の写真です。

あれは、HDRという技術そのものが悪いのではなく、トーンマッピングのやりすぎが原因です。

トーンマッピングの効果を極端に強くかけると、何が起きるのか。ひとつずつ見てみましょう。

メリハリがなくなる。 本来は明るいはずの場所と暗いはずの場所の差が小さくなりすぎて、写真全体がのっぺりと平坦に見えてしまいます。私たちが「立体的だな」と感じるのは、光と影のコントラストがあるからです。影を無理やり明るくしてしまうと、奥行き感が失われます。

ハロ(光の縁取り)が現れる。 明るい部分と暗い部分の境目に、不自然な光の帯が出ることがあります。これは、ソフトウェアが明暗の調整をするとき、隣り合うピクセルの明るさの差が急激に変わる境界で処理がうまくいかず、本来ないはずの明るい縁取りが生まれてしまう現象です。建物の輪郭と空の境目などに、ぼんやりした光の帯が出ているのを見たことがある人もいるかもしれません。

色が派手になりすぎる。 コントラストや彩度が過剰に強調されて、空が不自然なほど濃い青になったり、草木の緑がギラギラ光って見えたりします。実際の景色を見たときには感じなかったはずの、ちょっとうるさい色合いです。

では、HDRを自然に仕上げるにはどうすればいいのか。答えはシンプルです。HDRで広い明暗を取り込んだうえで、トーンマッピングは控えめにかける。 現実の景色を見たときの印象に近い仕上がりを目指すなら、効果はほどほどが肝心です。

もちろん、あえて強いトーンマッピングをかけて、現実とは違う幻想的な雰囲気を演出する表現もあります。それは「失敗」ではなく、撮る人の意図と美意識による選択です。大切なのは、「これは自分が見せたい世界だ」と意識してやっているかどうか。意図しない不自然さと、意図した表現は、まったく別のものです。

この回のまとめ

この回では、カメラが明暗差の壁にぶつかる理由と、それを乗りこえるHDRのしくみを見てきました。

  • カメラが一度に記録できる明暗の幅をダイナミックレンジと呼び、段(ストップ)という単位で測ります。1段は光の量が2倍です。
  • 現実の風景の明暗差は、カメラのダイナミックレンジを超えることがあります。明るいほうに合わせれば暗いところがつぶれ、暗いほうに合わせれば明るいところが飛んでしまいます。
  • HDR(ハイダイナミックレンジ)は、明るさの違う複数の写真を合成して、明暗の両方を活かす技術です。人間の脳が明るい場所と暗い場所の情報をつなぎ合わせる働きに似ています。
  • スマートフォンは撮影のたびに自動でHDR処理を行っていることが多く、小さなセンサーの弱点を計算の力で補っています。コンピュテーショナルフォトグラフィーの代表例です。
  • HDR画像をモニターや紙で見せるために、広い明暗を表示可能な範囲に変換する処理をトーンマッピングと呼びます。
  • トーンマッピングをやりすぎると、色の飽和、ハロ、のっぺりした画面など不自然な仕上がりになります。自然に見せたいなら、効果は控えめにしましょう。

Read more

Dependabotの対応が面倒なのでRenovateを導入する

Dependabotくんはある程度の依存関係の更新を通知してくれるが、山のようにprojectを抱えているとなんとも痒いところに手が届かない。 ということで、Renovateを使ってみる。 Build software better, togetherGitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over 420 million projects.GitHub ここからGitHub Appを入れる。 あとは、指示に従ってポチポチするだけで、超かんたんだった。 感想 自動化最高。

By Sakashita Yasunobu

nodejsのバグを見つけたのでPRを投げてみた

概要 要するに、node --testで特定のバイナリを標準出力に書くと、テストランナーが固まったり、異常終了したりするバグです。 バグ自体は既知のものだったようで、修正がされていました。 test_runner: infinite loop in FileTest#drainRawBuffer when child stdout contains FF 0F followed by large size bytes · Issue #62693 · nodejs/nodeVersion v25.9.0 (also reproduced on v24.14.1 LTS, v22.21.0 LTS, v23.4.0) Platform Darwin 25.

By Sakashita Yasunobu
青空文庫のParser

青空文庫のParser

青空文庫のParserを作ってます。 GitHub - P4suta/aozora: Pure-functional Rust parser for 青空文庫記法 (Aozora Bunko notation): ルビ, 傍点, 縦中横, 外字, 返り点, indent containers, page breaks.Pure-functional Rust parser for 青空文庫記法 (Aozora Bunko notation): ルビ, 傍点, 縦中横, 外字, 返り点, indent containers, page breaks. - P4suta/aozoraGitHubP4suta Rustで作ってますが、配布物はcargoのほかにnpm/pypiでも入手できます Documentation * Playground — try it in

By Sakashita Yasunobu