我有一个程序,我在其中查询半径为R的球体S中包含的所有点。这些点实际上是在3D规则网格的顶点上对齐的3D点,但我不认为这个细节与这个问题。查找体积(球体)的中心可以是3D步调的任何位置。
积分持有一些数据(比如真实的)。我的问题是,如何使用3D滤波器(例如高斯滤波器)对球体中包含的点所保持的数据进行插值/滤波。我的理解是你需要做这样的事情(伪代码):
interp_data = 0;
for (each point contained in the lookup sphere S of radius R)
// compute square distance from point location to sphere centre
dist2 = distance2(sphere_center, curr_point_loc);
// compute gaussian weight
w = exp(-100 * dist2);
sumWeight += w;
interp_data += curr_point_data * w;
interp_data /= sumWeight;
是否正确。我见过一些使用类似技术的代码。我理解exp函数的值100以某种方式与所谓的标准正态偏差有关。值100在我看到的源代码中被硬编码,但我认为这应该以某种方式与球体的半径相关联?当dist2 = R ^ 2时,高斯滤波器的权重应该下降到0。
如果有人能够对此有所了解,那就太棒了。
它是否真的是过滤3D数据的最佳方式?是否有更好/更快/更可靠的方法?
非常感谢你的帮助。
答案 0 :(得分:7)
您的提案大多是合理的,但可能效率不高。 (另外,为什么距离平方而不仅仅是距离?)
通过执行以下操作,您可以更有效地执行3D高斯:
1)用1D高斯核将内核分成3个1维通道。这在Gaussian blur wikipedia page
中有解释2)您可以通过连续多次执行box-blur近似高斯内核,并且可以使用summed area tables
来实现3)你也可以使用fast fourier transform并通过将图像乘以frequency space中的内核来进行卷积。