もさぷい

ゲーム、3D関連技術ついて

自然画像に対する球面調和関数の展開

3Dで使われることがある球面調和関数の勉強として、

球面調和関数を使用し、単純な画像変換を行ってみました。

 


球面調和関数とは?:

直感的に分かりやすい紹介をしてくれている

【コラム】3Dグラフィックス・マニアックス (68) 事前計算放射輝度伝搬(PRT)~PRTの基本。静的PRT(3) | パソコン | マイコミジャーナル

によると(引用)

『球面調和関数とは、かなり極端に簡略化して説明すると、球っぽいモノから任意の長さの針が突き出た「いびつなウニ」みたいな物体の形状を数学的な関数で表すためのもの……といえる(ウニの針が逆に凹んでいる場合もある)。』

MPEGJPEGの圧縮に用いられる離散コサイン変換の「球体バージョン」ということができるかもしれない。』

ということである。(ウニという表現が非常にGoodだと思います。)


この球面調和関数を使うことで、球面上の位置を使って定義される関数を球面調和関数展開し、近似関数をつくることができる。高次の係数(ほぼ0に近くなる)を無視すれば、情報の圧縮が可能になります。情報の圧縮が目的です。

 

本当に綺麗に近似できるのかと思ったので、今回、次のような自然画像を球面上の二つの半球面にそれぞれ正射影で貼り付けられているモノとして考え、球面調和関数展開を行って係数を計算し、その係数を作った近似関数から画像を再構築してみました。

Yasai_orig.png

 

 

計算式は、t-pot『テイラー、フーリエ、球面調和関数』

で紹介されていた式を離散的なものに修正して使用しました。

 

[結果]

元画像:

Yasai_orig.png

 

l=0の時(係数は1個)  l=5の時(係数は36個)  l=20の時(係数は441個)

Yasai_resultSH_l0.png   Yasai_resultSH_l5.png   Yasai_resultSH_l20.png

 

l=50の時(係数は2601個)

Yasai_resultSH_l50.png

 

 

「う~ん・・」な結果となりました。

記事では、解像度の低い32×32テクセルの6面体のキューブ環境マップの例を使い、「実用レベルで係数は16個程度でも十分」と書かれていますが、今回使ったのは、512*512の画像です。結果を見る限り、少ない係数では悲惨な状況になっており、解像度が高い場合は、多くの係数を必要とすることが分かりました。

 

*記事で係数は16個程度でも十分と書かれている理由は、32*32の解像度の低い自然画像を用いており、解像度の低い画像は、詳細部分が失われ周波数の低い画像となっているためだと考えられます。

 

そもそも、解像度の高い球面全体の自然画像に対して、球面調和関数展開しても、球面全体の自然画像では、周波数が高くなり、高次の係数が必要になってきます。ですので、解像度の高い球面全体の自然画像に対して、球面調和関数展開するのは、よくないと思いました。

 

今回の実験を行ってみて、フーリエ級数の「球体バージョン」ということを感じ取ることができました。

 

もっと調べてみるとおもしろそうです。仕事忙しいけど、こつこつやってみよう!

 

参考:

【コラム】3Dグラフィックス・マニアックス (68) 事前計算放射輝度伝搬(PRT)~PRTの基本。静的PRT(3) | パソコン | マイコミジャーナル

http://journal.mycom.co.jp/column/graphics/068/index.html

 

t-pot『テイラー、フーリエ、球面調和関数』

https://t-pot.com/program/88_SH/index.html