root/snippet/gaussian_blur/gaussian.c

Revision 84, 1.3 KB (checked in by aqua, 2 years ago)

normalizing gaussian mask to avoid losing energy

Line 
1#include <math.h>
2
3#include <stdlib.h>
4
5#include "image.h"
6#include "gaussian.h"
7
8static void build_mask( double* mask, int* n, int d ){
9       
10        int i;
11        double var, div, sum = 0.0;
12       
13        div = pow(2*M_PI*d*d, 0.5); 
14       
15        if( d <= 0 ){
16                mask[0] = 1.0;
17                *n = 1;
18
19                return;
20        }
21       
22        for( i = 0 ; i < MASK_LEN ; i++ ){     
23                var = pow(M_E, (i*i)/(-2.0*d*d)) / div;
24                if( var < 0.001 )
25                        break;
26
27                mask[i] = var;
28
29                if( i == 0 )
30                        sum += var;
31                else 
32                        sum += var + var;
33        }
34        *n = i;
35
36        for( i = 0 ; i < *n ; i++ )
37                mask[i] /= sum;
38       
39}
40
41void gaussian_blur( uchar* dst, uchar* src, int sigma, int w, int h ){
42       
43        int i, j, k, n;
44
45        uchar* tmp;
46        double pixel;
47
48        double mask[MASK_LEN];
49       
50        build_mask( mask, &n, sigma );
51       
52        tmp = (uchar*)malloc(sizeof(uchar)*w*h);       
53        for( j = 0 ; j < h ; j++ ){
54                for( i = 0 ; i < w ; i++ ){
55                        pixel = mask[0] * get_pixel( src, i, j, w, h ); 
56                        for( k = 1 ; k < n ; k++ ){
57                                pixel += mask[k] * get_pixel( src, i-k, j, w, h ); 
58                                pixel += mask[k] * get_pixel( src, i+k, j, w, h ); 
59                        }
60                        tmp[j*w+i] = clip(pixel);
61                }
62        }
63       
64        for( j = 0 ; j < h ; j++ ){
65                for( i = 0 ; i < w ; i++ ){
66                        pixel = mask[0] * get_pixel( tmp, i, j, w, h ); 
67                        for( k = 1 ; k < n ; k++ ){
68                                pixel += mask[k] * get_pixel( tmp, i, j-k, w, h ); 
69                                pixel += mask[k] * get_pixel( tmp, i, j+k, w, h ); 
70                        }
71                        dst[j*w+i] = clip(pixel);
72                }
73        }
74
75        free(tmp);
76
77}
78
Note: See TracBrowser for help on using the browser.