2

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

我的代码是这样做的:

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

price = totalPrice/totalValue;

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

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

4

1 回答 1

1

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

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

并且仅假设它与价格范围内的其他对象value之间的“距离”成正比,无论您的应用程序中的“距离”意味着什么。object

对你的问题。

  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 表示几乎是黑色。因此,您可能需要在显示之前对图像进行操作和重新规范化。

于 2012-08-15T09:06:24.290 回答