Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 对数据集应用一维高斯模糊_Algorithm_Math_Shader_Blur_Gaussian - Fatal编程技术网

Algorithm 对数据集应用一维高斯模糊

Algorithm 对数据集应用一维高斯模糊,algorithm,math,shader,blur,gaussian,Algorithm,Math,Shader,Blur,Gaussian,我有一些数据集,其中每个对象都有一个值和价格。我想使用它们的值将高斯模糊应用于它们的价格。因为我的数据只有一个组件用于模糊,所以我尝试应用1D高斯模糊 我的代码执行以下操作: totalPrice = 0; totalValue = 0; for each object.OtherObjectsWithinPriceRange() totalPrice += price; totalValue += Math.Exp(-value*value); price = totalPr

我有一些数据集,其中每个对象都有一个
价格
。我想使用它们的
值将高斯模糊应用于它们的
价格
。因为我的数据只有一个组件用于模糊,所以我尝试应用1D高斯模糊

我的代码执行以下操作:

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

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


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

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

kindaSigma = 1;
priceBlurred = object.price;
for each object.OtherObjectsWithinPriceRange()
   priceBlurred += price*Math.Exp(-value*value/kindaSigma/kindaSigma);
并且仅假设
对象
和价格范围内的其他对象之间的“距离”成比例,无论应用程序中的“距离”是什么意思

回答你的问题

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

  • 你不需要任何π或sigmas作为高斯函数的乘法因子——它们只具有缩放图像的效果,可以安全地忽略

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

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


  • 你在做什么?你用什么语言?你想展示什么吗?你到底在展示什么?你看到的“好结果”是什么?
    exp(-value,value)
    应该是什么意思?我也许可以帮你,但我搞不清楚你到底想做什么。请说得更清楚些,只是一个实验。把这些物体想象成“商品”,我试图模糊它们的“价格”值,就像图像的RGB值一样,除了这是一个浮动。语言是C#,但任何语言都可以。什么是
    exp(-value,value)
    ?exp不应该只接受一个arg吗?我看不出你的例子有什么模糊之处。模糊是卷积,每个输出像素都应该是周围像素的组合。抱歉,现在修复了它。循环基本上是对价格范围内的对象进行循环。因此,如果价格范围为100,那么对于每个对象,它将循环通过具有相同价格范围的所有其他对象-/+100。谢谢。实际上,我在这里使用了类似的东西:(1.0/(Math.Sqrt(2.0*Math.PI)*标准偏差)*Math.Exp(-Math.Pow(CDbl(Distance),2.0)/(2.0*Math.Pow(standarddiation,2.0))),但这并没有给我足够好的模糊度,而且图像明显比原始图像暗,比如亮度的一半。我也不知道西格玛应该使用什么值。我想我可以把它作为一个参数,但在photoshop中,例如,它们只有半径,没有sigma,所以我认为这个值应该是自动的。Joan,如果图像太暗,你总是可以重新缩放图像-最好先在Math.Exp()前面去掉乘法因子。增加标准偏差以获得更多模糊。在不熟悉您的应用程序的情况下,我可以说,人们通常根本不需要高斯模糊。您可以简单地使用加权平均值,如
    fuzzed[n]=(original[n]+k*(original[n-1]+original[n+1])/2
    ,这将产生足够满足您需要的模糊效果,当然计算效率更高,特别是当
    k
    是2的反比时。谢谢Arik,
    k
    这里的重量是多少?是的。对于“更平滑”的模糊,您还可以在原始[n-2]和原始[n+2]中进行称重,以此类推。当然,随着重量的减少。