]>
Commit | Line | Data |
---|---|---|
92bda632 | 1 | #include "imager.h" |
02d1d628 AMH |
2 | |
3 | /* | |
4 | General convolution for 2d decoupled filters | |
5 | end effects are acounted for by increasing | |
6 | scaling the result with the sum of used coefficients | |
7 | ||
8 | coeff: (float array) coefficients for filter | |
9 | len: length of filter.. number of coefficients | |
10 | note that this has to be an odd number | |
11 | (since the filter is even); | |
12 | */ | |
13 | ||
14 | void | |
97ac0a96 | 15 | i_conv(i_img *im,const float *coeff,int len) { |
02d1d628 AMH |
16 | int i,l,c,ch,center; |
17 | float pc; | |
18 | i_color rcolor; | |
19 | float res[11]; | |
20 | i_img timg; | |
21 | ||
a73aeb5f | 22 | mm_log((1,"i_conv(im %p, coeff %p, len %d)\n",im,coeff,len)); |
02d1d628 AMH |
23 | |
24 | i_img_empty_ch(&timg,im->xsize,im->ysize,im->channels); | |
25 | ||
26 | center=(len-1)/2; | |
27 | ||
6e473a59 TC |
28 | /* don't move the calculation of pc up here, it depends on which pixels |
29 | are readable */ | |
02d1d628 AMH |
30 | for(l=0;l<im->ysize;l++) { |
31 | for(i=0;i<im->xsize;i++) { | |
6e473a59 | 32 | pc=0.0; |
02d1d628 AMH |
33 | for(ch=0;ch<im->channels;ch++) res[ch]=0; |
34 | for(c=0;c<len;c++) | |
35 | if (i_gpix(im,i+c-center,l,&rcolor)!=-1) { | |
0b76fec8 TC |
36 | for(ch=0;ch<im->channels;ch++) |
37 | res[ch]+=(float)(rcolor.channel[ch])*coeff[c]; | |
6e473a59 | 38 | pc+=coeff[c]; |
02d1d628 | 39 | } |
0b76fec8 TC |
40 | for(ch=0;ch<im->channels;ch++) { |
41 | double temp = res[ch]/pc; | |
42 | rcolor.channel[ch] = | |
43 | temp < 0 ? 0 : temp > 255 ? 255 : (unsigned char)temp; | |
44 | } | |
02d1d628 AMH |
45 | i_ppix(&timg,i,l,&rcolor); |
46 | } | |
47 | } | |
48 | ||
49 | for(l=0;l<im->xsize;l++) | |
50 | { | |
51 | for(i=0;i<im->ysize;i++) | |
52 | { | |
6e473a59 | 53 | pc=0.0; |
02d1d628 AMH |
54 | for(ch=0;ch<im->channels;ch++) res[ch]=0; |
55 | for(c=0;c<len;c++) | |
56 | if (i_gpix(&timg,l,i+c-center,&rcolor)!=-1) | |
57 | { | |
0b76fec8 TC |
58 | for(ch=0;ch<im->channels;ch++) |
59 | res[ch]+=(float)(rcolor.channel[ch])*coeff[c]; | |
6e473a59 | 60 | pc+=coeff[c]; |
02d1d628 | 61 | } |
0b76fec8 TC |
62 | for(ch=0;ch<im->channels;ch++) { |
63 | double temp = res[ch]/pc; | |
64 | rcolor.channel[ch]= | |
65 | temp < 0 ? 0 : temp > 255 ? 255 : (unsigned char)temp; | |
66 | } | |
02d1d628 AMH |
67 | i_ppix(im,l,i,&rcolor); |
68 | } | |
69 | } | |
a73aeb5f | 70 | i_img_exorcise(&timg); |
02d1d628 AMH |
71 | } |
72 | ||
73 | ||
74 | ||
75 | ||
76 | ||
77 | ||
78 | ||
79 | ||
80 |