我在 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 跨度。
最佳答案
此处的计算:
F = (double) ((1/1)*exp(-sigmaX*(pow((step++)/1, 2.0)))) ;
没有反射(reflect)您展示的高斯公式。应该是这样的:
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(或其他值)以获得您想要的效果。
关于ios - 高斯方程的缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16293507/