Wendland 紧支撑核的散点场重建方法
Wendland Functions(这篇笔记对 Wendland 核函数的数学构造有更完整的推导)
从散点到连续场
Wendland 并不是“力场重建”专用算法。它更像是一种通用工具:当你手里有一批离散采样点,想把它们变成一个连续场时,Wendland C2 紧支撑核可以作为一个很好的重建核。
问题可以抽象成这样:平面上有一组采样点
其中 $(x_i,y_i)$ 是采样位置,$v_i$ 是这个位置的观测值。我们想得到一个连续函数 $f(x,y)$,让它在没有传感器的位置也能给出合理估计。压力传感器数据只是这个问题的一个例子。换成温度站点、高程采样点、点云属性,甚至仿真里的 collocation points,本质都是“散点样本 → 连续场”。
这里有一个容易混淆的点:这件事到底是“重建”,还是只是“平滑”?我的理解是,平滑更像后期修图,它不关心背后有没有真实函数,只是让数据看起来更顺;重建则先假设背后确实存在一个连续函数,而采样点只是对它的离散观测。对于压力传感器来说,我们认为背后存在一个连续压力分布 $P(x,y)$,传感器只是采到了若干个 $P(x_i,y_i)$,所以目标是从这些离散值恢复连续压力分布的近似,而不只是让图变得柔和。
这也是为什么我更愿意把这个问题叫“散点场重建”。它不是某个物理量专属的问题,而是一类数据重建问题。
为什么会选到 Wendland
从散点构造连续场的方法很多。最朴素的是最近邻:每个位置直接拿最近采样点的值。这很诚实,但画出来会像马赛克。线性插值或三角插值更自然一些,不过它往往需要明确的拓扑结构,边界处理也麻烦。点高斯叠加看起来很直觉:每个采样点盖一个光斑,所有光斑相加。但它有一个致命问题——如果不归一化,采样点密集的地方会天然更亮。亮度来自采样密度,而不是来自真实场值。
KNN-IDW 往前走了一步:找附近 K 个点,按距离倒数加权平均。它已经是“插值”的思路了,但邻居集合会随着像素位置切换,梯度大的地方容易出现细小斑点。局部平面拟合能表达局部趋势,不过不同邻域拟合出的平面一切换,就容易出现片状接缝。全局 RBF 插值理论上更完整,但需要解线性方程组,计算成本会比较高。
所以这个场景真正需要的不是“最花哨”的方法,而是同时满足几个工程约束的方法。第一,它要归一化,否则采样点密度会污染颜色。第二,它要局部计算,否则输出图像一大,每个像素都遍历所有采样点就不现实。第三,它要视觉连续,不能有块状边界、凸包、片状拼缝。Wendland C2 恰好把这几件事放在一起:它是归一化加权平均;它是紧支撑核,超出半径就严格为零;它在支撑边界处 C² 连续,不容易产生拼缝;同时它还是正定 RBF,作为插值或近似核有数学基础。
也就是说,Wendland 不是因为“它专门适合压力场”才被选中,而是因为当前任务具备这些条件:散点采样、需要连续场、采样密度可能不均匀、要求实时、要求视觉上没有明显伪影。
从旧的高斯光斑到 Wendland 核
旧的点高斯方案很容易理解:在每个采样点位置盖一个高斯光斑,然后把所有光斑相加。
这里 $\text{value}_i$ 是第 $i$ 个采样点的值,$d_i$ 是像素到这个采样点的距离,$\sigma$ 控制光斑扩散范围。这个公式最大的问题就在求和符号上。两个采样点靠得近,光斑重叠区域就会叠得更亮。结果是:采样点密度越高的地方越亮,即便真实场值并没有更高。

Wendland 换了一个思路:不要把采样点当作“向外扩散的光源”,而是把它们当作连续场的离散采样。每个位置的值,应该由周围采样点做归一化加权平均得到。
使用的核函数是 Wendland C2:
其中
$d$ 是当前位置到采样点的距离,$R$ 是支撑半径。这个核的形状很直观:采样点中心处权重是 1,距离越远权重越小,到支撑半径边界时正好降到 0,边界外完全不参与计算。比如 $r=0.5$ 时,权重大约是 0.31,已经明显变弱。

实际重建时,用的是归一化加权平均,再乘一个边缘置信度:
前半部分解决采样密度影响亮度的问题;后半部分解决边缘覆盖不足的问题。如果一个位置附近传感器覆盖很弱,就让它自然淡出,而不是硬生生外扩。
以压力传感器数据为例,Wendland 重建出来的场会更像一张连续地形图,而不是一堆采样点的光斑叠加。

这个核函数从哪里来
Wendland 核来自 Holger Wendland 1995 年论文 Piecewise polynomial, positive definite and compactly supported radial functions of minimal degree。这篇论文的推导笔记可以在 Wendland Functions 看到。它关心的问题是:给定空间维度和光滑度,能不能构造一个紧支撑、正定、并且多项式次数尽可能低的径向基函数。
Wendland 函数族可以写成:
这里的 $d$ 表示目标空间维度。本文讨论的是二维平面场,所以取 $d=2$。$k$ 控制光滑度,$k=1$ 对应 C²。$\Gamma(k)$ 是 Gamma 函数,可以理解成阶乘的推广;当前 $k=1$,所以 $\Gamma(1)=1$,这个归一化因子不会额外改变公式。$P(t)$ 是为了保证正定性而出现的低次多项式,在当前特例中最终对应到 $4t+1$。
更适合手算理解的是递归定义:
当前特例可以从 $\psi_{2,0}(r)=(1-r)^2_+$ 出发。第一次积分是:
展开以后:
第二次积分之后,再把结果归一化到 $\varphi(0)=1$,就得到本文使用的核函数:
这个形式不是随便凑出来的。$(1-r)^4$ 让函数在边界处平滑归零,$(4r+1)$ 是积分过程中自然出现的低次多项式因子。最终它同时满足紧支撑、正定性和 C² 光滑。
工程上怎么跑得动
如果每个像素都遍历全部采样点,复杂度大约是:
图像分辨率一高,这个成本就很难接受。Wendland 的紧支撑正好能帮忙:每个采样点只影响半径 $R$ 内的区域,每个像素也只需要查附近的采样点。
实际实现时,可以先把采样点按空间位置放进桶里。计算某个像素时,只查它所在桶和周围相邻桶。这样,计算从“全局查询”变成“局部查询”,高分辨率场图也能实时渲染。
整个流程可以概括成几步:先把物理坐标映射到输出图像坐标;然后按采样点位置建立空间桶;对每个像素查找邻域采样点并计算 Wendland 权重;再做归一化加权平均;边缘覆盖不足时做置信度衰减;最后只用一个很轻的 Gaussian 做像素级去噪。
实际使用中主要有两个参数。query_radius_mm 控制单个采样点的影响范围;这个值越大,场越连贯,但细节也更容易被抹平。post_gaussian_sigma 只用于最后的像素级去噪,不负责生成主要形状。
压力传感器数据上的对比
为了看这个选择是否真的有意义,我把同一组压力传感器数据分别用几种方法重建了一遍。这个比对不是为了证明 Wendland 在所有场景下绝对最优,而是为了说明:在“需要归一化、实时、无拼缝”的压力传感器可视化场景里,它确实更稳。
最近邻最诚实,但块状最明显。每个像素直接取最近采样点的值,几乎不做插值,适合作为 debug 基准,但不适合最终展示。

点高斯叠加直觉简单,但密度伪影最明显。采样点密集区域会天然更亮,容易把“采样密度”误显示成“场值更高”。

KNN-IDW 已经做了归一化,所以比点高斯干净很多。但 KNN 集合会随着像素位置变化,压力梯度大的区域仍然可能出现细小斑点。

加权平面拟合能表达局部趋势,但不同邻域拟合出的平面发生切换时,容易出现片状接缝。

Wendland C2 的优势在于归一化、紧支撑、C² 连续同时成立。它没有点高斯的密度伪影,也没有加权平面那种明显拼接线。

为了量化伪影,我保留了一个指标表。最大值主要用来看叠加效应是否制造了不应有的高值;局部峰数量则反映画面有多碎。
| 方法 | 最大值 | 局部峰数量 (>30% max) |
|---|---|---|
| Nearest(基准) | 1771.7 | 66072 |
| Point Gaussian(旧) | 2508.7 | 99 |
| KNN-IDW k=6 | 1764.0 | 53 |
| Weighted Plane k=8 | 1754.1 | 2054 |
| Wendland R=60mm | 1514.7 | 4 |
点高斯的最大值明显偏高,说明叠加效应把采样密度错误地转成了亮度;加权平面局部峰数量很高,对应片状接缝;Wendland 的局部峰最少,说明它有效抑制了点状和片状伪影。
把五种方法放在一起看,差异会更直观:

局部放大后,点高斯的凸包、加权平面的接缝、Wendland 的自然过渡会更明显:
