From ef2cc7a4d858a0b70f58372579ee75d7f3c1117c Mon Sep 17 00:00:00 2001 From: "jorge.leitemac" <jorge.leite-machado@etu.hesge.ch> Date: Wed, 25 Nov 2020 16:51:27 +0100 Subject: [PATCH] fonction conv qui marche pas --- main.c | 20 +++++++++++++------- pgm.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pgm.h | 2 +- 3 files changed, 73 insertions(+), 8 deletions(-) diff --git a/main.c b/main.c index 493ebb5..1685d99 100644 --- a/main.c +++ b/main.c @@ -1,10 +1,9 @@ #include "pgm.h" -void foo(int* elem){ - *elem *= 2; -} - int main(){ + int boxBlur[] = {1,1,1,1,1,1,1,1,1}; + + pgm p; pgm_read_from_file(&p, "./img/mandrill.pgm"); pgm_write_to_file(&p, "./img/mandrill2.pgm"); @@ -20,7 +19,7 @@ int main(){ //SYM HORIZONTAL pgm symH; - pgm_symmetry_vert(&symH, &p); + pgm_symmetry_hori(&symH, &p); pgm_write_to_file(&symH, "./img/symH_mandrill.pgm"); //SYM VERTICAL @@ -38,9 +37,16 @@ int main(){ pgm_crop(&crop, &p, 100, 200, 100, 200); pgm_write_to_file(&crop, "./img/crop_mandrill.pgm"); - - + matrix kernel; + matrix_init_from_array(&kernel, 3, 3, boxBlur); + matrix_print(kernel); + pgm conv; + pgm_conv(&conv, &p, &kernel, 9); + pgm_write_to_file(&crop, "./img/conv_mandrill.pgm"); + + matrix_destroy(&(kernel)); + matrix_destroy(&(conv.pixels)); matrix_destroy(&(p.pixels)); matrix_destroy(&(symH.pixels)); matrix_destroy(&(symV.pixels)); diff --git a/pgm.c b/pgm.c index 535513a..7d792e5 100644 --- a/pgm.c +++ b/pgm.c @@ -214,5 +214,64 @@ pgm_error pgm_photomaton(pgm *photomaton, const pgm *const orig){ return failure; } + return success; +} + +//Kernel = matrice de convolution +pgm_error pgm_conv(pgm *conv, const pgm *const orig,const matrix *const kernel, double norm){ + conv->max = orig->max; + + //conv = orig * kernel + int cpt = 0; + int32_t valeurs[orig->pixels.m * orig->pixels.n]; + + int nC = 0; + int mC = 0; + + int moy = 0; + + norm = (norm == 0) ? 1 : norm; + + for (int n = 0; n < orig->pixels.m; n++) + { + for (int m = 0; m < orig->pixels.n; m++) + { + + //POURQUOI /2 ???? + mC = m-(kernel->m-1)/2; + nC = n-(kernel->n-1)/2; + for (int i = 0; i < kernel->m; i++) + { + for (int j = 0; j < kernel->n; j++) + { + if(mC <= orig->pixels.m && nC <= orig->pixels.n && nC > 0 && mC > 0){ + moy += orig->pixels.data[nC][mC] * kernel->data[i][j]; + } + nC++; + } + nC = n-(kernel->n-1)/2; + mC++; + + } + moy = moy / norm; + + if(moy < 0){ + moy = 0; + } + if(moy >= orig->max){ + moy = orig->max; + } + + valeurs[cpt] = moy; + cpt++; + moy = 0; + + } + } + + if (matrix_init_from_array(&conv->pixels, orig->pixels.m, orig->pixels.n, valeurs) != OK) { + return failure; + } + return success; } \ No newline at end of file diff --git a/pgm.h b/pgm.h index f0d7594..2b586da 100644 --- a/pgm.h +++ b/pgm.h @@ -38,5 +38,5 @@ pgm_error pgm_photomaton(pgm *photomaton,const pgm *const orig); pgm_error pgm_crop(pgm *crop, const pgm *const orig,int32_t x0, int32_t x1,int32_t y0, int32_t y1); //Filtres avec convultion -pgm_error pgm_conv(pgm *conv, const pgm *const orig,const matrix *const kernel); +pgm_error pgm_conv(pgm *conv, const pgm *const orig,const matrix *const kernel, double norm); #endif -- GitLab