Code: Select all
/*
Sigmoidal with inflexion point moved to b and "slope constant" set to a.
*/
#if 0
#define Sigmoidal(a,b,x) ( 1.0/(1.0+exp((a)*((b)-(x)))) )
#else
#define Sigmoidal(a,b,x) ( \
((a)*((x)-(b)))/sqrt(1.0+((a)*((x)-(b)))*((a)*((x)-(b)))) )
#endif
/*
Scaled sigmoidal formula: (1/(1+exp(a*(b-x))) - 1/(1+exp(a*b)))
/
(1/(1+exp(a*(b-1))) - 1/(1+exp(a*b))).
See http://osdir.com/ml/video.image-magick.devel/2005-04/msg00006.html and
http://www.cs.dartmouth.edu/farid/downloads/tutorials/fip.pdf.
*/
#define ScaledSigmoidal(a,b,x) ( \
(Sigmoidal((a),(b),(x))-Sigmoidal((a),(b),0.0)) / \
(Sigmoidal((a),(b),1.0)-Sigmoidal((a),(b),0.0)) )
#if 0
#define InverseScaledSigmoidal(a,b,x) ( \
(b) - log( -1.0+1.0/((Sigmoidal((a),(b),1.0)-Sigmoidal((a),(b),0.0))*(x)+ \
Sigmoidal((a),(b),0.0)) ) / (a) )
/*
The limit of ScaledSigmoidal as a->0 is the identity, but a=0 gives a
division by zero. This is fixed below by hardwiring the identity when a is
small. This would appear to be safe because the series expansion of the
sigmoidal function around x=b is 1/2-a*(b-x)/4+... so that s(1)-s(0) is
about a/4.
*/
#else
#define InverseScaling(a,b,x) ( \
((Sigmoidal((a),(b),1.0)-Sigmoidal((a),(b),0.0))*(x)+ \
Sigmoidal((a),(b),0.0)) )
#define InverseScaledSigmoidal(a,b,x) ( \
(b) + \
InverseScaling((a),(b),(x)) / \
( (a)*sqrt(1.0-InverseScaling((a),(b),(x))*InverseScaling((a),(b),(x))) ) )
#endif
With an equal amount of "artifacts", it kinda looks like the one that's already in IM (with the standard "exponential" sigmoid function") is better at suppressing halos. So, my dirty back of the envelope was not really off. The new one is generally sharper, though. But sharpness is not the be-all and end-all (in my book, at least).