【三维重建】【3DGS系列】【深度学习】从概率密度到几何形体:3D高斯椭球的数学构建与可视化

张开发
2026/4/15 1:43:32 15 分钟阅读

分享文章

【三维重建】【3DGS系列】【深度学习】从概率密度到几何形体:3D高斯椭球的数学构建与可视化
1. 从概率密度到几何形体3D高斯椭球的数学本质第一次接触3D高斯泼溅(3DGS)技术时最让我困惑的就是为什么一个概率分布函数能表示三维几何体。后来在复现论文代码时才发现这背后的数学之美就藏在多维高斯分布的等概率密度面中。想象一下捏橡皮泥的过程——当你用手指在不同方向施加不同力度时橡皮泥会形成各种椭球形状这与协方差矩阵控制椭球变形的原理惊人地相似。概率密度函数的几何意义可能听起来抽象但我们可以用天气预报中的温度分布来类比。当气象台说高温区域呈椭圆形扩展时本质上就是在描述一个二维高斯分布的等概率线。扩展到三维空间等概率面就自然形成了椭球。这个椭球的数学表达式就藏在概率密度函数的指数部分# 三维高斯分布的概率密度函数 def gaussian_3d(x, mean, cov): n 3 # 三维空间 diff x - mean exponent -0.5 * np.dot(np.dot(diff.T, np.linalg.inv(cov)), diff) return (2*np.pi)**(-n/2) * np.linalg.det(cov)**(-0.5) * np.exp(exponent)这个函数中的关键是指数部分的二次型(x-μ)ᵀΣ⁻¹(x-μ)当它等于常数时就定义了一个椭球面。我曾在可视化这个函数时发现调整协方差矩阵Σ中的参数椭球就像被无形的手揉捏一样改变形状对角线元素控制轴向缩放非对角线元素产生旋转和倾斜特征值决定各主轴长度特征向量指示主轴方向2. 协方差矩阵的几何变形手册协方差矩阵就像是椭球的变形控制器。去年做一个三维重建项目时我们需要根据激光雷达数据调整高斯椭球形状深刻体会到Σ矩阵每个参数的实际影响。下面这个表格总结了各参数的几何效应矩阵元素数学含义几何效果可视化类比σ₁₁X轴方差控制X方向拉伸橡皮筋横向拉长σ₂₂Y轴方差控制Y方向拉伸橡皮筋纵向拉长σ₃₃Z轴方差控制Z方向拉伸橡皮筋垂直拉长σ₁₂σ₂₁XY协方差产生XY平面旋转扭转变形σ₁₃σ₃₁XZ协方差产生XZ平面旋转前后倾斜σ₂₃σ₃₂YZ协方差产生YZ平面旋转左右摇摆用代码实现这个变形过程特别直观。比如要创建一个在XY平面旋转45度的椭球import numpy as np from scipy.stats import multivariate_normal # 创建旋转的协方差矩阵 theta np.radians(45) rot_matrix np.array([[np.cos(theta), -np.sin(theta), 0], [np.sin(theta), np.cos(theta), 0], [0, 0, 1]]) diag_cov np.diag([1, 3, 0.5]) # 各轴缩放比例 cov rot_matrix diag_cov rot_matrix.T # 旋转后的协方差矩阵 # 生成椭球表面点 mean [0, 0, 0] x, y, z np.mgrid[-5:5:0.2, -5:5:0.2, -5:5:0.2] pos np.dstack((x, y, z)) gaussian multivariate_normal(mean, cov) density gaussian.pdf(pos)这个例子中我们先用旋转矩阵对对角协方差矩阵进行相似变换得到的新协方差矩阵就能描述一个旋转后的椭球。在3DGS中正是通过不断优化这些参数使高斯椭球拟合场景中的几何结构。3. 从数学公式到可视化的完整 pipeline理解理论是一回事真正把数学公式变成屏幕上可交互的3D图形又是另一回事。去年开发教学演示程序时我总结出一个可靠的椭球可视化流程参数解析读取均值向量和协方差矩阵特征分解获取椭球主轴方向和长度网格生成在单位球面上采样点坐标变换应用缩放和旋转颜色映射根据概率密度值着色关键步骤是特征分解这相当于把协方差矩阵的几何作用拆解开来def visualize_ellipsoid(mean, cov): # 特征分解 eigvals, eigvecs np.linalg.eigh(cov) # 生成单位球 u np.linspace(0, 2*np.pi, 50) v np.linspace(0, np.pi, 50) x np.outer(np.cos(u), np.sin(v)) y np.outer(np.sin(u), np.sin(v)) z np.outer(np.ones_like(u), np.cos(v)) # 应用变形 scale np.sqrt(eigvals) # 标准差√λ for i in range(len(x)): for j in range(len(x[0])): point np.array([x[i,j], y[i,j], z[i,j]]) transformed eigvecs (scale * point) mean x[i,j], y[i,j], z[i,j] transformed # 绘制 fig plt.figure() ax fig.add_subplot(111, projection3d) ax.plot_surface(x, y, z, alpha0.5) # 添加主轴箭头 for i in range(3): ax.quiver(mean[0], mean[1], mean[2], eigvecs[0,i], eigvecs[1,i], eigvecs[2,i], length2*scale[i], colorr)这个过程中最易出错的是特征向量的方向处理——有时候会得到镜像反转的结果。我的经验是始终检查右手坐标系确保三个特征向量满足叉积关系。4. 各向同性与各向异性的实战对比在实际的三维重建任务中理解各向同性与各向异性高斯的区别至关重要。记得第一次尝试用3DGS重建树木模型时各向同性高斯球体完全无法捕捉树枝的细长结构直到改用各向异性高斯才解决问题。各向同性高斯就像完美对称的肥皂泡协方差矩阵是对角阵且元素相等在任何方向看都是圆形适用于球状物体如水果、石头cov_isotropic np.array([ [1, 0, 0], [0, 1, 0], [0, 0, 1] ])各向异性高斯则像被揉捏的黏土非对角线元素可能非零不同方向有不同的拉伸程度适合表示平面、圆柱等结构cov_anisotropic np.array([ [3, 1.5, 0.2], [1.5, 1, 0.1], [0.2, 0.1, 0.5] ])在优化过程中各向异性高斯的协方差矩阵需要通过梯度下降调整。这里有个实用技巧——使用对数空间参数化确保矩阵的正定性# 参数化方法确保正定 def build_covariance(log_scales, quaternions): # 从对数尺度转换 scales torch.exp(log_scales) # 四元数转旋转矩阵 R quaternion_to_matrix(quaternions) # 构建对角缩放矩阵 S torch.diag_embed(scales) # 组合成协方差矩阵 cov R S S.transpose(1,2) R.transpose(1,2) return cov这种参数化方式在3DGS的实现中很常见既能保证数值稳定性又方便优化过程。在实际调试中我发现对初始尺度施加适当约束可以避免优化初期出现极端扁平的椭球这对重建质量至关重要。

更多文章