2

我在 iOS 应用程序中使用高斯方程来获得特定的照片效果。

我用:

   double sigmaX = ...; //some value here

   for(int i=0;i<height;i++) 
    {
       double F = 0;
       double step = -(pos)*width/20;

    /*height,width,pos - all predefined, no problem there*/

     for(int j=0;j<4*width;j+=4)
     {

      F = (double) ((1/1)*exp(-sigmaX*(pow((step++)/1, 2.0)))) ;
      //do some operation here...

      }
    }

F 的值用于确定在其他地方用完的特定强度。

到目前为止一切顺利.... F 是预期的典型钟形曲线。

但是,问题是,我想根据用户输入来缩放这条曲线的标准偏差。

例如,在下图中,我想将曲线从绿线移到红线(蓝色可能是中间线),希望以线性步骤:

高斯曲线的标准差方差

现在,给定以下标准符号:

高斯曲线方程

并将其与我在代码中实现它的方式进行比较,我想到了改变 1/sqrt(sigmaX) 以改变比例/SD。我尝试以线性步骤增加 1/sqrt(sigmaX) (以获得线性增量)或 x^n 以获得 SD 中 n 增量的幂,但这些都不起作用。

我有点坚持这个概念。

您能否告诉我如何按预定义的比率缩放标准偏差,即我可能希望它是原始 SD 的 1.34 或 3.78 倍,它会相应地将 +3sigma 扩展到 -3sigma 跨度。

4

2 回答 2

1

您在这里的计算:

F = (double) ((1/1)*exp(-sigmaX*(pow((step++)/1, 2.0)))) ;

没有反映您显示的高斯公式。它应该是这样的:

double dSigma = 1.0;
static const double dRootTwoPi = sqrt(2.0 * M_PI);

F = (1.0 / (dSigma * dRootTwoPi)) * exp(-0.5 * pow(step++ / dSigma, 2.0));

然后你可以dSigma从 1.0 变化到 3.0(或其他)以获得你想要的效果。

于 2013-04-30T06:44:07.273 回答
1

感谢罗杰罗兰的帮助......我终于让它工作了:

将高斯函数更改为:

   sigmaX*=scaling;
   F = (double) ((scaling / (sigmaX))*exp(-0.0005*(powf((step++/sigmaX), 2.0)))) ;

事实上,我之前所做的并不完全是高斯的。根据缩放参数,这可以正常工作并且可以很好地缩放。

再次感谢。

于 2013-04-30T09:25:55.677 回答