#include #include #include #define M_PI 3.14159265358979323846 #include "../tp2.h" #define DEBUG 1 /** * Calculo la matriz de convulsión. * Hago el calculo de todos los componentes. * PRE: Esto asume que existen "r" pixeles para cada lado del pixel actual para hacer la cuenta + TODO: Hay que hacer free de la matriz */ float* convulcion_matrix(float sigma, int r) { unsigned int contador = 0; unsigned int largo = 2*r + 1; unsigned int diff = largo+ 4-(largo % 4); unsigned int tam = diff*largo; float* conv_matrix = malloc(sizeof(float)*tam); if (DEBUG) printf("Sigma: %f | Radio: %d \n", sigma,r); // Recorro cada pixel for (int y = -r; y <= r; y++) { for (int x = -r; x <= r+1; x++) { // Por cada pixel obtengo la sub-matriz de convulsion para cada componente if (x==r+1) { //Con esta idea, la matriz siempre tiene mult de 4 columnas, son todas 0 entonces no me afecta conv_matrix[contador] = 0; } else { conv_matrix[contador] = (1 / (2*M_PI*sigma*sigma)) * exp(- (pow(x,2)+pow(y,2))/(2*sigma*sigma)); } if (DEBUG) printf("%.8f\t", conv_matrix[contador]); contador++; } if (DEBUG) printf("\n"); } return conv_matrix; } void blur_c(unsigned char *src, unsigned char *dst, int cols, int filas, float sigma, int r) { unsigned char (*src_matrix)[cols*4] = (unsigned char (*)[cols*4]) src; unsigned char (*dst_matrix)[cols*4] = (unsigned char (*)[cols*4]) dst; float* mc = convulcion_matrix(sigma, r); float tmp[3]; int i, j, x, y, matPos; // Recorro la imagen, ignoro los bordes de tamaño R for(i=r; i