【AI数学】NeRF中的球面谐波函数(Spherical Harmonics)

球面谐波(SH)因为其良好的性质活跃在NeRF、Plenoxels、3DGS等显隐式场景表示的方法中。
问:球面谐波是什么?
答:一组基函数。可以理解为傅里叶分解的一种特殊形式,即“任何函数都可以用这组基的算术组合来近似”。
先描述一种通用情况:
假设我们有一组基数为3的完备基函数: [ e 1 ( x ) , e 2 ( x ) , e 3 ( x ) ] [e_1(x), e_2(x),e_3(x)] [e1(x),e2(x),e3(x)]
我们存在一个目标函数 f ( x ) f(x) f(x),那么 f ( x ) f(x) f(x)可以用这组基函数来表达:
f ( x ) = a 1 e 1 ( x ) + a 2 e 2 ( x ) + a 3 e 3 ( x ) (1) f(x)=a_1e_1(x)+a_2e_2(x)+a_3e_3(x)\tag{1} f(x)=a1e1(x)+a2e2(x)+a3e3(x)(1)这里的 [ a 1 , a 2 , a 3 ] [a_1,a_2,a_3] [a1,a2,a3]就是这组基的系数了。当然,我们可以用更“细致”的正交基来拟合目标函数,一般对应着更多的基数。我们可以浅看一张图:
在这里插入图片描述

这里的n表示基数,用的是球面谐波基。由此可见,基数越多,拟合效果越佳

如果对数学不那么苛求的人,只需要了解SH在NeRF中的使用,本文大概能满足这一需求。


球面谐波

球面谐波基,顾名思义,跟球面有关。

首先,我们来回顾一下极坐标的概念:用半径和角度的组合 ( r , θ ) (r,\theta) (r,θ)来代替笛卡尔坐标系下的 ( x , y ) (x,y) (x,y)
r ( θ ) = 1 r(\theta) = 1 r(θ)=1表示半径为1的圆。
极坐标
跟传统的笛卡尔坐标相比,极坐标天然适合处理圆的场景那么三维极坐标就天然适合处理球面场景。
那么极坐标和球面谐波有什么关系呢?答:SH就是在极坐标下的基函数。
我们先看一下,三维极坐标是什么样子:
r = f ( θ , ϕ ) (2) r = f(\theta, \phi)\tag{2} r=f(θ,ϕ)(2)
球面坐标
r(即图中的 ρ \rho ρ)表示半径, θ \theta θ ϕ \phi ϕ表示观测角度。
我们通过 r = f ( θ , ϕ ) r = f(\theta, \phi) r=f(θ,ϕ)来可视化SH基:
在这里插入图片描述

图3 球谐基可视化1

看起来像细胞或者某种外星生物,这也是让人觉得很不直观的地方。但换一种表达,可能大家就容易理解了(将距离用颜色来表达):
在这里插入图片描述
图4 球谐基可视化2
往往在三维重建里用的多的就是图4这一种。应用场景为:对空间中一个点的颜色表达与观测它的角度有关。那么,构建出函数:
c = f ( θ , ϕ ) (3) \bold{c}=f(\theta, \phi)\tag{3} c=f(θ,ϕ)(3)
这里不存在半径的变化,所以SH基函数也是保持球体的几何结构,不像图3中那么多异形。那么任意一个球形表面的颜色表达,可以用球谐基来分解
在这里插入图片描述
我们看一下球谐基的数学表示:
SH
Y l m Y_l^m Ylm表示第 l l l阶的第 m m m个球谐基,在NeRF中 l l l的最大值通常取2或者3,而对应阶的 m m m取值范围为 [ − l , l ] [-l,l] [l,l]。上面的公式群就表示2阶球谐基的一共9个球谐基,只需拟合9个系数就可以完成函数的分解。对于最近火热的3DGS,默认采用3阶球谐基,有16个球谐基。通常,RGB这3个通道都会用一组球谐基,所以通常球谐系数还要 × 3 \times{3} ×3

在工程实现中,会把上面的常数部分都计算出来先保存,我们观察代码可以发现。


球面谐波与NeRF

首次将SH引入NeRF的工作是PlenOctrees。论文中较详细地描述了SH的使用。
NeRF原本的数学表达为:
f Θ ( x , y , z ; θ , ϕ ) = ( c , σ ) (4) f_\Theta(x,y,z;\theta,\phi)=(\bold{c},\sigma)\tag{4} fΘ(x,y,z;θ,ϕ)=(c,σ)(4)
这里的 f Θ f_\Theta fΘ表示MLP。而经过SH编码以后的表达式变为:
f Θ ( x , y , z ) = ( k , σ ) (5) f_\Theta(x,y,z)=(\bold{k},\sigma)\tag{5} fΘ(x,y,z)=(k,σ)(5)
这里的 k \bold{k} k表示球谐系数。颜色可以由球鞋系数进一步得到:
c = f ( d ; k ) (6) \bold{c}=f(\bold{d};\bold{k})\tag{6} c=f(d;k)(6)
请添加图片描述
这里的k代表球谐系数,l和m分别代表球谐基的阶数和对应的基数:
l和m示意图


总结

在NeRF或者3DGS等三维重建技术的背后,需要对空间点(或者高斯球)的空间位置 ( x , y , z ) (x,y,z) (x,y,z)和观测方向 ( ϕ , θ ) (\phi,\theta) (ϕ,θ)进行合理表示。我们发现,空间位置 ( x , y , z ) (x,y,z) (x,y,z)是笛卡尔坐标系下,而观测方向 ( ϕ , θ ) (\phi, \theta) (ϕ,θ)是球形坐标系下,不同坐标系可以选择不同的编码方式。
对空间坐标系的编码方式常见的有多分辨率哈希编码、频率编码;
对球形坐标系的编码方式最常见的就是球谐函数编码了~(频率编码不实用的原因是编码不紧凑);

球面谐波函数是最紧凑的球面坐标编码方式(至少是之一),任何关于 ( ϕ , θ ) (\phi,\theta) (ϕ,θ)的函数都可以由球谐基的组合来表示(即公式(1)的形式)。

参考:https://www.ti.uni-bielefeld.de/html/people/ddiffert/libShc/manual/fouriertransform.html

### 球谐函数双重编码在NeRF中的应用 球谐函数(Spherical Harmonics, SH)是一种用于表示三维空间中方向依赖量的有效工具,在计算机图形学中有广泛应用。对于NeRF(神经辐射场),球谐函数可以用来高效地编码光照条件下的颜色信息。 #### 编码原理 球谐函数提供了一种紧凑的方式,来近似描述环境光或物体表面反射属性的方向分布特性。具体来说,球谐函数可以在低频分量上捕捉到全局照明效果,而高频部分则负责细节表现[^1]。 #### 实现过程 在NeRF框架内引入球谐函数双重编码通常涉及以下几个方面: - **位置嵌入**:除了原始的位置坐标外,还可以加入经过球谐变换后的版本作为输入特征向量的一部分。这有助于网络学习更复杂的模式识别能力。 ```python import torch def positional_encoding(x, L=10): out = [x] for i in range(L): for fn in (torch.sin, torch.cos): out.append(fn(2.0 ** i * x)) return torch.cat(out, dim=-1) def spherical_harmonics_encoding(theta_phi): # theta_phi is a tensor of shape [..., 2], where the last dimension represents (theta, phi). l_max = 3 # Maximum degree of spherical harmonics. sh_coeffs = [] for l in range(l_max + 1): for m in range(-l, l + 1): Y_lm = compute_spherical_harmonic_coefficient(l, abs(m), theta_phi[..., 0], theta_phi[..., 1]) if m < 0: sh_coeffs.append((-1)**m * np.sqrt(2) * Y_lm.imag) elif m > 0: sh_coeffs.append(np.sqrt(2) * Y_lm.real) else: sh_coeffs.append(Y_lm.real) return torch.stack(sh_coeffs, dim=-1) ``` - **视角方向处理**:利用球谐函数对观察角度进行编码,使得模型能够在不同视角下更好地预测色彩变化。这种做法特别适用于具有强烈镜面反射特性的材质模拟[^2]。 - **光线传播计算**:当涉及到间接光照路径追踪时,预先计算并存储好各个重要采样点处的球谐系数,可显著加速后续渲染过程中所需的相关积分运算。 #### 应用优势 采用球谐函数双重编码不仅提高了表达力,而且减少了内存占用和计算成本,尤其是在大规模场景重建任务中表现出色。此外,这种方法还能增强系统的鲁棒性,即使面对复杂多变的真实世界情况也能保持良好性能[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木盏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值