1 #include "algebra.h"
2 
3 #include <glib.h>
4 #include <math.h>
5 
gaussian_kernel(int width,double sigma)6 struct gaussian_kernel *gaussian_kernel(int width, double sigma) {
7   double sum = 0;
8   gint size = width * width + 1;
9   double *kernel = g_new0(double, size);
10   struct gaussian_kernel *gaussian = g_new(struct gaussian_kernel, 1);
11   for (gint y = 0; y < width; y++) {
12     for (gint x = 0; x < width; x++) {
13       double j = y - width;
14       double i = x - width;
15       double cell = ((1.0 / (2.0 * G_PI * sigma)) *
16                      exp((-(i * i + j * j)) / (2.0 * sigma * sigma))) *
17                     0xff;
18       kernel[y * width + x] = cell;
19       sum += cell;
20     }
21   }
22 
23   gaussian->kernel = kernel;
24   gaussian->size = size;
25   gaussian->sigma = sigma;
26   gaussian->sum = sum;
27 
28   return gaussian;
29 }
30 
gaussian_kernel_free(gpointer data)31 void gaussian_kernel_free(gpointer data) {
32   struct gaussian_kernel *gaussian = (struct gaussian_kernel *)data;
33   if (gaussian != NULL) {
34     g_free(gaussian->kernel);
35     g_free(gaussian);
36   }
37 }
38