- start of external Imager API access:
[imager.git] / gaussian.c
1 #include "imager.h"
2
3 static float
4 gauss(int x,float std) {
5   return 1.0/(sqrt(2.0*PI)*std)*exp(-(float)(x)*(float)(x)/(2*std*std));
6 }
7
8 /* Counters are as follows
9  l:  lines
10  i:  columns
11  c:  filter coeffs
12  ch: channels
13  pc: coeff equalization
14 */
15
16
17
18 void
19 i_gaussian(i_img *im,float stdev) {
20   int i,l,c,ch;
21   float pc;
22   float coeff[21];
23   i_color rcolor;
24   float res[11];
25   i_img timg;
26
27   mm_log((1,"i_gaussian(im %p, stdev %.2f)\n",im,stdev));
28   
29   i_img_empty_ch(&timg,im->xsize,im->ysize,im->channels);
30               
31   for(i=0;i<11;i++) coeff[10+i]=coeff[10-i]=gauss(i,stdev);
32   pc=0;
33   for(i=0;i<21;i++) pc+=coeff[i];
34   for(i=0;i<21;i++) coeff[i]/=pc;
35
36
37   for(l=0;l<im->ysize;l++) {
38     for(i=0;i<im->xsize;i++) {
39       pc=0.0;
40       for(ch=0;ch<im->channels;ch++) res[ch]=0; 
41       for(c=0;c<21;c++)
42         if (i_gpix(im,i+c-10,l,&rcolor)!=-1) {
43           for(ch=0;ch<im->channels;ch++) res[ch]+=(float)(rcolor.channel[ch])*coeff[c];
44           pc+=coeff[c];
45         }
46       for(ch=0;ch<im->channels;ch++) rcolor.channel[ch]=(unsigned char)(((res[ch]/(float)(pc)>255.0)?255.0:res[ch]/(float)(pc)));
47       i_ppix(&timg,i,l,&rcolor);
48     }
49   }
50   
51   for(l=0;l<im->xsize;l++) {
52     for(i=0;i<im->ysize;i++) {
53       pc=0.0;
54       for(ch=0;ch<im->channels;ch++) res[ch]=0; 
55       for(c=0;c<21;c++)
56         if (i_gpix(&timg,l,i+c-10,&rcolor)!=-1) {
57           for(ch=0;ch<im->channels;ch++) res[ch]+=(float)(rcolor.channel[ch])*coeff[c];
58           pc+=coeff[c];
59         }
60       for(ch=0;ch<im->channels;ch++) rcolor.channel[ch]=(unsigned char)(((res[ch]/(float)(pc)>255.0)?255.0:res[ch]/(float)(pc)));
61       i_ppix(im,l,i,&rcolor);
62     }
63   }
64   i_img_exorcise(&timg);
65 }
66
67
68
69
70
71
72