Nature | Photography | Music | Art -26ページ目

Nature | Photography | Music | Art

日々好奇心の趣くまま

サイト内の写真の使用ならびに無断転用を禁じます。

そういえば最近まともに登山をやっていなかったことを思い出し、気晴らしと足慣らしを兼ねて雪がほとんど解けてしまった赤城山へ登ってきました。



ついでながら、月の暗い時期なので周辺の水辺で星でも撮ろうかとそのまま待機。
が、晴天予報だった割には春霞みが激しい上に結構雲が多い。



更に撮影適地の周辺ではまだ4月だというのにD族の人々が五月蝿く行ったり来たり。

ということでモチベーションを削がれてしまい、撮影はやめて静かな場所に逃れて呑んだくれておりました。

折角なので、呑んだくれながらちょっとこんなものを撮ってみた。

普通に撮影した北斗七星周辺。



同じ条件で、ちょっとフォーカスを故意に外すと。




実はこうやって撮るほうが星の本来の色が見えてくるのです。

つまりオンフォーカスで長時間露光すると、明るい星はいわゆる「白トビ」状態になり結果的には色がなくなってしまい、逆にフォーカスを外すことで光量が分散されてきちんと色が出るようになるみたい。ディフュージョンフィルタを使うのも同様の効果があるのでしょう。

このあたり今まであまり気を配ってなかったなあ…と反省。

シリウスや金星のような1~2秒で写る星もあれば分単位露光でやっと写る暗い星もあり、星空というものは意外とダイナミックレンジが大きく、その双方を同時に綺麗に撮るのは至難です。

デジカメの技術発展は著しいが、実は銀塩カメラのような奥深い色表現をする境地にはまだまだ追いついてないのか。

このあたりオーディオの世界でまだ真空管が重宝されていることと根が同じで、つまりは元信号に対していかに美しく滑らかなサチュレーションカーブが描けるかということと大きく関係がありそう。まだまだ感度や解像度以外の領域にもデジタルの改善の余地は多いのかもしれません。

…とかいうことを妄想しながら呑んだくれておりました。
このところプログラムで空間を歪めまくっているので、余興でもう一つ作ってみました。

海外では"Little Planets"、国内では"惑星風パノラマ"とかいう名称で呼ばれている技法。

写真技法(というよりポストプロセス)的にはどちらかというと飛び道具の部類なのだが、なぜか国内・国外を問わず結構マニアが多く、個人的にも嫌いではない。

おそらく人間は球体をしたものを殊の外心地よく感じる本能があるのでは?

例えばこんな感じ。元の画像は



処理後(不連続部分の修正処理なし)



簡単に説明すると、直交座標のx,yをそれぞれ極座標のθ,rに変換してマッピングしたもの。

Photoshopで作るのが一般的なのだが、Photoshopだとパラメータ調整がなく自由が利かず作りづらいし、どうせなら詳細を自由に弄るため自前実装できないかと模索していました。

そこで見つけたのがこのサイト。

http://www.semifluid.com/2014/04/20/equirectangular-to-stereographic-projections-little-planets-in-matlab/

なんと、Matlabを使ってこの機能を実現していて、Matlab言語で書かれたソースコードも公開。パラメータ調整もできる。

そこでこれを参考にOpenCVバージョンを作ってみました。

https://github.com/delphinus1024/little_planets

例の如く詳しい使い方はreadmeを参照していただくとして、綺麗に作成できるコツなどを列記してみます。



  • 下が中心、上が周辺にマッピングされる。(-Fオプションで上下反転)上下の図柄の割合の加減が結果に大きく影響する。なるべく上下の図柄を均等にした方がよい結果になるみたい。


  • 横長の画像の方が出来栄えがよい。

  • 元画像の左右の末端同士を繋げることになるので、どうしても不連続部分ができてしまう。不連続部分はPhotoshopのコピースタンプやクローンなどをうまく使って修正する必要あり。末尾で公開しているのはいずれも修正後のもの。


  • 不連続部分は下に持ってくるとごまかしやすい。(オプションだとだいたい -W=2.4)


  • 一般的につまらないとされる左右にノッペリとした写真の方が綺麗に仕上がる。


  • 綺麗な球にするには元画像の水平をきちんと合わせる。


  • 中心部分の大きさはカメラ距離(Dオプション)で決まる。中心と周辺、どちらが主役かを考えて加減する。



以下がこのプログラムによる作例。













元画像は省略しますが、被写体次第でいずれも独特な世界観が出てくるように思います。

真摯にカメラをやられている方々からは怒られそうな技法ですが、絵画の世界でも長い歴史の中で異端から新しい表現が生まれたということも多々あるので、まあいいということにしておきましょう。
本日、自宅から500m以内の撮って出しです。
さて、これは何でしょう?



ちょっと引いてみる。



更に引いてみる。



これで分かるかな。




関東は今週が見頃のようです。




ある種異様な撮影風景だったのでオバちゃんが不思議そうにこちらを眺めておりました。
シリーズあと一息。

実はこちらの方が個人的に多用するだろうと思うFishEyeの歪み補正。
前回のRectilinearのレンズとは構造が異なるため別扱いとなっているみたい。

FishEyeの場合とりわけ周辺歪みが大きく、パノラマで繋げようとしてもそのままでは全然繋がらないので経験上この補正は必須のようです。(世に出ているパノラマ編集ソフトは内部でこの作業を行っている模様。)

計算式の導出などは、lensprofile_creator_cameramodel.pdfの"Geometric Distortion Model for Fisheye Lenses"を参照。

計算式は円周方向の歪み補正が省かれているなど若干相違点があるが、大筋はRectilinearの内容が理解できればこちらも容易に理解できると思う。

例として個人的に愛用しているCanon EF 15mm F2.8 Fisheye(名玉なのに長らく前に製造中止・泣)のlcpの該当部分はこんな感じ。



緑で囲った部分が"stCamera:FisheyeModel"となっていればFishEyeレンズということを示している。

lcpの項目と補正パラメータの関係は以下の通り。赤で囲んだ部分。

stCamera:FocalLengthX : fx / Dmax. If absent, default to stCamera:FocalLength in millimeters.
stCamera:FocalLengthY : fy / Dmax. If absent, default to stCamera:FocalLength in millimeters.
stCamera:ImageXCenter: ux / Dmax. If absent, default to 0.5.
stCamera:ImageYCenter: uy / Dmax. If absent, default to 0.5.
stCamera:RadialDistortParam1: k1
stCamera:RadialDistortParam2: k2

パラメータの詳細は前回のRectLinearより若干パラメータ数が少ないが、ほぼ同様なので説明省略。

以上をOpenCVのremap関数を用いてインプリしたものを公開しました。

https://github.com/delphinus1024/fisheye_undistort

ビルド・使用法の詳細はreadmeをご覧頂くとして、実行結果を。

補正なし



補正後。変形のイメージを掴みやすくするために、サイズをオリジナルの3倍(-S=3.0 option)に取ったもの。



湾曲していた部分が直線に戻っているのがわかるかと思います。
Rectilinearの場合と異なり、FishEyeを補正して直線化すると実はこんな極端な変形をするのです。Photoshop内部だけで作業していると勝手にトリミングされるので気づかないが。

四隅がほぼ無限大に広がってしまい実用になるのはその中心部のみとなります。

実用上は上下左右の黒の部分を省いた最大矩形をトリミングすると、通常Photoshopなどで行うFishEye補正になります。

(後日補足)この後、Vignette補正についても書こうと思っていたのですが、どういうわけか理屈と結果が一致せずに停滞中。解決したら後日改めて書く(かもしれません)。
前回書いた補正パラメータのうち"Geometric Distortion Model for Rectilinear Lenses"の部分で、FishEye以外のレンズの歪み補正はこちらを使用することになります。

今回例として取り上げるのが陣笠歪みの激しいSamyang 14mm F2.8。補正し甲斐のある一品。

lcpファイルはおそらくCRもLRもデフォルトでインストールされないが、LensProfileはAdobe Lens Profile Downloaderを使えば見つかります。

計算式の導出に関してはlensprofile_creator_cameramodel.pdfの"Geometric Distortion Model for Rectilinear Lenses"の項に詳しく書いてあるので割愛して補足的なことを。

まず、ここの計算式をややこしくしているのが複数の座標系と複数の単位が入り混じっていること。

そこで整理を兼ねてそれぞれの変数の単位(unit)と座標系の場合その原点(origin)を羅列しておきます。

unit noneとなっているのは決まった単位ではなくF=1としてスケーリングした座標系を表しており、それ以外のものはpixelかmmのいずれかの単位を持つ。

sx,sy (unit: pixels / mm)
F (unit: mm)
fx,fy (unit: pixel)
(X,Y,F) (unit: mm, origin: center)
(x,y,1) (unit: none, origin: center)
(x,y) (unit: none, origin: center)
(xd,yd) (unit: none, origin: center)
(u,v) (unit: pixel, origin: left top)
(u0,v0) (unit: pixel, origin: left top)
(0,0,F) (unit: mm, origin: center)
xd (unit: none, origin: center)
x (unit: none, origin: center)
r (unit: none, origin: center)

原点に関しては画像左上のものと画像中心のものがあり、これを混同しないようにすることが重要。

画像中心が原点になっているものは、主に歪みの量が画像中心からの距離で決まることに由来する。

これらを踏まえれば計算式も難解ではないと思います。

ここで計算に必要な補正パラメータはu0,v0,fx,fy,k1,k2,k3,k4,k5となるが、多くの場合kの高次の項は省略されている。(つまり0として扱う)

今回題材にするSamyang 14mm F2.8のlcpファイルのrdf:liはこんな感じ。



緑で囲った部分が"stCamera:PerspectiveModel"となっていればRectilinearレンズということを示している。



複数のApertureとFocus Distanceの値に対応する補正パラメータが含まれており、そのうち撮影状況に最も近いものを選ぶ。今回はF8で撮影したので、F8のときの補正パラメータを選択。

lcpの項目と補正パラメータの関係は以下の通り。上の画像の赤で囲った部分で、いくつかのパラメータは省略されている。

stCamera:FocalLengthX : fx / Dmax. If absent, default to stCamera:FocalLength in millimeters.
stCamera:FocalLengthY : fy / Dmax. If absent, default to stCamera:FocalLength in millimeters.
stCamera:ImageXCenter : ux / Dmax. If absent, default to 0.5.
stCamera:ImageYCenter : uy / Dmax. If absent, default to 0.5.
stCamera:RadialDistortParam1 : k1
stCamera:RadialDistortParam2 : k2
stCamera:RadialDistortParam3 : k3
stCamera:TangentialDistortParam1 : k4
stCamera:TangentialDistortParam2 : k5

上4つに出てくるDmaxというのは処理する画像の縦横いずれか長い方のpixel数。要はFull RAW,MRAW,SRAWなどの設定で解像度が変わるので、すべての解像度のパラメータを用意することを省くためにこういう仕様になったと思われる。計算時は処理する画像のDmaxを掛け算して使えばよい。

一ついまだに不明なのが、ドキュメントにはstCamera:FocalLengthX,Yが存在しないときにはstCamera:FocalLengthを使えと書いてあるが、前者の単位がpixelで後者はmmなので相容れないはずなのだが…おそらくカメラのセンサーサイズを考慮して算出するのか?

実際、この値が存在していないlcpは結構多い。特にサードパーティーのレンズ。

それはさておき、OpenCVのremap関数を用いてこの機能をインプリしたものを公開しました。

https://github.com/delphinus1024/rectilinear_undistort


ビルド・使用法の詳細はreadmeをご覧頂くとして、実行結果を。

補正なし。決してロココ風の湾曲をしているわけではなく、陣笠歪みというもの。実物は直線。



補正後、直線になっている。画角を最大限にするために黒い縁があるので、必要に応じてトリミングする。



参考のために、Adobe Camera Rawで補正したもの。カメラとSPI通信できないSamyangなのでEXIFに計算に必要なF値などはないはず。おそらく適当なデフォルト値を使っている?



ちなみにOpenCV本体にもカメラキャリブレーションの機能を有しているが、チェッカボードを何枚も撮影して補正する必要があるので結構手間がかかります。
該当するレンズのlcpファイルさえあればこちらの方が楽です。