/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N S D U C A L C U L D ' U N S C A L A I R E T Y P I Q U E : */
/* */
/* */
/* Definition : */
/* */
/* Ce fichier contient toutes les definitions */
/* de base de calcul d'un scalaire typique d'une */
/* images raster, quelle que soit la definition. */
/* */
/* */
/* Author of '$xiii/scalaires$DEF' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 19880000000000). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D U M I N I M U M D E S N I V E A U X D ' U N E I M A G E Q U E L C O N Q U E : */
/* */
/*************************************************************************************************************************************/
#define gInivo_minimum(les_images_sont_standards,imageA,FimageA) \
COND(EST_VRAI(les_images_sont_standards) \
,Inivo_minimum(imageA) \
,IFnivo_minimum(FimageA) \
) \
/* Calcul du minimum d'une image quelconque ("standard" ou "flottante"). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D U M A X I M U M D E S N I V E A U X D ' U N E I M A G E Q U E L C O N Q U E : */
/* */
/*************************************************************************************************************************************/
#define gInivo_maximum(les_images_sont_standards,imageA,FimageA) \
COND(EST_VRAI(les_images_sont_standards) \
,Inivo_maximum(imageA) \
,IFnivo_maximum(FimageA) \
) \
/* Calcul du maximum d'une image quelconque ("standard" ou "flottante"). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* A C C E S A L ' H I S T O G R A M M E : */
/* */
/*************************************************************************************************************************************/
#define ACCES_HISTOGRAMME(niveau) \
ITb1(histogramme,INDX(niveau,NOIR)) \
/* Acces a la valeur de l'histogramme pour le niveau 'niveau'. On notera que cela peut */ \
/* etre tres utile pour, par exemple, savoir si deux images 'ImageA1' et 'ImageA2' sont */ \
/* identiques ; on fera alors : */ \
/* */ \
/* CALS(Ihistogramme(Ieor(ImageR,ImageA1,ImageA2)); */ \
/* Test(IFEQ(ACCES_HISTOGRAMME(NOIR),dimXY)) */ \
/* Bblock */ \
/* <Les deux images sont parfaitement identiques> */ \
/* Eblock */ \
/* ATes */ \
/* Bblock */ \
/* <Les deux images ont au moins une petite difference> */ \
/* Eblock */ \
/* ETes */ \
/* */
#define ACCES_HISTOGRAMME_CUMULE(niveau) \
ITb1(histogramme_cumule,INDX(niveau,NOIR)) \
/* Acces a la valeur de l'histogramme "cumule" pour le niveau 'niveau'. */
#define ACCES_HISTOGRAMME_CUMULE___NORMALISE(niveau) \
NORM(FLOT(ACCES_HISTOGRAMME_CUMULE(niveau)),FZERO,FLOT(dimXY)) \
/* Acces a la valeur de l'histogramme "cumule" pour le niveau 'niveau' mis dans [0,1]. */ \
/* */ \
/* Le 20050502092309, le nom 'ACCES_HISTOGRAMME_CUMULE_DENORMALISE(...)' a ete change en */ \
/* 'ACCES_HISTOGRAMME_CUMULE___NORMALISE(...)' beaucoup plus logique... */ \
/* */ \
/* Le 20081001135908, les 'FLOT(...)'s (essentiels !) ont ete introduits... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D ' U N E L I S T E D E S U B S T I T U T I O N */
/* A P A R T I R D E L ' H I S T O G R A M M E C O U R A N T : */
/* */
/*************************************************************************************************************************************/
#define V_NOIR \
BLANC \
/* Donne le numero du niveau le moins rempli. */
#define V_BLANC \
NOIR \
/* Donne le numero du niveau le plus rempli. */
#define PREMIER_NIVEAU \
ITb1(classement_des_niveaux,INDX(V_BLANC,V_BLANC)) \
/* Acces au niveau le plus rempli... */
#define SECOND_NIVEAU \
ITb1(classement_des_niveaux,INDX(SUCC(V_BLANC),V_BLANC)) \
/* Acces au niveau qui suit immediatement le plus rempli... */
#define DERNIER_NIVEAU \
ITb1(classement_des_niveaux,INDX(V_NOIR,V_BLANC)) \
/* Acces au niveau le moins rempli... */
#define SET_SUBSTITUTION_HISTOGRAMME(premier_niveau_de_substitution,population_minimale,seuillage_des_niveaux) \
/* Cette fonction permet de calculer la liste de substituition VARIABLE */ \
/* en fonction de l'histogramme courant et de trois parametres : */ \
/* */ \
/* 'premier_niveau_de_substitution' : il donne le premier niveau de substitution */ \
/* genere, */ \
/* 'population_minimale' : donne la population minimale de regroupement */ \
/* des niveaux ; s'il est nul, on prend la valeur */ \
/* 'Ihistogramme______nombre_de_points_maximal', */ \
/* 'seuillage_des_niveaux' : qui est une valeur logique qui indique */ \
/* si l'on va seuiller a 'BLANC', ou bien faire */ \
/* un modulo dans [NOIR,BLANC]. */ \
/* */ \
Bblock \
DEFV(Int,INIT(niveau_substitue_courant,premier_niveau_de_substitution)); \
/* Donne en permanence le niveau de substitution courant ; celui-ci ne progresse */ \
/* que lorsque la population minimale est atteinte ou depassee... */ \
DEFV(Int,INIT(population_courante,ZERO)); \
/* Donne en permanence la population courante cumule des niveaux anterieurs. */ \
Test(EST_VALIDE(Ihistogramme_____etat)) \
Bblock \
BoIn(niveau_courant,NOIR,BLANC,PAS_COULEURS) \
Bblock \
EGAL(niveau_substitue_courant \
,COND(EST_VRAI(seuillage_des_niveaux) \
,MIN2(niveau_substitue_courant,BLANC) \
,MODU(niveau_substitue_courant,NOIR,BLANC) \
) \
); \
/* Traitement des sorties de [NOIR,BLANC]... */ \
MODIFICATION_LISTE_DE_SUBSTITUTION(niveau_courant,niveau_substitue_courant); \
INCR(population_courante,ACCES_HISTOGRAMME(niveau_courant)); \
/* On cumule la population du niveau courant... */ \
Test(IFGE(population_courante \
,COND(IZGT(population_minimale) \
,population_minimale \
,COND(IFNE(PREMIER_NIVEAU,NOIR) \
,ACCES_HISTOGRAMME(PREMIER_NIVEAU) \
,ACCES_HISTOGRAMME(SECOND_NIVEAU) \
) \
) \
) \
) \
Bblock \
CLIR(population_courante); \
/* Lorsque la population courante a depasse le seuil, on la reinitialise, */ \
INCR(niveau_substitue_courant,I); \
/* Et on incremente le niveau de substitution courant. */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
EBoI \
Eblock \
ATes \
Bblock \
PRINT_ERREUR("l'histogramme est invalide"); \
Eblock \
ETes \
Eblock
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D E L A D I M E N S I O N F R A C T A L E */
/* D E " H A U S D O R F F " G E N E R A L I S E E D ' U N E I M A G E : */
/* */
/*************************************************************************************************************************************/
#define DIMENSION_FRACTALE_NULLE \
FZERO \
/* Valeur renvoyee pour la dimension fractale lorsqu'aucun point n'a ete */ \
/* trouve lors du calcul des histogrammes successifs. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L M A S Q U E D U N O M B R E D E P O I N T S */
/* A P P A R T E N A N T A U N C E R T A I N I N T E R V A L L E */
/* D A N S U N E I M A G E : */
/* */
/*************************************************************************************************************************************/
#define gIcomptage_des_points_dans_un_intervalle(les_images_sont_standards,imageA,FimageA,niveau1,Fniveau1,niveau2,Fniveau2) \
COND(EST_VRAI(les_images_sont_standards) \
,Icomptage_des_points_dans_un_intervalle(imageA,niveau1,niveau2) \
,IFcomptage_des_points_dans_un_intervalle(FimageA,Fniveau1,Fniveau2) \
) \
/* Calcul du nombre de points appartenant a un certain intervalle (bornes incluses) dans */ \
/* une image. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L M A S Q U E D U N O M B R E D E C O I N C I D E N C E S */
/* E N T R E D E U X I M A G E S : */
/* */
/*************************************************************************************************************************************/
#define gIcomptage_des_coincidences(les_images_sont_standards,imageA1,FimageA1,imageA2,FimageA2) \
COND(EST_VRAI(les_images_sont_standards) \
,Icomptage_des_coincidences(imageA1,imageA2) \
,IFcomptage_des_coincidences(FimageA1,FimageA2) \
) \
/* Calcul du nombre de coincidences entre 2 images quelconques ("standard" ou "flottante"). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D U C E N T R E D E G R A V I T E D ' U N E I M A G E : */
/* */
/*************************************************************************************************************************************/
#define gIcentre_de_gravite(les_images_sont_standards,imageA,FimageA) \
COND(EST_VRAI(les_images_sont_standards) \
,Icentre_de_gravite(imageA) \
,IFcentre_de_gravite(FimageA) \
) \
/* Calcul du centre de gravite d'une image quelconque ("standard" ou "flottante"). Ceci */ \
/* fut introduit le 20220204185418... */