/*************************************************************************************************************************************/ /* */ /* E D I T I O N D ' U N H I S T O G R A M M E E N B A S D ' U N E I M A G E : */ /* */ /* */ /* Author of '$xci/histogramme$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1987??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #include xci/substitue.01.I" /* Introduit le 20081004123925... */ #define FACTEUR_D_ECHELLE_DE_LA_HAUTEUR \ UN \ /* Facteur d'echelle de la hauteur de la mire de barres par defaut. */ \ /* */ \ /* Le 20081006152838, la valeur par defaut est passee de 'UN' a 'QUATRE', cette derniere */ \ /* valeur mettant mieux en valeur la forme de l'histogramme... */ \ /* */ \ /* Le 20081008094226 je suis revenu a 'UN' a cause de 'v $xiii/vecteurs$DEF 20081007181725'. */ #define AFFICHER_L_HISTOGRAMME_SEUL \ FAUX \ /* Doit-on afficher l'histogramme seul ('VRAI') ou en superposition avec l'image */ \ /* correspondante ('FAUX') ? Ceci fut introduit le 20081006155250... */ #define EDITION_ALPHA_NUMERIQUE \ FAUX \ /* Doit-on editer l'histogramme sous une forme alpha-numerique ('VRAI') ou bien sous la */ \ /* forme d'une image ('FAUX') ? */ #define EDITER_L_SUBSTITUTION_HISTOGRAMME \ FAUX \ /* Si 'IL_FAUT(edition_alpha_numerique)' doit-on editer ('VRAI') ou pas ('FAUX') la liste */ \ /* 'L_SUBSTITUTION_HISTOGRAMME' (ceci fut introduit le 20081005121404) ? */ #define EDITER_TOUTES_LES_INFORMATIONS \ VRAI \ /* Doit-on editer toutes les informations ('VRAI') ou bien uniquement le niveau ('FAUX') ? */ \ /* Ceci fut introduit le 20130906102904... */ #define EDITER_UNIQUEMENT_LE_NIVEAU_CORRESPONDANT_A_UN_SEUIL_DE_L_HISTOGRAMME_CUMULE \ FAUX #define SEUIL_DE_L_HISTOGRAMME_CUMULE \ ZERO #define LE_SEUIL_DE_L_HISTOGRAMME_CUMULE_EST_UN_POURCENTAGE \ VRAI #define POURCENTAGE_DU_SEUIL_DE_L_HISTOGRAMME_CUMULE \ FZERO /* Si 'IL_FAUT(edition_alpha_numerique)' doit-on n'editer que le niveau correspondant a */ /* certain seuil de l'histogramme cumule ('VRAI') ou tous les niveaux ('FAUX') ? Ceci fut */ /* introduit le 20090601184030. La possibilite d'utiliser un pourcentage (ce qui est plus */ /* souple puisque ne dependant pas de '$formatI'...) a ete introduite le 20090602113818... */ /* Le 20090602115718, 'LE_SEUIL_DE_L_HISTOGRAMME_CUMULE_EST_UN_POURCENTAGE' est passe de */ /* 'FAUX' a 'VRAI' car cette valeur par defaut est la plus pratique... */ #define COMPATIBILITE_20151125 \ FAUX \ /* Permet de generer des histogrammes compatibles avec ceux qui furent generes avant le */ \ /* 20151125174538... */ #define NIVEAU_DU_LISERE \ NOIR \ /* Niveau du lisere introduit le 20151125174538... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #include xci/substitue.02.I" /* Introduit le 20081004123925... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E D I T I O N D ' U N H I S T O G R A M M E E N B A S D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE)); #include xci/substitue.03.I" /* Introduit le 20081004123925... */ DEFV(Positive,INIT(facteur_d_echelle_de_la_hauteur,FACTEUR_D_ECHELLE_DE_LA_HAUTEUR)); /* Facteur d'echelle de la hauteur de la mire de barres par defaut. */ DEFV(Logical,INIT(afficher_l_histogramme_seul,AFFICHER_L_HISTOGRAMME_SEUL)); /* Doit-on afficher l'histogramme seul ('VRAI') ou en superposition avec l'image */ /* correspondante ('FAUX') ? Ceci fut introduit le 20081006155250... */ DEFV(Logical,INIT(edition_alpha_numerique,EDITION_ALPHA_NUMERIQUE)); /* Doit-on editer l'histogramme sous une forme alpha-numerique ('VRAI') ou bien sous la */ /* forme d'une image ('FAUX') ? */ DEFV(Logical,INIT(editer_toutes_les_informations,EDITER_TOUTES_LES_INFORMATIONS)); /* Doit-on editer toutes les informations ('VRAI') ou bien uniquement le niveau ('FAUX') ? */ /* Ceci fut introduit le 20130906102904... */ /* */ /* Cela n'a de sens evidemment que si : */ /* */ /* IL_FAUT(editer_uniquement_le_niveau_correspondant_a_un_seuil_de_l_histogramme_cumule) */ /* */ DEFV(Logical,INIT(editer_L_SUBSTITUTION_HISTOGRAMME,EDITER_L_SUBSTITUTION_HISTOGRAMME)); /* Si 'IL_FAUT(edition_alpha_numerique)' doit-on editer ('VRAI') ou pas ('FAUX') la liste */ /* 'L_SUBSTITUTION_HISTOGRAMME' (ceci fut introduit le 20081005121404) ? */ DEFV(Logical,INIT(editer_uniquement_le_niveau_correspondant_a_un_seuil_de_l_histogramme_cumule ,EDITER_UNIQUEMENT_LE_NIVEAU_CORRESPONDANT_A_UN_SEUIL_DE_L_HISTOGRAMME_CUMULE ) ); DEFV(Int,INIT(seuil_de_l_histogramme_cumule,SEUIL_DE_L_HISTOGRAMME_CUMULE)); DEFV(Logical,INIT(le_seuil_de_l_histogramme_cumule_est_un_pourcentage,LE_SEUIL_DE_L_HISTOGRAMME_CUMULE_EST_UN_POURCENTAGE)); DEFV(Float,INIT(pourcentage_du_seuil_de_l_histogramme_cumule,POURCENTAGE_DU_SEUIL_DE_L_HISTOGRAMME_CUMULE)); /* Si 'IL_FAUT(edition_alpha_numerique)' doit-on n'editer que le niveau correspondant a */ /* certain seuil de l'histogramme cumule ('VRAI') ou tous les niveaux ('FAUX') ? Ceci fut */ /* introduit le 20090601184030. La possibilite d'utiliser un pourcentage (ce qui est plus */ /* souple puisque ne dependant pas de '$formatI'...) a ete introduite le 20090602113818... */ DEFV(Logical,INIT(compatibilite_20151125,COMPATIBILITE_20151125)); /* Permet de generer des histogrammes compatibles avec ceux qui furent generes avant le */ /* 20151125174538... */ DEFV(genere_p,INIT(niveau_du_lisere,NIVEAU_DU_LISERE)); /* Niveau du lisere introduit le 20151125174538... */ /*..............................................................................................................................*/ GET_ARGUMENTSg(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("compatibilite_20151125=",compatibilite_20151125); GET_ARGUMENT_L("SX_SY_SZ_____compatibilite_20070416=""compatibilite_20070416=" ,SX_SY_SZ_____compatibilite_20070416 ); /* Parametre introduit le 20070416160926... */ GET_ARGUMENT_C("imageA=""A=",nom_imageA); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_C("substitution=""s=",nom_substitution); /* La valeur la plus utile ici est : */ /* */ /* substitution=L_SUBSTITUTION_HISTOGRAMME */ /* */ /* puisqu'alors l'histogramme est edite dans l'ordre des populations croissantes des */ /* niveaux (qui correspond aussi a ce que donne de plus "editer_substitution=VRAI"). */ GET_ARGUMENT_I("echelle_hauteur=""hauteur=""h=",facteur_d_echelle_de_la_hauteur); GET_ARGUMENT_I("hauteur_mire=""hmire=""hm=" ,Ihistogramme______hauteur_de_la_mire_de_barres_situee_a_la_base_de_l_histogramme ); /* Parametre introduit le 20081006113950... */ GET_ARGUMENT_L("renormaliser_hauteur_maximum=""rhm=" ,Ihistogramme______renormaliser_la_hauteur_de_la_mire_de_barres_par_rapport_au_maximum ); GET_ARGUMENT_F("facteur_renormalisation=""fr=" ,Ihistogramme______facteur_de_renormalisation_hauteur_mire_de_barres_par_rapport_au_maximum ); /* Parametres introduits le 20151124135350... */ GET_ARGUMENT_L("histogramme_seul=""histogramme=""hs=",afficher_l_histogramme_seul); GET_ARGUMENT_N("histogramme_image=""image=""hi=",afficher_l_histogramme_seul); GET_ARGUMENT_L("alpha_numerique=""alpha=""editer=""lister=",edition_alpha_numerique); /* Le parametre "lister=" a ete ajoute le 20081006140634... */ GET_ARGUMENT_L("toutes_informations=""ti=""infos=",editer_toutes_les_informations); GET_ARGUMENT_N("niveau_seul=""ns=",editer_toutes_les_informations); /* Parametres introduits le 20130906102904... */ GET_ARGUMENT_L("editer_substitution=""editers=",editer_L_SUBSTITUTION_HISTOGRAMME); GET_ARGUMENT_L("editer_uniquement_niveau_seuil=""editer_seuil=""euns=" ,editer_uniquement_le_niveau_correspondant_a_un_seuil_de_l_histogramme_cumule ); GET_ARGUMENT_I("seuil_histogramme_cumule=""seuil=""shc=",seuil_de_l_histogramme_cumule); GET_ARGUMENT_L("seuil_histogramme_cumule_pourcentage=""seuil_pourcentage=""sp=" ,le_seuil_de_l_histogramme_cumule_est_un_pourcentage ); GET_ARGUMENT_N("seuil_histogramme_cumule_nombre=""seuil_nombre=""sn=" ,le_seuil_de_l_histogramme_cumule_est_un_pourcentage ); GET_ARGUMENT_F("pourcentage_histogramme_cumule=""pourcentage_seuil=""ps=" ,pourcentage_du_seuil_de_l_histogramme_cumule ); /* Les parametres relatifs au seuil de l'histogramme cumule ont ete introduits le */ /* 20090601184030 et completes le 20090602113818 par le pourcentage... */ GET_ARGUMENT_P("niveau_lisere=""nl=",niveau_du_lisere); /* Parametres introduits le 20151124135350... */ ) ); Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageG,nom_imageA)))) Bblock #include xci/substitue.04.I" /* Introduit le 20081004123925... */ Test(IL_FAUT(compatibilite_20151125)) /* Ce test fut introduit le 20151125174538... */ Bblock Eblock ATes Bblock Test(IFNE(niveau_du_lisere,NOIR)) Bblock PRINT_ATTENTION("le niveau du lisere est force a NOIR pour que le lisere a gauche et a gauche soit correct"); EGAL(niveau_du_lisere,NOIR); Eblock ATes Bblock Eblock ETes Eblock ETes CALS(Ihistogramme(ImageG)); Test(IL_FAUT(edition_alpha_numerique)) Bblock DEFV(Logical,INIT(le_seuil_de_l_histogramme_cumule_a_ete_rencontre,FAUX)); /* A priori... */ BoIn(niveau,NOIR,BLANC,PAS_COULEURS) Bblock DEFV(genere_p,INIT(niveau_substitue,Nsubstitution(niveau))); /* Introduit le 20081004123925... */ DEFV(Int,INIT(histogramme_courant,UNDEF)); DEFV(Float,INIT(pourcentage_histogramme_courant,UNDEF)); DEFV(Int,INIT(histogramme_cumule_courant,UNDEF)); DEFV(Float,INIT(pourcentage_histogramme_cumule_courant,UNDEF)); EGAL(histogramme_courant,ACCES_HISTOGRAMME(niveau_substitue)); EGAL(pourcentage_histogramme_courant,FLOT(CONVERTIR_EN_UN_POURCENTAGE(histogramme_courant,dimXY))); EGAL(histogramme_cumule_courant,ACCES_HISTOGRAMME_CUMULE(niveau_substitue)); EGAL(pourcentage_histogramme_cumule_courant,FLOT(CONVERTIR_EN_UN_POURCENTAGE(histogramme_cumule_courant,dimXY))); /* Introduits le 20090601184030 et complete le 20090602113818 par les pourcentages... */ Test(IFOU(IL_NE_FAUT_PAS(editer_uniquement_le_niveau_correspondant_a_un_seuil_de_l_histogramme_cumule) ,I3ET(IL_FAUT(editer_uniquement_le_niveau_correspondant_a_un_seuil_de_l_histogramme_cumule) ,EST_FAUX(le_seuil_de_l_histogramme_cumule_a_ete_rencontre) ,IFOU(IFET(EST_FAUX(le_seuil_de_l_histogramme_cumule_est_un_pourcentage) ,IFGE(histogramme_cumule_courant,seuil_de_l_histogramme_cumule) ) ,IFET(EST_VRAI(le_seuil_de_l_histogramme_cumule_est_un_pourcentage) ,IFGE(pourcentage_histogramme_cumule_courant,pourcentage_du_seuil_de_l_histogramme_cumule) ) ) ) ) ) Bblock Test(IL_FAUT(editer_toutes_les_informations)) Bblock CAL3(Prme2("Histogramme(%0*d)" ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX ,INTE(niveau_substitue) ) ); /* Pour 'v $xig/fonct$vv$FON chain_Acopie_avec_gestion_des_formats_des_editions_entieres' */ /* il a fallu introduire un 'INTE(...)' car 'niveau_substitue' est un 'genere_p' et non */ /* pas un 'Int' (introduit le 20131206170808). */ CAL3(Prme2("=%0*d" ,NOMBRE_DE_CHIFFRES_DECIMAUX(dimXY) ,histogramme_courant ) ); CAL3(Prme2(" (%.4f%c)" ,pourcentage_histogramme_courant ,K_POUR_CENT ) ); CAL3(Prme2(" HistogrammeCumule(%0*d)" ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX ,INTE(niveau_substitue) ) ); /* Pour 'v $xig/fonct$vv$FON chain_Acopie_avec_gestion_des_formats_des_editions_entieres' */ /* il a fallu introduire un 'INTE(...)' car 'niveau_substitue' est un 'genere_p' et non */ /* pas un 'Int' (introduit le 20131206170808). */ CAL3(Prme2("=%0*d" ,NOMBRE_DE_CHIFFRES_DECIMAUX(dimXY) ,histogramme_cumule_courant ) ); CAL3(Prme2(" (%.4f%c)" ,pourcentage_histogramme_cumule_courant ,K_POUR_CENT ) ); Eblock ATes Bblock CAL3(Prme1("%d" ,niveau_substitue ) ); Eblock ETes CALS(Fsauts_de_lignes(UN)); /* On notera le passage le 19980326091450 de : */ /* */ /* "\n niveau(%04d)=%08d (%.4f%)" */ /* */ /* a : */ /* */ /* "\n niveau(%04d)=%08d (%.4f%c)" */ /* */ /* avec 'K_POUR_CENT' a cause de la compilation sur '$LACT29' qui signalait : */ /* */ /* warning(1199): invalid format string conversion */ /* */ /* Le 20061023155856 'POURCENTAGE(...)' fut remplace par 'CONVERTIR_EN_UN_POURCENTAGE(...)'. */ /* */ /* Le 20081001163324 fut introduit 'ACCES_HISTOGRAMME_CUMULE(...)'. */ /* */ /* Le 20081002142735, le format "niveau(%04d)=%08d (%.4f%c) cumul=%d\n" fut ameliore... */ /* */ /* Le 20081002143527 furent introduits les 'NOMBRE_DE_CHIFFRES_DECIMAUX(...)'. */ /* */ /* Le 20090602081751 fut introduit l'edition du pourcentage de l'histogramme cumule... */ /* */ /* */ /* Le 20130905184549 l'expression : */ /* */ /* CAL3(Prme12("Histogramme(%0*d)=%0*d (%.4f%c) HistogrammeCumule(%0*d)=%0*d (%.4f%c)\n" */ /* ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX */ /* ,niveau_substitue */ /* ,NOMBRE_DE_CHIFFRES_DECIMAUX(dimXY) */ /* ,histogramme_courant */ /* ,pourcentage_histogramme_courant */ /* ,K_POUR_CENT */ /* ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX */ /* ,niveau_substitue */ /* ,NOMBRE_DE_CHIFFRES_DECIMAUX(dimXY) */ /* ,histogramme_cumule_courant */ /* ,pourcentage_histogramme_cumule_courant */ /* ,K_POUR_CENT */ /* ) */ /* ); */ /* */ /* a ete decoupee en plusieurs editions d'une part pour en ameliorer la comprehension et */ /* d'autre part pour resoudre une anomalie d'edition. Ainsi, par exemple, l'histogramme */ /* de 'v $xiio/MIRE' donnait avant cette date : */ /* */ /* Histogramme(000)=001024 (0.3906%) HistogrammeCumule(140733193388032)=001024 (0.3906%) */ /* ___ _______________ */ /* correct incorrect */ /* ^ ^ */ /* | | */ /* --------------------------------------------- */ /* (...) */ /* */ /* (sur '$CMAP28', la valeur sur '$LACT19' etant elle-aussi mauvaise, mais certainement */ /* un peu differente) alors que le format genere : */ /* */ /* Histogramme(%0*ld)=%0*ld (%.4f%c) HistogrammeCumule(%0*ld)=%0*ld (%.4f%c) */ /* _ _ _ _ */ /* */ /* par 'v $xig/fonct$vv$FON chain_Acopie_avec_gestion_des_formats_des_editions_entieres' */ /* est correct. Je n'ai pas trouve d'autre solution... */ Test(IL_FAUT(editer_uniquement_le_niveau_correspondant_a_un_seuil_de_l_histogramme_cumule)) Bblock EGAL(le_seuil_de_l_histogramme_cumule_a_ete_rencontre,VRAI); /* L'unique edition vient d'etre faite... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock EBoI Test(IL_FAUT(editer_L_SUBSTITUTION_HISTOGRAMME)) Bblock CALS(Fsauts_de_lignes(DEUX)); PRINT_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_HISTOGRAMME); /* Edition introsuite le 20081005121817... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Test(IL_FAUT(afficher_l_histogramme_seul)) Bblock CALi(Inoir(ImageG)); /* Cette possibilite fut introduite le 20081006155250... */ Eblock ATes Bblock Eblock ETes Test(IFOU(IL_FAUT(afficher_l_histogramme_seul) ,IL_FAUT(compatibilite_20151125) ) ) /* Ce test fut introduit le 20151125174538 et complete le 20160204111200 en ce qui concerne */ /* 'afficher_l_histogramme_seul'... */ Bblock HISTOGRAMME(facteur_d_echelle_de_la_hauteur,VNEUT(niveau_du_lisere)); Eblock ATes Bblock CALS(Imove(ImageA2,ImageG)); /* Sauvegarde de l'image Argument dans 'ImageA2'... */ HISTOGRAMME(facteur_d_echelle_de_la_hauteur,VNEUT(niveau_du_lisere)); CALS(Imove(ImageA3,ImageG)); /* On a ainsi dans 'ImageA3', l'histogramme avec lisere a droite... */ CALS(Iy_symetrie(ImageA1,ImageA2)); CALS(Icomplementation(ImageG,ImageA1)); /* On procede a une symetrie d'axe vertical et a une complementation des niveaux. */ CALS(Ihistogramme(ImageG)); HISTOGRAMME(facteur_d_echelle_de_la_hauteur,VCOMP(niveau_du_lisere)); /* Evidemment, il faut recalculer le nouvel histogramme. On notera que 'HISTOGRAMME(...)' */ /* ne sachant que faire des liseres a droite, pour faire le lisert a gauche, il suffit */ /* de faire une symetrie d'axe vertical et d'inverser la droite et la gauche de */ /* l'histogramme en inversant l'image... */ CALS(Icomplementation(ImageA1,ImageG)); CALS(Iy_symetrie(ImageG,ImageA1)); /* On procede enfin aux transformations inverses ce qui donne dans 'ImageG', */ /* l'histogramme avec lisere a gauche... */ CALS(Iand(ImageA4,ImageA3,ImageG)); CALS(Imove(ImageG,ImageA4)); /* Enfin, on a donc un lisert a gauche et a droite de l'histogramme... */ Eblock ETes CALi(Iupdate_image(nom_imageR,ImageG)); Eblock ETes #include xci/substitue.06.I" /* Puis on desactive (introduit le 20081004191158...). */ Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes RETU_Commande; Eblock ECommande