三维数据的高斯模糊

时间:2013-05-17 23:46:14

标签: c++ algorithm math 3d

我有一个程序,我在其中查询半径为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数据的最佳方式?是否有更好/更快/更可靠的方法?

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:7)

您的提案大多是合理的,但可能效率不高。 (另外,为什么距离平方而不仅仅是距离?)

通过执行以下操作,您可以更有效地执行3D高斯:

1)用1D高斯核将内核分成3个1维通道。这在Gaussian blur wikipedia page

中有解释

2)您可以通过连续多次执行box-blur近似高斯内核,并且可以使用summed area tables

来实现

3)你也可以使用fast fourier transform并通过将图像乘以frequency space中的内核来进行卷积。