写真の物理学 ⑥ パースペクティブは撮影距離だけで決まる

Share
📐
写真の物理学シリーズ ⑥
このシリーズでは、写真にまつわる現象を物理学の言葉で記述する。「なんとなくそうなる」を「なぜそうなるか」に変換することが目的である。

「望遠レンズには圧縮効果がある」、「広角レンズは歪む」。写真を撮る人なら一度は耳にした言い回しだが、どちらも物理的には不正確だ。パースペクティブを決めるのはレンズの焦点距離ではなく、カメラと被写体の距離だけである。本記事では、透視投影の幾何学からこの事実を厳密に導く。

透視投影の幾何学的定式化

カメラの結像を最も単純に記述するモデルがピンホールカメラモデルだ。レンズの収差や厚みを無視し、光がひとつの点(光学中心)を通過してセンサー面に像を結ぶと仮定する。

光学中心を原点とし、光軸方向を $z$ 軸にとる。光軸からの距離 $Y$ にある物体が、光軸方向に距離 $Z$ だけ離れた位置にあるとき、焦点距離 $f$ のレンズによってセンサー面上に結ばれる像の位置 $h$ は

$$ h = f \, \frac{Y}{Z} $$

で与えられる。この式は、写真の物理学 ① 光の直進と薄肉レンズの結像で導いた結像公式を、無限遠合焦の条件のもとで近似したものに相当する。白い壁に近づいても露出が変わらない物理学的理由で立体角と視野の幾何学を扱い、逆二乗則とガイドナンバーの物理学で距離と光量の関係を導出したが、ここでは像の大きさと位置関係に焦点を当てる。

水平方向についても同様に

$$ g = f \, \frac{X}{Z} $$

が成り立つ。つまり、3次元空間の点 $(X, Y, Z)$ はセンサー面上の点 $(g, h) = (fX/Z, \, fY/Z)$ に写像される。これが透視投影(perspective projection)の基本式だ。

像の大きさの比は焦点距離に依存しない

ここからが本題だ。パースペクティブとは、画像中の被写体同士の相対的な大きさや位置関係のことだ。これが焦点距離に依存しないことを証明する。

光軸方向の距離 $Z_A$ に物理的な大きさ $S_A$ の被写体Aがあり、距離 $Z_B$ に大きさ $S_B$ の被写体Bがあるとする。それぞれの像の大きさは

$$ s_A = f \, \frac{S_A}{Z_A}, \quad s_B = f \, \frac{S_B}{Z_B} $$

だ。この二つの像の大きさの比をとると

$$ \frac{s_A}{s_B} = \frac{f \, S_A / Z_A}{f \, S_B / Z_B} = \frac{S_A \, Z_B}{S_B \, Z_A} $$

焦点距離 $f$ が消えた。 像の大きさの比を決定するのは、被写体の物理的大きさ $S_A, S_B$ と撮影距離 $Z_A, Z_B$ だけであり、焦点距離はまったく関与しない。

焦点距離を変えると何が変わるのか。 $s_A$ も $s_B$ も $f$ に比例して拡大または縮小する。しかし、その比は変わらない。焦点距離と画角を幾何学で導くで示した通り、焦点距離が変えるのは画角、すなわちセンサーに写る範囲の広さであって、被写体同士の遠近関係ではない。

トリミングとの等価性

この証明から直ちに導かれる帰結がある。同じ位置から焦点距離の異なるレンズで撮影した写真は、トリミングの違いにすぎない。

たとえば、同じ場所から35mmレンズで撮った写真の中央部分を切り出して拡大すれば、85mmレンズで撮った写真とパースペクティブは完全に一致する。解像度の差はあるが、遠近感は同じだ。初めてのレンズに迷ったらで述べたように、焦点距離は画角を決める。そして画角とは「センサーが切り取る範囲の広さ」にすぎない。同じ距離から撮れば、広く切り取るか狭く切り取るかの違いだけであり、切り取られた範囲内の遠近関係はまったく同一だ。センサーサイズと換算焦点距離の正体で論じたクロップファクターも、この「切り取り範囲の違い」に帰着する。

これは実験で簡単に確かめられる。三脚にカメラを固定し、同じ被写体を35mm、50mm、85mmと焦点距離を変えて撮影する。35mmの写真を50mm相当にトリミングし、さらに85mm相当にトリミングすれば、それぞれ50mmと85mmで撮った写真と遠近感が一致することを目で確認できる。

「圧縮効果」の正体

望遠レンズで撮った写真では、遠くの被写体が近くの被写体に迫っているように見える。いわゆる圧縮効果だ。この現象はレンズの光学的性質ではなく、撮影距離の帰結にすぎない。

同じ大きさ $S$ の二つの被写体が、カメラから距離 $d$ と $d + \Delta$ にあるとする。 $\Delta$ は二つの被写体間の奥行き方向の間隔だ。像の大きさの比は

$$ \frac{s_{\text{奥}}}{s_{\text{手前}}} = \frac{d}{d + \Delta} $$

この比が1に近いほど、二つの被写体は同じ大きさに写り、「圧縮されている」ように見える。

具体的な数値を入れてみよう。二人の人物が2メートル間隔で立っているとする( $\Delta = 2$ m)。

  • 撮影距離5メートルのとき: $5 / (5 + 2) = 5/7 \approx 0.71$ 。奥の人物は手前の71%の大きさに写る。遠近感は明確だ。
  • 撮影距離50メートルのとき: $50 / (50 + 2) = 50/52 \approx 0.96$ 。奥の人物は手前の96%の大きさに写る。ほぼ同じ大きさであり、奥行きの差がほとんど感じられない。

後者が「圧縮効果」だ。望遠レンズが圧縮しているのではない。被写体を同じ大きさにフレーミングしようとすると、焦点距離が長いぶんカメラは被写体から離れることになる。離れた結果、被写体間の奥行き比が縮小する。圧縮の原因は距離であり、レンズは結果にすぎない。同じ被写体サイズでのボケ比較で示すように、被写体を同じ大きさに保ったまま焦点距離を変えると撮影距離も変わるため、パースペクティブの圧縮とボケの円を関数で記述するで定量化されるボケの増大が連動して起きる。物撮りは遠くからで述べたように、物撮りで望遠レンズが使われるのも同じ理由だ。レンズが背景を整理するのではなく、撮影距離が背景を整理する。

「広角の歪み」の正体

広角レンズで近くから撮ると被写体が歪んで見える。この現象も距離の帰結だ。

広角レンズは画角が広い。同じフレーミングを得るには、望遠レンズより被写体に近づく必要がある。近づくと何が起きるか。被写体の手前と奥の距離比が拡大する。

たとえば、立方体の箱を撮影する場合を考える。箱の手前の面がカメラから30cmの位置にあり、箱の奥行きが10cmだとすると、奥の面はカメラから40cmの距離にある。

$$ \frac{s_{\text{奥}}}{s_{\text{手前}}} = \frac{30}{40} = 0.75 $$

奥の面は手前の面の75%の大きさに写る。手前が膨らみ、奥がすぼまる。箱は台形に見える。この効果は距離が近づくほど急激に強まり、マクロ領域の光学で扱う接写では被写体の数ミリの奥行き差ですら顕著な遠近感の歪みを生む。

同じ箱を3メートル離れた位置から撮れば

$$ \frac{s_{\text{奥}}}{s_{\text{手前}}} = \frac{300}{310} \approx 0.97 $$

奥の面と手前の面はほぼ同じ大きさに写り、箱は正方形に近く見える。

広角レンズが歪みを生んでいるのではない。広角レンズを使うと近づきがちだから歪んで見えるのだ。同じ距離から広角レンズで撮ってトリミングすれば、望遠レンズと同じ遠近感になることは、すでに証明した通りだ。

なお、広角レンズには光学的な歪曲収差(樽型歪曲)も存在し、直線が外側に膨らんで曲線に写ることがある。収差の物理学で論じるように、これはスネルの法則の非線形性に起因する光学的な歪みであり、ここで述べた撮影距離に起因するパースペクティブの誇張とは別の現象だ。歪曲収差はRAW現像の信号処理のレンズ補正工程で除去できるが、パースペクティブは撮影距離を変えない限り変わらない。

鼻が大きく写るポートレート

スマートフォンで自撮りをすると、鼻が不自然に大きく写る。これは広角レンズの光学的な歪みではなく、撮影距離の問題だ。センサーサイズとボケの統一的理解で述べるように、スマートフォンの小型センサーは画角を確保するために短い焦点距離を用いるから、自撮りでは腕の長さが撮影距離の上限となる。

顔を正面から撮るとき、鼻先はカメラに最も近く、耳はカメラから最も遠い。鼻先と耳の奥行き差はおよそ15cmだ。

  • 腕を伸ばした自撮り(距離約50cm): 鼻先が50cm、耳が65cm。像の大きさの比は $50/65 \approx 0.77$ 。耳は鼻の77%の大きさにしか写らない。鼻が突き出し、顔全体が膨らんで見える。
  • 1メートル離れた撮影: 鼻先が100cm、耳が115cm。像の大きさの比は $100/115 \approx 0.87$ 。差は縮まるが、まだ感じられる。
  • 3メートル離れた撮影: 鼻先が300cm、耳が315cm。像の大きさの比は $300/315 \approx 0.95$ 。顔の各部分がほぼ均一な大きさに写り、自然な印象になる。

ポートレートに85mmや105mmの中望遠レンズが定番とされるのは、像倍率の関数的記述で示した通り同じフレーミングには焦点距離に比例した撮影距離が必要であり、これらの焦点距離なら自然と2メートル以上の距離が確保されるからだ。レンズは一本でいいで「足がズームになる」と述べたが、ポートレートにおいて足を使って離れることは、画角の調整ではなくパースペクティブの制御そのものだ。レンズが顔を美しく写すのではない。距離が顔を正確に写す。そしてこの距離の選択は、被写界深度の厳密な導出で示すように被写界深度をも二乗で支配するから、ポートレートにおける撮影距離は遠近感とボケの双方を同時に決定する変数だ。

建築写真におけるあおりとシフトレンズ

建築写真で建物を見上げて撮影すると、垂直線が上方で収束し、建物が後ろに倒れているように見える。これもパースペクティブの幾何学で説明できる。

カメラを上に傾ける(あおる)と、センサー面が建物の正面と平行ではなくなる。建物の上部は下部よりカメラから遠くなるため、上部の像は下部より小さくなる。結果として、本来平行であるはずの垂直線がセンサー上では上方に向かって収束する。

透視投影には次の性質がある。センサー面に平行な直線は、像の上でも平行に写る。 センサー面に平行でない直線は、消失点に向かって収束する。カメラが水平のとき、建物の垂直線はセンサー面に平行だから、像の上でも平行に写る。カメラを上に傾けると、垂直線はセンサー面に対して傾くため、像の上で収束する。

シフトレンズ(ティルトシフトレンズのシフト機構)は、この問題を光学的に解決する。シフトレンズは通常のレンズよりも大きなイメージサークル(レンズが結像できる円形の領域)を持つ。カメラを水平に保ったまま、レンズをセンサーに対して上方にずらす(シフトする)ことで、建物の上部をフレームに収める。

カメラ自体は水平のままだから、建物の垂直線はセンサー面に対して平行であり続ける。平行な線は平行に写る。収束は起きない。シフトレンズが補正しているのは光学的な歪みではなく、カメラを傾けることで生じるパースペクティブの変化を回避しているのだ。

なお、シフトと同じ補正は、広角レンズで水平に撮影して上部をトリミングすることでも近似的に達成できる。原理は同じだ。センサー面を建物に対して平行に保つこと。ただし、トリミングは解像度を犠牲にし、シフトレンズはイメージサークルの余裕を活かしてセンサーの全画素を使える点が異なる。

まとめ

透視投影の幾何学から、次のことを示した。

二つの被写体の像の大きさの比は $S_A Z_B / (S_B Z_A)$ であり、焦点距離 $f$ に依存しない。パースペクティブは撮影距離だけで決まる。焦点距離が変えるのは画角であり、遠近感ではない。

「圧縮効果」は遠距離撮影の帰結だ。遠くから撮ると被写体間の奥行き比が縮小し、前後の被写体が接近して見える。「広角の歪み」は近距離撮影の帰結だ。近くから撮ると被写体各部の距離比が拡大し、手前が膨らんで見える。どちらもレンズの性質ではなく、距離の幾何学だ。

「望遠レンズは圧縮する」、「広角レンズは歪める」という言い回しは、因果を取り違えている。正確には「望遠レンズを使うと離れるから圧縮される」「広角レンズを使うと近づくから歪む」だ。レンズは距離を変える動機を与えているだけであり、パースペクティブを直接操作してはいない。

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