0%

根据全景贴图求球谐系数

目前认为室内参数化光照模型主要分为两大类:

  • 球面谐波
  • 球面高斯

SH初探

目前球面高斯类的方法已经有EMlight开源了,球面高斯参数生成、网络训练已经打通。但是我还没有掌握球面谐波类的方法,球面谐波模型主要难点在于求取球谐基函数的系数(spherical harmonics coefficients)。

  1. 从使用SH光照模型并开源的代码入手,寻找球面谐波系数求取的代码:
  1. 直接谷歌”python spherical harmonics coefficients”等关键词,在github上也同时寻找,找到了3个python包和一个github代码:

阅读相关文档,最终pyshtools跑通。
借助pyshtools包,完成了将全景HDR图映射到球谐基上,获取低频部分的球谐系数,并从球谐系数重建出全景HDR、LDR图的代码。

系数求取和图像复原实验

下面展示一些全景图及其通过5阶球谐系数(共36*3个参数)重建出的图像:

  • 图1
    C:\Users\ji_xi\Desktop\9C4A7069-others-280-1

  • 图1-重建
    C:\Users\ji_xi\Desktop\9C4A7069-others-280-1

  • 图2
    C:\Users\ji_xi\Desktop\9C4A7069-others-280-1

  • 图2-重建
    C:\Users\ji_xi\Desktop\9C4A7069-others-280-1

  • 图2
    C:\Users\ji_xi\Desktop\9C4A7069-others-280-1

  • 图3-重建
    C:\Users\ji_xi\Desktop\9C4A7069-others-280-1

  • 图4
    C:\Users\ji_xi\Desktop\9C4A7069-others-280-1

  • 图4-重建
    C:\Users\ji_xi\Desktop\9C4A7069-others-280-1

可以看出5阶球谐系数能反映全景图的低频光照信息,成分上接近环境光。但是无法表示昏暗环境下的光源强度,这是SH光照模型的弱点。
Garon在其文章Fast Spatially-Varying Indoor Lighting Estimation中也用的是5阶球谐系数,他测试了3阶到8阶的SH,认为5阶SH达到了效率和效果的平衡,最适合他的工作:

We chose order 5 after experimenting with orders ranging from 3 to 8, and empirically confirming that order 5 SH lighting gave us a practical trade-off between rendering time and visual quality (including shading and shadow softness).

其他论文中使用到的SH也基本是2阶(9 $\times$ 3)、3阶(16 $\times$ 3)的。

球谐基底不止一种

球谐函数是球面空间上一组相互正交的基底,将球面上的信息(例如全景光照贴图、地球大气图层)分解为球谐基的表示形式与傅里叶变换是一个意思:都是从时域(或空间域)到频域的变换。

基底只需要满足相互正交,所以基底不唯一。基底的不同定义方法,就是不同的normalization。

目前常用的球谐函数工具包都会提供很多种normalization。不同的normalization得到的球谐基底、系数是不同的,但是重建的图像都是相同的。例如,pyshtools 4.10在支持以下四种normalization:

pyshtools_normalization

是否包含Condon-Shortley phase也是基底的两种不同表示方式。Condon-Shortley phase其实就是基底中的一个$(-1)^m$,如下图所示:
Condon–Shortley_phase

这是截取自另一个SH工具包SHTns 2.6.5说明文档的图。图里清晰列出了不同normalization下球谐基底$Y^m_l(\theta,\phi)$表示公式的区别,主要是$P^m_l(cos\theta)$前不同的系数。而Condon-Shortley phase是$P^m_l(cos\theta)$中的一项,可以选择加或不加。

pyshtools默认构建出’4pi’-normalized、不加Condon-Shortley phase的球谐基底,并按照此球谐基底求系数。这可能是因为pyshtools原本是为地理、大气、宇航等地球学科提供的工具包。

论文中使用的SH定义

但是,据我观察,球谐光照经典论文[^1]的一个python复现版本里使用的球谐基底应当是’ortho’-normalized,且添加了Condon-Shortley phase。理论上,观察这份代码里对$Y^m_l(\theta,\phi)$的定义:

1
2
3
4
5
6
7

def K(l, m):
#return np.sqrt((2.0 * l + 1.0) * 0.07957747154594766788 * divfact(l, m))
return np.sqrt( ((2 * l + 1) * factorial(l-m)) / (4*np.pi*factorial(l+m)) )
#此处,除以4 pi,查阅https://www2.atmos.umd.edu/~dkleist/docs/shtns/doc/html/spec.html
#对球谐基函数几种Normalization形式的定义,得知此种是Orthonormalized形式的基函数定义。

再观察到其SH基函数关于m是正负交替的:

1
2
3
4
5
6
7
8
9
10
11
12
13
def SH(l, m, theta, phi):
sqrt2 = np.sqrt(2.0)
#此处,SH基函数的定义正负受m奇偶影响,应当是考虑Condon-Shortley phase的
#https://www2.atmos.umd.edu/~dkleist/docs/shtns/doc/html/spec.html
if(m==0):
if np.isscalar(phi):
return K(l,m)*P(l,m,np.cos(theta))
else:
return K(l,m)*P(l,m,np.cos(theta))*np.ones(phi.shape)
elif(m>0):
return sqrt2*K(l,m)*np.cos(m*phi)*P(l,m,np.cos(theta))
else:
return sqrt2*K(l,-m)*np.sin(-m*phi)*P(l,-m,np.cos(theta))

至此,理论上可确定这份代码里的SH基函数是’ortho’-normalized,且添加了Condon-Shortley。
再做实验确定理论猜想。用pyshtools从一个hdr全景图中算出SH系数,设定为’ortho’-normalized,且添加Condon-Shortley。然后用这些系数重建图像。接着,用上述复现代码求SH系数,并复原图像。对比两份程序得到的系数和重建图像,基本一致。至此,可确定上述代码的SH基函数类型。

这份代码复现同时被另外一篇球谐光照论文使用[^2],因此我认为其专业性没有问题。

[1] 11 R. Ramamoorthi and P. Hanrahan, “An efficient representation for irradiance environment maps,” in Proceedings of the 28th annual conference on Computer graphics and interactive techniques - SIGGRAPH ’01, Not Known, 2001, pp. 497–500. doi: 10.1145/383259.383317.
[2] V. Gkitsas, N. Zioulis, F. Alvarez, D. Zarpalas, and P. Daras, “Deep Lighting Environment Map Estimation from Spherical Panoramas,” May 2020, doi: 10.48550/arXiv.2005.08000.