将1D高斯模糊应用于数据集

时间:2012-08-15 04:10:42

标签: algorithm math shader blur gaussian

我有一些数据集,其中每个对象都有ValuePrice。我想使用他们的Price将高斯模糊应用到他们的Value。由于我的数据只有1个组件可用于模糊,我试图应用1D高斯模糊。

我的代码执行此操作:

totalPrice = 0;
totalValue = 0;
for each object.OtherObjectsWithinPriceRange()
    totalPrice += price;
    totalValue += Math.Exp(-value*value);

price = totalPrice/totalValue;

我看到了很好的结果,但我在网上看到的一维高斯模糊算法似乎使用了偏差,sigma,PI等。我需要它们,还是它们严格用于2D高斯模糊?它们将这些1D模糊通道组合为垂直和水平,因此它们仍然是2D。

此外,我将结果显示为颜色,但白色区域略大于1(白色)。我怎样才能将其正常化?我应该将值钳位到1吗?这就是为什么我想知道我是否使用了正确的公式。

1 个答案:

答案 0 :(得分:1)

您的代码会应用某种模糊效果,但绝对不是高斯模糊的。高斯模糊看起来像

kindaSigma = 1;
priceBlurred = object.price;
for each object.OtherObjectsWithinPriceRange()
   priceBlurred += price*Math.Exp(-value*value/kindaSigma/kindaSigma);

并且只假设valueobject和价格范围内的其他对象之间的“距离”成比例,无论你的应用程序中的这个“距离”是什么意思。

回答你的问题。

  1. 2D高斯模糊完全等同于垂直和水平1D高斯模糊的组合。这就是2D高斯模糊通常在实践中实现的方式。

  2. 您不需要任何PI或sigma作为高斯的乘法因子 - 这些只具有缩放图像的效果,可以安全地忽略。

  3. 指数下的sigma(标准偏差)对结果有重大影响,但我不可能告诉你是否需要它。这取决于您的应用程序。 想要更多模糊:在上面的代码段中使用更大的kindaSigma。 想要减少模糊:使用较小的kindaSigma。 当kindaSigma太小时,你根本不会注意到任何模糊。当kindaSigma太大时,高斯模糊有效地将自身转换为移动平均滤波器。 玩它并选择你需要的东西。

  4. 我不确定我理解你的规范化问题。在图像处理中,通常将每个颜色分量(R,G,B)存储为unsigned char。因此黑色由(0,0,0)表示,白色由(255,255,255)表示。当然,您可以自由决定选择不同的演示文稿形式并将白色视为1.但请记住,对于使用标准8位演示文稿的可视化软件包,值1表示几乎为黑色。因此,您可能需要在显示之前对图像进行操作和重新规范化。