1 #include "algebra.h" 2 3 #include <glib.h> 4 #include <math.h> 5 gaussian_kernel(int width,double sigma)6struct 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)31void 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