高斯方程的尺度

时间:2013-04-30 06:22:43

标签: ios algorithm image-processing gaussian

我在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是预期的典型钟形曲线。

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

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

Variance of SD of Gaussian Curve

现在,给出标准符号:

gaussian curve equation

并将其与我在代码中实现它的方式进行比较,我有了改变1 / sqrt(sigmaX)以改变比例/ SD的想法。我尝试以线性步长(以获得线性增量)递增1 / sqrt(sigmaX)或通过x ^ n递增以SD为单位的n增量功率,但这些都不起作用。

我对这个概念有点困惑。

请告诉我如何按照预定义的比例缩放标准偏差,即我可能希望它比原始SD的1.34或3.78倍,并相应地将+ 3sigma放大到-3sigma跨度。

2 个答案:

答案 0 :(得分: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(或其他)以获得你想要的效果。

答案 1 :(得分:1)

感谢Roger Rowland的帮助......我终于得到了这个工作:

将高斯函数更改为:

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

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

再次感谢。