なぜ“滲ませる”と像が見えるのか — ガウシアンスプラッティング入門

シーンを「にじみ(ガウシアン)の重ね合わせ」で表すと、ぼかしの部品からシャープな像が立ち上がる。その仕組みと、なぜ計算に都合がいいのかを、フーリエと逆問題の視点から。


/play に「2Dガウシアンスプラッティングの遊び場」を置いた。触っているうちに、いい問いをもらった ──「滲ませない方が、像を正確に取れそうじゃない? メガネを外すと何も見えないのに」。もっともな直感だ。だから今日はその話を書いておく。

何をしている技術なのか

ガウシアンスプラッティングは、写真から現実を取り込んで、撮っていない角度からも見られるようにする ── 新規視点合成(novel view synthesis)のための”表現方法”だよ。シーンを、空間に浮かぶ無数の「にじみ」(ガウシアン)の集まりとして持つ。各にじみは、位置・形(楕円の伸びと向き)・色・不透明度を持っている。メッシュもボクセルも使わない。

ぼやけているのは「部品」だけ

「滲ませると情報が失われる」── これは“最終的な像”にボケをかけた場合の話だ。メガネを外したときがまさにそれで、確かにダメ。

でもスプラッティングは逆で、柔らかい部品をたくさん重ねて、合計でシャープな像を作る。部品の柔らかさと、結果の鮮明さは別物なんだ。

これは、フーリエで知っているはずの話と同じだと思う。カクッとした矩形波は、なめらかなサイン波の和で作れる。サイン1本はエッジを持たないのに、足し合わせると鋭い段差が現れる。スプラッティングも、十分な数のなめらかなガウシアンを足せば、いくらでもシャープになる。基底が滑らかでも、鮮明さは作れる。

なぜ“ガウシアン”なのか

理由は、計算が三つの意味で都合がいいからだ。

  • 速い:画面に射影して楕円にし、重ねるだけ。GPUの得意技で、リアルタイムに描ける。
  • 学習できる:滑らかだから微分できる。「写真に合うように部品を調整する」を勾配降下で回せる。硬い部品だと、少しズレても誤差が動かず、どちらへ直せばいいか分からない。柔らかさは“最適化が下り坂を見つけるための条件”なんだ。
  • 式が閉じる:ガウシアンは射影してもガウシアンのまま。3Dの楕円体が、画面でちょうど2Dの楕円になる。数値積分ではなく閉じた式で書ける。

楕円の形は、共分散行列を直接いじらず、回転と拡大で作る:

Σ=R(θ)SSR(θ),S=diag(σx,σy)\Sigma = R(\theta)\,S\,S^{\top}R(\theta)^{\top},\quad S=\mathrm{diag}(\sigma_x,\sigma_y)

“拡大してから回す”。異方性(σxσy\sigma_x \neq \sigma_y)にすると、にじみがエッジに沿って細く伸びて、輪郭がむしろシャープに出る。本家の3D版も同じ作りだよ。

射影:3Dの楕円体が、画面で2Dの楕円になる

「画面に射影して楕円にし、重ねるだけ」と書いたところを、もう少し丁寧に。鍵になる事実は一つだけ:

ガウシアンを線形(アフィン)変換すると、またガウシアンになる。共分散は MΣMM\Sigma M^{\top} に変わる。

3Dのにじみは、中心 μ\boldsymbol{\mu}(3次元)と共分散 Σ\Sigma3×33\times3 =楕円体の形)を持つ。これを画面へ出す手順はこう:

  1. カメラ座標へ:ワールド→カメラの回転を WW とすると、向きが変わるだけなので共分散は WΣWW\Sigma W^{\top}
  2. 画面へ射影:透視投影(x/z, y/zx/z,\ y/z)は非線形だから、にじみの中心まわりで一次近似する。その勾配(ヤコビアン)を JJ とすると、画面上の2D共分散は

Σ=JWΣWJ\Sigma' = J\,W\,\Sigma\,W^{\top} J^{\top}

の左上 2×22\times2 になる。これが画面に落ちた“楕円”=スプラットだよ。にじみが局所的だから一次近似がよく効いて、ちゃんとガウシアンのまま楕円に潰れる ── これが「閉じた式で書ける」の正体だ。

あとは各ピクセル x\mathbf{x} で、そのスプラットの値に不透明度 oio_i を掛けたものを実効の α\alpha とする:

αi(x)=oiexp ⁣(12(xμi)Σ1(xμi))\alpha_i(\mathbf{x}) = o_i\,\exp\!\left(-\tfrac12 (\mathbf{x}-\boldsymbol{\mu}_i')^{\top}\,\Sigma'^{-1}(\mathbf{x}-\boldsymbol{\mu}_i')\right)

ここで μi\boldsymbol{\mu}_i' は射影された中心。最後に、奥から手前へ並べてアルファ合成で重ねる:

C(x)=iciαi(x)j<i(1αj(x))C(\mathbf{x}) = \sum_i c_i\,\alpha_i(\mathbf{x})\prod_{j<i}\bigl(1-\alpha_j(\mathbf{x})\bigr)

射影(Σ\Sigma' を作る)→ ピクセルごとの α\alpha → 前から合成。これが「楕円にして重ねるだけ」の中身だ。全部、行列の積と exp\exp と足し算で書けているのが分かると思う。だからGPUで速いし、各ステップが微分できるから学習も回る。

結局これは逆問題だ

写真が測定、ガウシアンが基底、勾配降下がソルバ。観測から、基底の重ね合わせで対象を復元する ── 構造はフーリエ解析やトモグラフィと地続きだ。最小化するのは、描画結果と写真の差:

L=1NIpredItgt2\mathcal{L}=\frac{1}{N}\sum \lVert I_{\mathrm{pred}} - I_{\mathrm{tgt}} \rVert^2

これが小さくなるように、全ガウシアンの位置・形・色・不透明度を少しずつ動かす。先行手法のNeRFが同じ写実を狙って“遅かった”ところを、ガウシアンは“リアルタイム”でやってのけた。速さと表現力を両取りできたのが大きい。

要するに ── 「描画も最適化も安くなる基底を選ぶ」。式が素直になる座標系を選ぶのと、同じ発想なんだ。

理屈はこれくらいにして、実際に触ってみるのが早いと思う。スプラット数を増やすと、各にじみは柔らかいまま、像だけがキリッと立ち上がっていく。「異方性」を押して比較すれば、楕円が効くのも一目だよ。/play で動かせる。

— ランキン


出典

この記事は仕組みの解説だけど、技術の出どころは次の2本。数式や手法の詳細は原論文を見てね。

コメント

まだコメントはないよ。最初のひとことをどうぞ。