#include #include #include "kernel.h" #include void main() { kernel k; k = new_kernel(3, 3); print_kernel(k); printf("\n"); make_laplacian_kernel_1(k); print_kernel(k); printf("\n"); k->values[1][1] = 34.0; print_kernel(k); printf("\n"); } kernel new_kernel(int wi, int he) { kernel k; int i, j; printf("new_kernel called.\n"); k = (kernel) malloc (sizeof(kernel_struct)); if (wi % 2 == 0 || he % 2 == 0) { if (wi % 2 == 0) wi--; if (he % 2 == 0) he--; printf("Kernel: dimensions must be odd.\n"); printf(" using %d x %d\n", wi, he); } k -> w = wi; k -> h = he; k -> values = (float **) malloc (wi * sizeof(float *)); for (i = 0; i < wi; i++) { (k -> values)[i] = (float *) malloc (he * sizeof(float)); } for (i = 0; i < wi; i++) { for (j = 0; j < he; j++) { (k -> values)[i][j] = 0; } } *(get_ptr_to_center(k)) = 1; return k; } void print_kernel(kernel k) { int i, j; for (j = 0; j < k -> h; j++) { for (i = 0; i < k -> w; i++) { printf("%6.2f ", (k -> values)[i][j]); } printf("\n"); } } void make_laplacian_kernel_1(kernel k) { set_value(k, 0, 0, -1); set_value(k, 1, 0, -1); set_value(k, 2, 0, -1); set_value(k, 0, 1, -1); set_value(k, 1, 1, 8); set_value(k, 2, 1, -1); set_value(k, 0, 2, -1); set_value(k, 1, 2, -1); set_value(k, 2, 2, -1); } void make_laplacian_kernel_2(kernel k) { set_value(k, 0, 0, 1); set_value(k, 1, 0, -2); set_value(k, 2, 0, 1); set_value(k, 0, 1, -2); set_value(k, 1, 1, 4); set_value(k, 2, 1, -2); set_value(k, 0, 2, 1); set_value(k, 1, 2, -2); set_value(k, 2, 2, 1); } float * get_ptr_to_center(kernel k) { return &((k -> values)[(k->w)/2][(k->h)/2]); } float get_value(kernel k, int x, int y) { return (k -> values)[x][y]; } void set_value(kernel k, int x, int y, float in) { (k -> values)[x][y] = in; } void apply_kernel_to_int_array(kernel k, int w, int h, int ** inarr, int *** outarr) { int i, j; copy_int_array(w, h, inarr, outarr); for (i = 0; i < w; i++) { for (j = 0; j < h; j++) { (*outarr)[i][j] = apply_3_kernel_to_one_int_element( k, i, j, w, h, 0, 255, inarr); } } } int apply_3_kernel_to_one_int_element(kernel k, int i, int j, int W, int H, int min, int max, int ** inarr) { int m, n, s, e, w, ne, se, nw, sw; float value; int intvalue; m = get_from_array(i, j, W, H, inarr); n = get_from_array(i, j-1, W, H, inarr); s = get_from_array(i, j+1, W, H, inarr); e = get_from_array(i+1, j, W, H, inarr); w = get_from_array(i-1, j, W, H, inarr); ne = get_from_array(i+1, j-1, W, H, inarr); nw = get_from_array(i-1, j-1, W, H, inarr); se = get_from_array(i+1, j+1, W, H, inarr); sw = get_from_array(i+1, j-1, W, H, inarr); value = 0; value += get_value(k, 0, 0) * nw; value += get_value(k, 1, 0) * n; value += get_value(k, 2, 0) * ne; value += get_value(k, 0, 1) * w; value += get_value(k, 1, 1) * m; value += get_value(k, 2, 1) * e; value += get_value(k, 0, 2) * sw; value += get_value(k, 1, 2) * s; value += get_value(k, 2, 2) * se; intvalue = (int) value; if (intvalue < min) intvalue = min; if (intvalue > max) intvalue = max; return intvalue; } void apply_kernel_to_char_array(kernel k, int w, int h, char ** inarr, char *** outarr) { int i, j; copy_char_array(w, h, inarr, outarr); for (i = 0; i < w; i++) { for (j = 0; j < h; j++) { (*outarr)[i][j] = apply_3_kernel_to_one_char_element( k, i, j, w, h, 0, 255, inarr); } } } int apply_3_kernel_to_one_char_element(kernel k, int i, int j, int W, int H, int min, int max, char ** inarr) { char m, n, s, e, w, ne, se, nw, sw; float value; int intvalue; m = get_from_char_array(i, j, W, H, inarr); n = get_from_char_array(i, j-1, W, H, inarr); s = get_from_char_array(i, j+1, W, H, inarr); e = get_from_char_array(i+1, j, W, H, inarr); w = get_from_char_array(i-1, j, W, H, inarr); ne = get_from_char_array(i+1, j-1, W, H, inarr); nw = get_from_char_array(i-1, j-1, W, H, inarr); se = get_from_char_array(i+1, j+1, W, H, inarr); sw = get_from_char_array(i+1, j-1, W, H, inarr); value = 0; value += get_value(k, 0, 0) * nw; value += get_value(k, 1, 0) * n; value += get_value(k, 2, 0) * ne; value += get_value(k, 0, 1) * w; value += get_value(k, 1, 1) * m; value += get_value(k, 2, 1) * e; value += get_value(k, 0, 2) * sw; value += get_value(k, 1, 2) * s; value += get_value(k, 2, 2) * se; intvalue = (int) value; if (intvalue < min) intvalue = min; if (intvalue > max) intvalue = max; return (char) intvalue; } int get_from_array(int i, int j, int w, int h, int ** inarr) { int i2, j2; if (i < 0) i2 = 1; if (i > w-1) i2 = w-2; if (j < 0) j2 = 1; if (j > h-1) j2 = h-2; return inarr[i2][j2]; } char get_from_char_array(int i, int j, int w, int h, char ** inarr) { int i2, j2; if (i < 0) i2 = 1; else if (i > w-1) i2 = w-2; else i2 = i; if (j < 0) j2 = 1; else if (j > h-1) j2 = h-2; else j2 = j; return inarr[i2][j2]; } void copy_int_array(int w, int h, int ** inarr, int *** outarr) { int i, j; for (i = 0; i < w; i++) { for (j = 0; j < h; j++) { (*outarr)[i][j] = inarr[i][j]; } } } void copy_char_array(int w, int h, char ** inarr, char *** outarr) { int i, j; for (i = 0; i < w; i++) { for (j = 0; j < h; j++) { (*outarr)[i][j] = inarr[i][j]; } } } /* void unused() { m = inarr[i][j]; if (i == 0) { if (j == 0) { m = inarr[0][0]; e = inarr[1][0]; s = inarr[0][1]; se = inarr[1][1]; n = s; w = e; ne = se; nw = se; sw = se; } else if (j == h-1) { m = inarr[0][h-1]; n = inarr[0][h-2]; e = inarr[1][h-1]; ne = inarr[1][h-2]; w = e; s = n; nw = ne; sw = ne; se = ne; } else { m = inarr[0][j]; n = inarr[0][j-1]; s = inarr[0][j+1]; ne = inarr[1][j-1]; e = inarr[1][j]; se = inarr[1][j+1]; w = e; nw = ne; sw = se; } } else if (i == w-1) { if (j == 0) { m = inarr[i][0]; e = inarr[1][0]; s = inarr[0][1]; se = inarr[1][1]; n = s; w = e; ne = se; nw = se; sw = se; } else if (j == h) { m = inarr[0][h]; n = inarr[0][h-1]; e = inarr[1][h]; ne = inarr[1][h-1]; w = e; s = n; nw = ne; sw = ne; se = ne; } else { m = inarr[0][j]; n = inarr[0][j-1]; s = inarr[0][j+1]; ne = inarr[1][j-1]; e = inarr[1][j]; se = inarr[1][j+1]; w = e; nw = ne; sw = se; } } } */