00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00035 #include "classifier.h"
00036 #include "defuzzyfication_voisinage_3x3.h"
00037 #include "image.h"
00038 #include "proto2D.h"
00039 #include <stdlib.h>
00040 #include <stdio.h>
00041
00042
00043
00058
00059
00060
00073 param *defuzzyfication_voisinage_3x3_lect(defuzzyfication_voisinage_3x3_t *desc, param *ptp, char *debq)
00074 {
00075
00076
00077
00078 return ptp;
00079 }
00080
00081
00082
00083
00084
00085
00111 int defuzzyfication_voisinage_3x3_init(defuzzyfication_voisinage_3x3_t *desc, data_output dataOF, data_output *dataOC )
00112 {
00113 int i;
00114
00115 printf("\nDefuzzyfication init...");
00116
00117
00118 desc->nb_classes = dataOF.nb_class;
00119 dataOC->nb_class = desc->nb_classes;
00120 dataOC->nb_pts = dataOF.nb_pts;
00121 dataOC->type = CRISP_CHOICE;
00122 dataOC->equ_nb_cols = dataOF.equ_nb_cols;
00123 dataOC->equ_nb_rows = dataOF.equ_nb_rows;
00124
00125
00126 alloc_classifier_data_output(dataOC);
00127
00128
00129 if((desc->somme_coeff_appartenance=(float*)malloc(desc->nb_classes*sizeof(float)))==NULL ||
00130 (desc->position_data_incertaines=(int*)malloc((dataOF.nb_pts)*sizeof(int)))==NULL)
00131 {
00132 printf("Erreur defuzz init memoire insuffisante\n");
00133 exit(1);
00134 }
00135
00136
00137
00138 for(i=0;i<dataOF.nb_pts;i++)
00139 desc->position_data_incertaines[i] = 0;
00140
00141
00142
00143 desc->nb_data_incertaines_finales = 0;
00144 desc->nb_data_incertaines_initiales = 0;
00145
00146 printf("OK\n");
00147
00148 }
00149
00150
00151
00152
00172 int defuzzyfication_voisinage_3x3_calc(defuzzyfication_voisinage_3x3_t *desc, data_output dataOF, data_output *dataOC )
00173 {
00174
00175 int i, j, x, y, indice, compteur, max_multiple;
00176
00177 printf("\nDefuzzyfication calcul...");
00178
00179 for(i=0;i<dataOF.nb_pts;i++)
00180 {
00181 desc->max_coeff_appartenance = 0;
00182 indice = 0;
00183 for(j=0;j<desc->nb_classes;j++)
00184 if (dataOF.classes.fuzzy[j][i]>desc->max_coeff_appartenance)
00185 {
00186 desc->max_coeff_appartenance=dataOF.classes.fuzzy[j][i];
00187
00188 indice=j;
00189 }
00190
00191 max_multiple=0;
00192 for(j=0;j<desc->nb_classes;j++)
00193 if(dataOF.classes.fuzzy[j][i]==desc->max_coeff_appartenance)
00194 (max_multiple)++;
00195
00196
00197 if((i<dataOF.equ_nb_cols)||
00198 (i%(dataOF.equ_nb_cols) == 0)||
00199 ((i+1)%(dataOF.equ_nb_cols) == 0) ||
00200 (i>(dataOF.nb_pts - dataOF.equ_nb_cols)))
00201 dataOC->classes.crisp[i] = indice;
00202
00203 else if (max_multiple == 1)
00204 dataOC->classes.crisp[i] = indice;
00205
00206 else
00207 {
00208
00209 desc->position_data_incertaines[i] = 1;
00210
00211
00212 desc->nb_data_incertaines_initiales++;
00213 }
00214 }
00215
00216 printf("Nb. de données incertaines initiales = %d.",desc->nb_data_incertaines_initiales);
00217
00218 if(desc->nb_data_incertaines_initiales == 0)
00219 {
00220 printf("Donc pas besoin de fenêtre de vérification.\n");
00221 return 0;
00222 }
00223
00224 else if(desc->nb_data_incertaines_initiales > 0)
00225 {
00226 printf(" Incorrect. \nNécessité d'un post traitement des données incertaines avec fenêtre 3x3...\n");
00227
00228
00229 desc->nb_data_incertaines_finales = 0;
00230
00231 for(i=0;i<dataOF.nb_pts;i++)
00232 if (desc->position_data_incertaines[i] == 1)
00233 {
00234 for(j=0;j<desc->nb_classes;j++)
00235 {
00236 desc->somme_coeff_appartenance[j]=0;
00237 for(x=-1;x<2;x++)
00238 for(y=-1;y<2;y++)
00239 {
00240
00241 desc->somme_coeff_appartenance[j] = desc->somme_coeff_appartenance[j]
00242 + dataOF.classes.fuzzy[j][i+x*(dataOF.equ_nb_cols)+y];
00243
00244 }
00245 }
00246
00247 desc->max_coeff_appartenance = 0;
00248 indice = 0;
00249
00250 for(j=0;j<desc->nb_classes;j++)
00251 {
00252 if (desc->somme_coeff_appartenance[j] > desc->max_coeff_appartenance)
00253 {
00254 desc->max_coeff_appartenance = desc->somme_coeff_appartenance[j];
00255 indice=j;
00256 }
00257 }
00258
00259 compteur=0;
00260
00261 for(j=0;j<desc->nb_classes;j++)
00262 if (desc->max_coeff_appartenance == desc->somme_coeff_appartenance[j]) compteur++;
00263
00264 if (compteur > 1) desc->nb_data_incertaines_finales++;
00265
00266 dataOC->classes.crisp[i] = indice;
00267 }
00268
00269 if(desc->nb_data_incertaines_finales > 0)
00270 printf("\nAprès la vérification avec la fenêtre 3x3 il y a encore %d incertitudes.\n",desc->nb_data_incertaines_finales);
00271
00272 else printf("\nLa fenêtre 3x3 a supprimé les incertitudes\n");
00273
00274 return 0;
00275 }
00276
00277 else
00278 {
00279 printf("Erreur defuzz calc : nb de data < 0\n");
00280 exit(1);
00281 }
00282
00283 printf("OK.\n");
00284
00285 }
00287
00288