我有一些数据集,其中每个对象都有Value
和Price
。我想使用他们的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吗?这就是为什么我想知道我是否使用了正确的公式。
答案 0 :(得分:1)
您的代码会应用某种模糊效果,但绝对不是高斯模糊的。高斯模糊看起来像
kindaSigma = 1;
priceBlurred = object.price;
for each object.OtherObjectsWithinPriceRange()
priceBlurred += price*Math.Exp(-value*value/kindaSigma/kindaSigma);
并且只假设value
与object
和价格范围内的其他对象之间的“距离”成比例,无论你的应用程序中的这个“距离”是什么意思。
回答你的问题。
2D高斯模糊完全等同于垂直和水平1D高斯模糊的组合。这就是2D高斯模糊通常在实践中实现的方式。
您不需要任何PI或sigma作为高斯的乘法因子 - 这些只具有缩放图像的效果,可以安全地忽略。
指数下的sigma(标准偏差)对结果有重大影响,但我不可能告诉你是否需要它。这取决于您的应用程序。
想要更多模糊:在上面的代码段中使用更大的kindaSigma
。
想要减少模糊:使用较小的kindaSigma
。
当kindaSigma太小时,你根本不会注意到任何模糊。当kindaSigma太大时,高斯模糊有效地将自身转换为移动平均滤波器。
玩它并选择你需要的东西。
我不确定我理解你的规范化问题。在图像处理中,通常将每个颜色分量(R,G,B)存储为unsigned char
。因此黑色由(0,0,0)表示,白色由(255,255,255)表示。当然,您可以自由决定选择不同的演示文稿形式并将白色视为1.但请记住,对于使用标准8位演示文稿的可视化软件包,值1表示几乎为黑色。因此,您可能需要在显示之前对图像进行操作和重新规范化。