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

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

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

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

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

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

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

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

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

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

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

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

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

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

結論

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

前提

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

ではどこでパースの変化が起きるかというと、それは鑑賞環境、つまり出力サイズ (プリントサイズ) と、鑑賞者までの距離になってくる。もし広角レンズ、例えば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. 「標準レンズ」について

SIGMA 単焦点広角レンズ 20mm F1.8 EX DG ASPHERICAL RF キヤノン用 フルサイズ対応 - シグマ(Sigma)

シグマ(Sigma)

3.0 / 5.0

超広角側で良さそうなレンズが欲しかったので購入した。昔に買った TAMRON の 17-35mm のレンズは画質的に厳しくて全く使わなくなってしまったので、中古として売った (使わないレンズを持っていても防湿庫の容量的に邪魔なだけになってしまう)

キヤノン純正の EF 20mm F2.8 も検討したけど、SIGMA の 20mm のほうが明るくかつ画質が良さそうなのでこちらにした。ただ、操作性は純正のほうがいいと思う (フルタイムマニュアルフォーカスができない・マニュアルフォーカスがそもそもしにくい)。

24mm や 28mm でないのは、次に買うレンズを EF24-70mm F2.8L II USM にしたいと思っていて、画角が被らないようにしたかったからで、本当はできれば 14mm ぐらいの画角が欲しかったけど、コストパフォーマンスが悪すぎるのでやめた。純正の広角ズームも検討したけど、周辺画質にあまり期待できなそうで、構図に制限がでそうなのでやめた。

まだ全然とれていないけど、画質は悪くなさそうな印象。あと Lightroom の現像時レンズ補正をはじめて使ってみたけど、勝手にレンズを認識して自動でプリセットの補正をかけてくれて便利すぎることがわかった。

同じような写真しか撮っていない

土曜日は等々力渓谷に行った。そんなに広くないなあというのと、結構人が多いなあという印象だった。とにかく途中で腹が痛くなって死ぬかと思ってよく覚えてない。

日曜日は神代植物公園に行った。あまり花は咲いておらず、かなり早い時間に行ったので人も少なかった。温室内の休憩所が快適だった。

月曜日は生田緑地のかわさき宙と緑の科学館でプラネタリウムを見に行った。午前11時ぐらいについたのだけれど、既に15時の回しか空いておらず、かなり待ち時間が発生したので、日本民家園を見てまわった。

日本民家園は非常に久しぶりに入ったけれど、結構いろんな建築があって面白かった。

プラネタリウムは、入るときに双眼鏡を渡されて、なんだろうと思ったけど、写される星々が非常に細かくて、天の川を双眼鏡で見るとちゃんと星が見えるとか、隣のアンドロメダ銀河が見えるとかで、びっくりした。400円で見れるので非常にコストパフォーマンスが良く感じる。

「標準レンズ」について では、理想的なカメラと理想的なレンズを仮定して考えていたので、以下の点がひっかかっていた:

  • 超広角で撮影したとして、パースが正しくなるように大きく引き伸ばして十分な画質が得られるか
    • (十分な画質が得られなければ、リアリティが消失して「パースが正しい」ことが意味をなさないのではないか)

なので、現在のカメラで撮影された画像をプリントするとき、十分な画質を得られる最大出力サイズを考えてみることにした。

十分な画質

まずそもそも「十分な画質」とはなにかを考えないとどうしようもない。「十分な画質」について「隣あう画素同士の区別がつかない」として考えることにした。

一般的に印刷物では300dpi程度が必要と言われていたりするけど、根拠がよくわかっていなかった。Facebook でぶつぶつ呟いていたら、視力の定義から考えてみたらどうかとの話だったので、そこから考えることにした。

「視力は分単位で表した視角の逆数で表す。例えば、5mの距離から約1.45mmの切れ目を判別できると視力1.0となる」(Wikipedia) らしいので、とりあえず視力1.0のときに、ある距離において見分けられる最小の角度を求めた。

// 視力が `visualAcuity` のとき、見分けられる最小の角度 (radian)
// 視力の定義: 分単位で表した視角の逆数
// 視力 1.0 は 1.45444... 幅を5mの位置から見て識別できること
// console.log( 1 / (radiansToDegree(angleByDistanceAndSize(5000, 1.454444)) * 60), angleByDistanceAndSize(5000, 1.454444) );
// console.log( 1 / (radiansToDegree(angleByDistanceAndSize(10000, 1.454444)) * 60), angleByDistanceAndSize(10000, 1.454444) );
function angularSubtenseByVisualAcuity (visualAcuity) {
	if (!visualAcuity) visualAcuity = 1;
	return angleByDistanceAndSize(5000, 1.454444) / visualAcuity;
}

これで特定の距離のときにどれぐらい目で見分けられるかがわかるので、これを元に特定の距離のときにどれぐらい dpi が必要かを求められる。

// `visualAcuity` の視力を持つ人について、`distance` (mm) 離れた距離にある印刷物に求められる最低の dpi
function dpiByDistanceAndVisualAcuity (distance, visualAcuity) {
	return 25.4 / sizeByDistanceAndAngle(distance, angularSubtenseByVisualAcuity(visualAcuity));
}

最大出力サイズ

必要な dpi が求まれば、あとはカメラが撮影可能な画素数にかかってくる。

var pixels = {
	width: 5616,
	height: 3744
};

// 視力 1.0 の人が 50cm の距離で見たとき、ドットの見分けがつかない限りで最大の印刷サイズ
console.log(pixels.width / dpiByDistanceAndVisualAcuity(500, 1.0) * 25.4, 'mm');
//=> 816.8157504 'mm'

// 視力 1.5 の人が 100cm の距離で見たとき、ドットの見分けがつかない限りで最大の印刷サイズ
// 大きく印刷するほど近付いてみる余地が生まれるので、より要求される画質があがると仮定
console.log(pixels.width / dpiByDistanceAndVisualAcuity(1000, 1.5) * 25.4, 'mm');
//=> 1089.087662933585 'mm'

5616×3744は 5D Mark II の場合だけど、最近の高スペックデジカメだとこんなものっぽい。

こうしてみると紙の規格的にはA0がギリギリ限界ぐらいになりそうに思う。

出力サイズにおいてパースが自然な焦点距離

ついでにこれまでのの組合せで、最大限画質を考慮して拡大しつつパースが正しくなる最小の焦点距離を求めた。これは単にカメラの性能と、人間の目の性能によって決まる。

// 視力 1.5 の人について、最大限画質を考慮して拡大しつつパースが正しくなる最小の焦点距離
// 1000mm の位置を仮定してるが、これは距離が変わっても一緒
console.log(~~angleToFocalLength(36, angleByDistanceAndSize(1000, pixels.width / dpiByDistanceAndVisualAcuity(1000, 1.5) * 25.4)), 'mm');
//=> 33 'mm'
// 視力 1.0
console.log(~~angleToFocalLength(36, angleByDistanceAndSize(1000, pixels.width / dpiByDistanceAndVisualAcuity(1000, 1.0) * 25.4)), 'mm');
//=> 22 'mm'

安全圏に収めるなら 35mm だろうし、多少画質を犠牲にしても広く見せたいなら 20mm ぐらいまでいいんじゃないか、という感じになった。

いろいろ間違っているかもしれないのであんまり信用しないでください (特に視力から必要DPIを出すあたりがあやしい気がする)

  1. トップ
  2. tech
  3. 写真のプリント画質と画角・人間の視力

手ブレについて考えたことがあるけど、ずばり焦点距離が x のとき、特定カメラの性能で 1px 以内に手ぶれが収まるシャッタースピードを求める関数が欲しかったので書いた。

/**
 * `focalLength`mm の焦点距離のとき 1px 以内に手ぶれが収まる最低限のシャッタースピード
 * `opts.sensorSize.width`: センササイズ (横)
 * `opts.pixels.width`: ピクセル数 (横)
 * `opts.jiggle_angle`: 手ぶれの角速度 (角度/秒)
 *
 * (focalLength * Math.tan(degreeToRadians(2) * speed)) / (opts.sensorSize.width / opts.pixels.width) == 1;
 * focalLength * Math.tan(degreeToRadians(2) * speed) == (opts.sensorSize.width / opts.pixels.width);
 * Math.tan(degreeToRadians(2) * speed) == (opts.sensorSize.width / opts.pixels.width) / focalLength;
 * degreeToRadians(2) * speed == Math.atan( (opts.sensorSize.width / opts.pixels.width) / focalLength );
 * speed == Math.atan( (opts.sensorSize.width / opts.pixels.width) / focalLength ) / degreeToRadians(2);
 */
function minimunSpeedByFocalLength (focalLength, opts) {
	if (!opts) opts = {};
	if (!opts.jiggle_angle) opts.jiggle_angle = minimunSpeedByFocalLength.JIGGLE_ANGLE.ADVANCED;
	return Math.atan( (opts.sensorSize.width / opts.pixels.width) / focalLength ) / degreeToRadians(opts.jiggle_angle);
}
minimunSpeedByFocalLength.JIGGLE_ANGLE = { // 手ぶれ限界 角速度(角度/秒)
	NOVICE   : 5,
	ADVANCED : 2
};

var sensorSize = {
	width: 36,
	height: 24
};

var pixels = {
	width: 5616,
	height: 3744
};

function show (f) {
	var speed = 1 / minimunSpeedByFocalLength(f, {
		sensorSize : sensorSize,
		pixels     : pixels
	});
	console.log("%dmm 1/%dsec (スピード%d倍=%d段)",
		f,
		Math.floor(speed),
		~~(speed / f),
		Math.sqrt(speed / f).toFixed(2)
	);
}

// NOVICE
show(24);   //=> 24mm 1/326sec (スピード13倍=3.69段)
show(50);   //=> 50mm 1/680sec (スピード13倍=3.69段)
show(100); //=> 100mm 1/1361sec (スピード13倍=3.69段)
show(200); //=> 200mm 1/2722sec (スピード13倍=3.69段)

// ADVANCED
show(24);   //=> 24mm 1/130sec (スピード5倍=2.33段)
show(50);   //=> 50mm 1/272sec (スピード5倍=2.33段)
show(100); //=> 100mm 1/544sec (スピード5倍=2.33段)
show(200); //=> 200mm 1/1089sec (スピード5倍=2.33段)

手ぶれ補正4段分ぐらいあってようやく、いわゆる「焦点距離分の1」で手ブレが無視できるようになる。

画質の評価とかをする場合、十分にシャッタースピードが早いかを確認する必要がありそうだと思った。

  1. トップ
  2. tech
  3. 手ぶれを無視できるシャッタースピード