MagickPrivate double GenerateDifferentialNoise(RandomInfo *random_info,
const Quantum pixel,const NoiseType noise_type,const double attenuate)
{
-#define NoiseEpsilon (attenuate*1.0e-5)
-#define SigmaUniform (attenuate*4.0)
-#define SigmaGaussian (attenuate*4.0)
-#define SigmaImpulse (attenuate*0.10)
-#define SigmaLaplacian (attenuate*10.0)
-#define SigmaMultiplicativeGaussian (attenuate*1.0)
-#define SigmaPoisson (attenuate*0.05)
-#define TauGaussian (attenuate*20.0)
+#define SigmaUniform (attenuate*0.015625)
+#define SigmaGaussian (attenuate*0.015625)
+#define SigmaImpulse (attenuate*0.1)
+#define SigmaLaplacian (attenuate*0.0390625)
+#define SigmaMultiplicativeGaussian (attenuate*0.5)
+#define SigmaPoisson (attenuate*0.05/0.0001953125)
+#define TauGaussian (attenuate*0.078125)
double
alpha,
sigma;
alpha=GetPseudoRandomValue(random_info);
- alpha=1.0;
switch (noise_type)
{
case UniformNoise:
default:
{
- noise=(double) pixel+QuantumRange*SigmaUniform*(alpha-0.5)/255.0;
+ noise=(double) pixel+QuantumRange*SigmaUniform*(alpha-0.5);
break;
}
case GaussianNoise:
gamma=sqrt(-2.0*log(alpha));
sigma=gamma*cos((double) (2.0*MagickPI*beta));
tau=gamma*sin((double) (2.0*MagickPI*beta));
- noise=(double) pixel+sqrt((double) pixel)*SigmaGaussian*sigma/255.0+
- QuantumRange*TauGaussian*tau/255.0;
- break;
- }
- case MultiplicativeGaussianNoise:
- {
- sigma=1.0;
- if (alpha > NoiseEpsilon)
- sigma=sqrt(-2.0*log(alpha));
- beta=GetPseudoRandomValue(random_info);
- noise=(double) pixel+pixel*SigmaMultiplicativeGaussian*sigma*
- cos((double) (2.0*MagickPI*beta))/2.0/255.0;
+ noise=(double) pixel+sqrt((double) pixel)*SigmaGaussian*sigma+
+ QuantumRange*TauGaussian*tau;
break;
}
case ImpulseNoise:
{
if (alpha <= 0.5)
{
- if (alpha <= NoiseEpsilon)
+ if (alpha <= MagickEpsilon)
noise=(double) pixel-(double) QuantumRange;
else
noise=(double) pixel+QuantumRange*SigmaLaplacian*
- log(2.0*alpha)/255.0+0.5;
+ log(2.0*alpha)+0.5;
break;
}
beta=1.0-alpha;
- if (beta <= (0.5*NoiseEpsilon))
+ if (beta <= (0.5*MagickEpsilon))
noise=(double) (pixel+QuantumRange);
else
- noise=(double) pixel-QuantumRange*SigmaLaplacian*log(2.0*beta)/255.0+
- 0.5;
+ noise=(double) pixel-QuantumRange*SigmaLaplacian*log(2.0*beta)+0.5;
+ break;
+ }
+ case MultiplicativeGaussianNoise:
+ {
+ sigma=1.0;
+ if (alpha > MagickEpsilon)
+ sigma=sqrt(-2.0*log(alpha));
+ beta=GetPseudoRandomValue(random_info);
+ noise=(double) pixel+pixel*SigmaMultiplicativeGaussian*sigma*
+ cos((double) (2.0*MagickPI*beta))/2.0;
break;
}
case PoissonNoise:
register ssize_t
i;
- poisson=exp(-SigmaPoisson*255.0*QuantumScale*pixel);
+ poisson=exp(-SigmaPoisson*QuantumScale*pixel);
for (i=0; alpha > poisson; i++)
{
beta=GetPseudoRandomValue(random_info);
alpha*=beta;
}
- noise=(double) QuantumRange*i/SigmaPoisson/255.0;
+ noise=(double) QuantumRange*i/SigmaPoisson;
break;
}
case RandomNoise: