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