]> AND Private Git Repository - lniv_gpu.git/blob - lib_lniv_common.c
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
version opérationnelle
[lniv_gpu.git] / lib_lniv_common.c
1 /**
2  * \file lib_lniv_common.c
3  * \brief routines pour la gestion des lignes de niveaux
4  * \author NB - PhyTI 
5  * \version x.x
6  * \date 8 mai 2011
7  *
8  */
9
10 #include <stdlib.h>
11 #include <math.h>
12 #include "lib_lniv_common.h"
13
14
15 /**
16  *
17  * \brief calcul du PSNR entre deux images int
18  * \author NB - PhyTI
19  *
20  * \param[in] im1  image d'entree
21  * \param[in] im2  image d'entree
22  * \param[in] idim   
23  * \param[in] jdim   
24  * \param[in] range dynamique de l'image   
25  *
26  */
27 double psnr_image_int(int **im1, int **im2, int idim, int jdim, int range)
28 {
29   int n ;
30   double eqm = 0.0 ;
31   double err, eq = 0.0 ;
32   for (n=0; n<idim*jdim; n++)
33     {
34       err = im1[0][n]-im2[0][n] ;
35       eq += err*err ;
36     }
37   eqm = eq / (idim*jdim) ;
38
39   return  10.0*log10((double)range*range/eqm) ;
40 }
41
42
43
44
45
46 /**
47  *
48  * \brief Filtrage d'une image par moyenne 
49  * \author NB - PhyTI
50  *
51  * \param[out] result  image de sortie
52  * \param[in] matrix  image d'entree
53  * \param[in] i_dim   
54  * \param[in] j_dim   
55  * \param[in] dim_wind largeur du noyau carre  
56  *
57  */
58 void mean2ds(int **result, int **matrix, int dim_wind,
59              int i_dim, int j_dim)
60 {
61   int dim_wind2 = (int)floor(dim_wind/2);
62   double sqr_dim_wind = dim_wind*dim_wind;
63   double tmp_diff;
64   int i, j, iw, jw, iiw ;
65
66   // On calcul les bords en version lente
67   for (i=0;i<i_dim; i++)
68     for (j=0;j<j_dim; j++)
69       {
70         if ((i>dim_wind2+1)&&(i<(i_dim-dim_wind2-1)))
71           if (j==dim_wind2+1) 
72             j=j_dim-dim_wind2-1;
73         
74         result[i][j] = 0;
75         for (iw=i-dim_wind2;iw<i+dim_wind2+1;iw++)
76           for (jw=j-dim_wind2;jw<j+dim_wind2+1;jw++)
77             if ((iw>=0)&&(jw>=0)&&(iw<i_dim)&&(jw<j_dim))
78               result[i][j] += matrix[iw][jw] ;
79       }
80
81 // On calcul le centre en version rapide
82   for (i=dim_wind2+1;i<i_dim-dim_wind2; i++)
83     {
84       for (j=dim_wind2+1;j<j_dim-dim_wind2; j++)
85         { 
86           tmp_diff = 0;
87           for (iiw=i-dim_wind2;iiw<=i+dim_wind2;iiw++)
88           tmp_diff += matrix[iiw][j+dim_wind2] - matrix[iiw][j-dim_wind2-1] ;
89           
90           result[i][j] = result[i][j-1] + tmp_diff ;
91         }
92     }
93   
94   // On divise pour la moyenne
95   // pb sur les bords !!!
96   for (i=0;i<i_dim;i++)
97     for (j=0;j<j_dim;j++)
98       result[i][j] /= sqr_dim_wind; 
99 }