「標準レンズ」の何が標準なのか、ここ数日考えてひとまず自分なりに結論を出したのでまとめてメモ

結論

一般的な鑑賞環境において、パースが自然、すなわち肉眼で見るパースとほぼ同じであること

前提

写真のパースは、一般的に説明するときには、焦点距離によって変化して、広角では遠近感が強調され、望遠では圧縮される、とされているが、厳密にはこれだけだと説明が不十分である。焦点距離の違いは、単に画像をどの大きさで (すなわち画角で) トリミングするかの違いでしかない。これは、無限の解像度を持つカメラと、無限の解像度を持ち収差のない超広角レンズさえあれば、後処理でトリミングすればいいだけなので、それ以上長い焦点距離のレンズなどいらないということを意味する。本質的に、レンズはパースを変化させない。

ではどこでパースの変化が起きるかというと、それは鑑賞環境、つまり出力サイズ (プリントサイズ) と、鑑賞者までの距離になってくる。もし広角レンズ、例えば17mmで撮影したとしても、2m 幅でそれをプリントしたものを、1m の距離から見れば、肉眼で見た場合のパースと同じになる。あくまで、あの強調されたパースは狭い出力サイズに無理矢理画像をつめこむから生まれている。カメラのファインダーの像の大きさというのも固定なので、レンズを変えるとパースが変化したように見える。

疑問

レンズ自体にパースの変化がないのに「標準レンズはパースが自然」というのはおかしい。どんな画角であろうと、出力サイズと鑑賞位置が「正しい」ければ、パースは自然になるはずである。

であるなら、出力サイズと鑑賞位置が暗黙のうちに決定されているのではないか

検証

とりあえずイメージできるように焦点距離から画角を求められるようにする。 Wikipediaによると、焦点距離からの画角は以下で求められる (JavaScript の式になおしてある)

// `size` (mm) サイズの素子で、焦点距離が `f` (mm) のときの画角 (radian)
function angleOfView (size, f) {
	return 2 * Math.atan(size / (2 * f));
}

例えば、35mm フルサイズで 50mm の焦点距離を持つレンズを使った場合、水平画角は angleOfView(36, 50) で求められる (JS の三角関数との兼ね合いで表示時以外はラジアンで表現) この場合だと、39.6度ぐらいになる。

// 一応ラジアン変換
function radiansToDegree (radian) {
	return radian * (180 / Math.PI);
}

function degreeToRadians (degree) {
	return degree * (Math.PI / 180);
}

この状態で撮影した写真を、同じ画角だけ占有するように出力サイズと鑑賞位置を調整するようにすれば、パースは崩れないことになる。

なので、以下のような関数を考える (鑑賞者が点・占有物を面にしたとき、面側に直角がくる直角三角形が2つ並ぶイメージ)。

// `distance` (mm) 離れた距離にある `size` (mm) のものが視野を占有する画角 (radian)
function angleByDistanceAndSize (distance, size) {
	var half = size / 2;
	return Math.atan(half / distance) * 2;
}

これを使うと、「30cm の距離で A4用紙を見る場合に占有される水平画角」は angleByDistanceAndSize(300, 297) で求められる (52度ぐらい)

52度の画角を持つレンズの焦点距離を求めると、「30cm の距離の A4用紙にプリントした場合にパースがぴったりになる焦点距離」が求められるはずなので、以下のような関数を定義した (angleOfView の逆関数)

// `size` (mm) サイズの素子で、画角が `angle` (radian) のときの焦点距離 (mm)
function angleToFocalLength (size, angle) {
	var a = Math.tan(angle / 2);
	return size / a / 2;
}

angleToFocalLength(36, angleByDistanceAndSize(300, 297)) とすれば、「30cm の距離の A4用紙にプリントした場合にパースがぴったりになる焦点距離」として 36mm が求められる。すなわちこの鑑賞環境の場合、36mm で撮影した写真だと、パースが最も自然になる。

同じように、一般的な鑑賞環境を想像して、最も自然なパースになる焦点距離がいくつかを求めてみる。

// 20cm で L版 (スナップ写真を自宅で見る)
angleToFocalLength(36, angleByDistanceAndSize(200, 127)) //=> 56mm

// 30cm で A4 (ちょっと大きめに出力したものを手元で見る)
angleToFocalLength(36, angleByDistanceAndSize(300, 297)) //=> 36mm

// 50cm で A3 (ちょっと大きめに出力したものを手元で見る)
angleToFocalLength(36, angleByDistanceAndSize(500, 420)) //=> 42mm

// 100cm で A3 (写真展みたいなところでちょっと離れて見る)
angleToFocalLength(36, angleByDistanceAndSize(1000, 420)) //=> 85mm

// 倍率0.71倍のファインダー
50 / 0.71 //=> 70mm
( angleToFocalLength(36, angleByDistanceAndSize(x, sizeByDistanceAndAngle(x, angleOfView(36, 50)) * 0.71)) )

と、だいたい標準と呼ばれるような焦点距離におさまってる。つまり、このような鑑賞環境においては「標準レンズ」と呼ばれるものを使っておくと、パースが自然に見える。

ちなみに魚眼レンズは、画像の作りかたが人間の眼とは違うので上記のルールには全くあてはまらない。angleOfView の式もあてはまらない (もっと広く写るように設計されてる)

  1. トップ
  2. tech
  3. 「標準レンズ」について

土曜日、南武線鹿島田駅から、

を辿り、日吉駅まで散歩をした。

鹿島田大神社は地図で見たとき近くに幼稚園があるから、よくある併設された感じなのかなと思って行ってみたら、幼稚園の園庭のど真ん中に神社がある (境内と園庭を共有している) 感じだったのでびっくりした。

天照皇大神はちょっとした山の上にあった。動物公園が整備されていて、鳥とかがケージで飼われていた。

5.5km ぐらい歩いたようだ。思いのほか炎天下で辛かった。

いろいろあって9月3日に大腸内視鏡検査をうけた。数日前から消化よさげなものを食べるようにと言われておかゆとか餅とかを食べてた。

  • 前日の昼食・夕食は決められた検査食
  • 夜は20時から下剤を時間差で3種類
  • 23時ぐらいから下痢気味に
  • とりあえず寝る
  • 4時ごろに腹がごろごろ言うので起床してトイレ
  • 5時ごろから1.8Lの下剤(マグコロールとかいうの)を1時間半ぐらいで飲む
    • 前日飲んだ下剤の1つもこれだったけど、濃度が違うようでこちらのは飲みやすかった
  • 8時ぐらいまでトイレ
  • 9時半ぐらいから検査

検査時、特に理由がないなら鎮静剤を使ったほうがいい (次やるときに「あんな検査二度とやりたくない」と思わないためには鎮静剤つかったほうがいい) と言われたので使ってもらった。

じゃあ入れますよ的なことは特に言われず、いつはじまるんだろうと思ってたら急にちょっと慌ただしくなって、ん?と思ったらすぐ入れはじめてて、マジかと思った。

しかしそれにしても結構な辛さだった。空気を入れられるのが思いのほかつらく、尻に力が入りすぎ空気が抜けなくて痛いみたいなことが何度かあった…… 検査時あんまり鎮静剤が効いてる感じがしなかったけど、立つとふらつく感じだったので効いてたんだろうと思う。効いててあの辛さだとすると、本来かなり辛い気がする。

生検が2箇所あっただけで、ほかはなかったので当日支払ったのは3割負担で1万円ぐらい。大きなものは特になかった。一応後日結果を訊くということらしい。

検査後も腸の空気がなかなか抜けなくて若干しんどかった。

総じて、事前準備は下剤も含めて特につらくなかったけど、検査そのものは結構つらかった。