2012-08-15 88 views
2

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

我的代码做到这一点:

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

price = totalPrice/totalValue; 

我看到了良好的效果,但一维高斯模糊算法,我在网上看到的似乎使用偏差,西格玛,PI,等我需要他们,或者他们严格二维高斯模糊?它们将这些1D模糊通道组合为垂直和水平,因此它们仍然占据2D。

此外,我将结果显示为颜色,但白色区域是稍微超过1(白色)。我如何正常化这个?我应该把这些值限制为1吗?这就是为什么我想知道我是否正在使用正确的公式。

+0

你在做什么?你使用什么语言?你想展示一些东西吗?你究竟在展示什么?你看到了什么“好结果”?什么是exp(-value,value)'应该是什么意思?我可能可以帮助你,但我无法弄清楚你究竟想要做什么。请更加明确。 – 2012-08-15 04:18:52

+0

只是一个实验。将这些对象想象为“商品”,我试图模糊它们的“价格”值,就像图像的RGB值一样,除了这是一个浮点数。语言是C#,但任何语言都可以。 – 2012-08-15 04:24:22

+0

什么是'exp(-value,value)'?不应该exp只采取一个arg?我的例子中看不到模糊。模糊是卷积,每个输出像素应该是周围像素的某种组合。 – 2012-08-15 04:29:59

回答

1

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

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

,只有假设value是成正比的价格范围内的object和其他对象,无论这个“距离”在你的应用手段之间的“距离”。

给你的问题。

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

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

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

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

+0

谢谢。我实际上在这里使用了这样的东西:(1.0 /(Math.Sqrt(2.0 * Math.PI)* StandardDeviation)* Math.Exp(-Math.Pow(CDbl(Distance),2.0)/(2.0 * Math.Pow (StandardDeviation,2.0))))http://theinstructionlimit.com/gaussian-blur-experiments,但是这并没有给我足够的模糊,图像比原来更明显,比如一半的亮度。我也不知道西格玛有什么价值。我认为我可以将它作为一个参数,但在Photoshop中,例如他们只有半径,没有西格马,所以认为这个值应该是自动的。 – 2012-08-15 09:56:34

+0

琼,你可以随时调整图像,如果它太暗 - 开始的好处是摆脱Math.Exp()前面的乘法因子。增加StandardDeviation以获得更多模糊。如果不熟悉您的应用程序,我可以说通常不需要高斯模糊。你可以简单地使用加权平均,比如'blur [n] =(original [n] + k *(original [n-1] + original [n + 1]))/ 2',这会产生模糊效果,可能已经足够满足您的需求,当然更具有计算效率,特别是当'k'是2的反幂时。 – 2012-08-15 10:10:46

+0

谢谢Arik,这里的重量是多少? – 2012-08-15 10:13:47