/*************************************************************************************************************************************/
/* */
/* 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