【現像】あおり補正時の垂直方向の補正値はどのくらい? 理論値を求めてみる

Pocket
email this

 このサイトの本当に序盤でPhotoshopを利用したシンプルなあおり補正の方法を紹介していますが、そこで私は「(横の補正値に対する)縦の補正比率は 横の補正値[%]×2/3 程度がいい感じです」と言っていましたが実は結構いい加減なんです。勘です。個人的に見た目がちょうどよかったからです。
 頭の中に図形をあれこれ変形して…っていうイメージはあるのですが具体的に算出したことがないので、やろうと思ったこの機会に求めてみようと思います。

 ※完全なる自力計算のため、間違っていたら教えてください。特に「最初からこういう公式あるよ」なんて情報がありましたら。

解いてみよう

 CGで表現するとこういうことなんです。

前置き

・視野角は90度で、幅、高さが2mの写真を正対して見ている自分を想像します。
・写真との距離は2m。写真の重心を軸にしてクルクルと回転するイメージです。
・写真を回転させていると、写真はあおり補正されたかのように”見える”瞬間があり、これが”アオリ補正された瞬間”であると定義します。
 このとき写真は何度回転されたかを確認します。

 要は、CG上で画像を回転するとあおり補正されたように見えますよね。だからこのときの見た目がPhotoshopであおり補正したときと同じでしょ!というのが考え方のベースです。

Photoshop上
CG上

 さて、見た目としては縦が潰れてしまったように見えるわけですから、潰れた分を伸ばして復元してやれば良い。という考えをします。(Photoshopで言う垂直拡大です。今まで「横の2/3倍伸ばす」と言ってた部分です。)

 この”伸ばす値”を求めるのが今回の目的です。

計算する

 ちなみに今回から数式表現プラグインのMathJax-LaTeXを入れてみました。

1.計算式を考えてみる

まずは画像のアスペクト比を求めておきます。横の解像度をW[px]、縦の解像度をH[px]とすると、アスペクト比Aspは、
$$Asp = \frac{W}{H}$$
SONYのα7Ⅱだったら横=6,000px、縦=4,000pxなので、
$$Asp = \frac{6000}{4000} = 1.5$$
となります。

さてここから図を描きながら考えます。
例えば写真をPhotoshopで遠近感を実行したとき、水平方向にK%拡大すればあおり補正ができるとわかった場合で考えてみる。
視野角をf、ビューの水平方向をy、垂直方向をzとすると、見える範囲(ビューフラスタム)の境界は、横から見たとき、
 $$y = z・tan\frac{f}{2}$$
の直線として考えることができる。

画像を回転してあおり補正ができたように見えたときの回転角度をθ度回転したとき。つまりカメラから見たとき、画像はdだけ縮んだように見える。

この縮んだ座標を示すy1とy2の値は、
$$y_1 = (k – d) tan\frac{f}{2}$$
$$y_2 = (k + d) tan\frac{f}{2}$$
となる。

さて、画像の見方をちょっと変えます。カメラから見たときX軸とY軸が見えますが、図形をθ度回転したときに上底の長さが下底のK倍の長さになった場合というのは、Photoshopで水平方向にK×100[%]伸ばしたのと同じことになります。

つまり y2 と y1 の比率がK倍になればいいのだから(例えばy1に対してy2が2倍の長さになるとき。=Photoshopで水平方向を200%に伸ばしたとき。)、
$$ \frac{y_2}{y_1} = z $$
$$ \frac{ { (k + d) tan\frac{f}{2} } }{ { (k – d) tan \frac{f}{2} } } = z $$

dについて求めると、
$$ d = \frac{k – 1}{k + 1} z \text{ ・・・①} $$
となる。

ということはあおり補正されたように見える瞬間の、写真の回転角度θは、
$$ θ = asin(d) \text{ [rad] ・・・②} $$
$$ θ = asin(d) \times \frac{180}{π} \text{ [deg]} $$
であろう。と分かった。

一方、あおり補正されたように見えるときの写真の高さは、正対して見るよりも cosθ 倍に縮んで見えるので、もとの縦の長さに見えるようにするために高さを元の長さに引き伸ばす。つまり垂直方向に伸ばす値Hs[%]は、
$$ H_s = 1 + \left( \frac{1}{cosθ} – 1 \right) \times 2 \text{ [倍]} $$
$$ H_s = \left\{ 1 + \left( \frac{1}{cosθ} – 1 \right) \times 2 \right\} \times 100 \text{ [%] ・・・③} $$
を垂直方向に引き伸ばせばよい。ってことになる。つまり③式の値が答えである。

一応求まったみたいです。:D

2.計算式に値を与えてみる

試しにα7Ⅱで撮影した写真・・・横:縦=6,000:4,000pxのアスペクト比 Asp = 1.5 の建築写真について、水平方向に200%伸ばす必要があった場合で考えてみましょう。つまり K = 2.00 の場合です。
以後、視点から写真までの距離は z = 2 [m] の位置に置かれていることとしますので、定数として扱えます。①式より、
$$ d = \frac{k – 1}{k + 1} z \text{ ・・・①} $$
$$ d = \frac{2 – 1}{2 + 1} \times 2 $$
$$ d = \frac{1}{3} \times 2 \text{  } = \frac{2}{3}  ≒0.667 $$
となる。式②より、
$$ θ = asin(d) \text{ [rad] ・・・②} $$
$$ θ = asin(\frac{2}{3})    = 0.7297 \text{ [rad]}    = 41.8031 \text{ [deg]}$$
となった。最後に③式に代入して
$$ H_s = \left\{ 1 + \left( \frac{1}{cosθ} – 1 \right) \times 2 \right\} \times 100 \text{ [%] ・・・③} $$
$$ H_s = \left\{ 1 + \left( \frac{1}{cos(0.7297)} – 1 \right) \times 2 \right\} \times 100 $$
$$ H_s = 168.32 $$
が求まる。
つまり、水平方向に200%伸ばしたのであれば、垂直方向を伸ばす値は168%だという理論値が出た。

お! これは今まで感覚でやってた値とかなり近い。

まとめ

zは定数2として、
$$ d = \frac{k – 1}{k + 1} z  = \frac{k – 1}{k + 1} \times 2 \text{ ・・・①} $$
$$ θ = asin(d) \text{ [rad] ・・・②} $$
$$ H_s = \left\{ 1 + \left( \frac{1}{cosθ} – 1 \right) \times 2 \right\} \times 100 \text{ [%] ・・・③} $$
まとめると以下の1つの式となる。水平補正がk[%]のとき、垂直補正Hs[%]は、

$$ H_s = \left\{ 1 + \left( \frac{1}{cos( asin(\frac{\frac{k}{100} – 1}{\frac{k}{100} + 1} \times 2) )} - 1 \right) \times 2 \right\} \times 100 \text{ [%]} $$

試しにk=100[%]を代入してみてください。Hs=100[%]となるのがわかります。たぶんこの式は間違っていないと思われる。きっと!

検証 : 感覚的な値は妥当だったのか

 当時、感覚的に適用していた垂直補正値は、理論値と比べていい塩梅だったのかを検証してみます。
 上の公式らしきもののkに値を与えてグラフ化すると、以下のような曲線になります。(赤線)
 それに今まで勘でやっていた水平方向と垂直方向の伸ばす値をグラフにして比べてみましょう。(青線)

 自分で言うのもあれだけどいままでの直感は意外といい線いってたのかもしれませんね。経験則として、
  ・100~150%は、垂直方向は水平方向の1/2程度。
  ・150~200%は、垂直方向は水平方向の2/3程度。
  ・150~200%は、垂直方向は水平方向と同じかそれ以上。
にするとだいたい良い感じになるってのは知っていたのだけど、理にかなっていたんだなと。安心した。

余談 : 式から見えてくること

 今回私が勝手に作ったこの式に従うのであれば、以下のことが言えます。

  • 水平方向に300%以上伸ばす必要がある写真はレタッチによるあおり補正は不可能であることを示しています。(③式においてθ=90度のとき解なし。)
  • 実質的には水平方向に250%伸ばそうとするあたりで限界を迎えることもわかります。

 これもほぼ感覚通りだった。ぐーだね。

 なんかスッキリした。これを自作したあおり補正カメラアプリに適用したらさらに精度が上がりそうです。

コメントを残す