5 gauss(int x, double std) {
6 return 1.0/(sqrt(2.0*PI)*std)*exp(-(double)(x)*(float)(x)/(2*std*std));
9 /* Counters are as follows
14 pc: coeff equalization
20 i_gaussian(i_img *im, double stddev) {
24 double res[MAXCHANNELS];
28 mm_log((1,"i_gaussian(im %p, stdev %.2f)\n",im,stddev));
32 i_push_error(0, "stddev must be positive");
35 /* totally silly cutoff */
40 timg = i_sametype(im, im->xsize, im->ysize);
43 radius = ceil(2 * stddev);
45 radius = ceil(3 * stddev);
47 diameter = 1 + radius * 2;
49 coeff = mymalloc(sizeof(double) * diameter);
51 for(i=0;i <= radius;i++)
52 coeff[radius + i]=coeff[radius - i]=gauss(i, stddev);
54 for(i=0; i < diameter; i++)
56 for(i=0;i < diameter;i++)
62 for(l=0;l<im->ysize;l++) {
63 for(i=0;i<im->xsize;i++) {
65 for(ch=0;ch<im->channels;ch++)
67 for(c = 0;c < diameter; c++)
68 if (IM_GPIX(im,i+c-radius,l,&rcolor)!=-1) {
69 for(ch=0;ch<im->channels;ch++)
70 res[ch]+= rcolor.channel[ch] * coeff[c];
73 for(ch=0;ch<im->channels;ch++) {
74 double value = res[ch] / pc;
75 rcolor.channel[ch] = value > IM_SAMPLE_MAX ? IM_SAMPLE_MAX : value;
77 IM_PPIX(timg,i,l,&rcolor);
81 for(l=0;l<im->xsize;l++) {
82 for(i=0;i<im->ysize;i++) {
84 for(ch=0; ch<im->channels; ch++)
86 for(c=0; c < diameter; c++)
87 if (IM_GPIX(timg,l,i+c-radius,&rcolor)!=-1) {
88 for(ch=0;ch<im->channels;ch++)
89 res[ch]+= rcolor.channel[ch] * coeff[c];
92 for(ch=0;ch<im->channels;ch++) {
93 double value = res[ch]/pc;
94 rcolor.channel[ch] = value > IM_SAMPLE_MAX ? IM_SAMPLE_MAX : value;
96 IM_PPIX(im,l,i,&rcolor);