/*************************************************************************************************************************************/
/* */
/* C A L C U L D U G R A D I E N T A P P R O X I M E D ' U N E I M A G E : */
/* */
/* */
/* Definition : */
/* */
/* Cette commande genere une image */
/* dont le nom est le premier argument */
/* d'appel ; elle est le resultat du */
/* calcul du gradient approxime de la */
/* deuxieme image. */
/* */
/* */
/* Author of '$xci/gradient.01$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1991??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 : */
/* */
/*************************************************************************************************************************************/
#define CALCULER_LE_GRADIENT \
VRAI \
/* Indique s'il faut calculer le gradient ('VRAI') ou uniquement extraire les extrema */ \
/* locaux de l'image Argument ('FAUX'). Ceci fut introduit le 20051207094244 et la */ \
/* valeur par defaut garantit la compatibilite anterieure... */
#define RECHERCHER_LE_MAXIMUM \
VRAI \
/* Indique s'il faut calculer le maximum ('VRAI') ou le minimum ('FAUX') autour de chaque */ \
/* point de l'image Argument. */
#define SEUIL_DE_FAUX_VRAI_POUR_LES_NIVEAUX_A_TRAITER \
GRIS_4 \
/* Seuil de discrimination {FAUX,VRAI} introduit le 20060306092247 lors de l'entree de la */ \
/* liste des niveaux a traiter via une palette de couleur. */
#define EXCLURE_UN_NIVEAU_DE_LA_CONVOLUTION \
FAUX
#define NIVEAU_A_EXCLURE_DE_LA_CONVOLUTION \
NOIR
/* Faut-il ('VRAI') ou pas ('FAUX') exclure un niveau de la convolution (par defaut le */
/* NOIR) ? Cela fut introduit le 20060306092247... */
#define NOMBRE_DE_POINTS_DU_VOISINAGE \
EXP2(DOUP(UN)) \
/* Nombre de points du voisinage. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#include xci/convol.01.I"
/* Introduit le 20060306092247 pour 'SELECTION_DES_NIVEAUX(...)'. */
#define VOISINAGE(numero) \
Bblock \
EGAL(ITb1(inhibition_des_voisins,INDX(numero,PREMIER_POINT)),ACTIF); \
Eblock
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D U G R A D I E N T A P P R O X I M E 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));
DEFV(Logical,INIT(calculer_le_gradient,CALCULER_LE_GRADIENT));
/* Indique s'il faut calculer le gradient ('VRAI') ou uniquement extraire les extrema */
/* locaux de l'image Argument ('FAUX'). Ceci fut introduit le 20051207094244 et la */
/* valeur par defaut garantit la compatibilite anterieure... */
DEFV(Logical,INIT(rechercher_le_maximum,RECHERCHER_LE_MAXIMUM));
/* Indique s'il faut calculer le maximum ('VRAI') ou le minimum ('FAUX') autour de chaque */
/* point de l'image Argument. */
DEFV(genere_p,INIT(seuil_de_FAUX_VRAI_pour_les_niveaux_a_traiter,SEUIL_DE_FAUX_VRAI_POUR_LES_NIVEAUX_A_TRAITER));
DEFV(CHAR,INIC(POINTERc(nom_paletteA),NOM_PIPE));
/* Nom de la palette a utiliser eventuellement et seuil de discrimination {FAUX,VRAI} */
/* introduits le 20060306092247... */
DEFV(Logical,INIT(exclure_un_niveau_de_la_convolution,EXCLURE_UN_NIVEAU_DE_LA_CONVOLUTION));
DEFV(genere_p,INIT(niveau_a_exclure_de_la_convolution,NIVEAU_A_EXCLURE_DE_LA_CONVOLUTION));
/* Faut-il ('VRAI') ou pas ('FAUX') exclure un niveau de la convolution (par defaut le */
/* NOIR) ? Cela fut introduit le 20060306092247... */
DEFV(Logical,DTb1(niveaux_a_traiter,COULEURS));
/* Definit les niveaux sur lesquels on doit faire la convolution par 'Pextrema_locaux()'. */
DEFV(Logical,DTb1(niveaux_testables,COULEURS));
/* Definit les niveaux qui sont cumulables lors du calcul de 'extremum_courant'. */
DEFV(Int,INIT(nombre_de_points_du_voisinage,NOMBRE_DE_POINTS_DU_VOISINAGE));
/* Nombre de points du voisinage. */
DEFV(Logical,DTb1(inhibition_des_voisins,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION));
/* Et sa liste d'activite. */
DEFV(Int,INIT(index,UNDEF));
/* Index d'initialisation du voisinage. */
/*..............................................................................................................................*/
GET_ARGUMENTSi(nombre_d_arguments
,BLOC(GET_ARGUMENT_C("imageA=""A=",nom_imageA);
GET_ARGUMENT_C("imageR=""R=",nom_imageR);
GET_ARGUMENT_L("message_attention_extrema=""mae="
,Ifloat_std_____editer_le_message_d_attention_relatif_aux_extrema
);
/* Arguments introduits le 20101121165901... */
GET_ARGUMENT_L("Iextrema_locaux_____compatibilite_20060606=""compatibilite_20060606="
,Iextrema_locaux_____compatibilite_20060606
);
GET_ARGUMENT_L("gradient=",calculer_le_gradient);
GET_ARGUMENT_N("extrema=",calculer_le_gradient);
GET_ARGUMENT_L("maximum=",rechercher_le_maximum);
GET_ARGUMENT_N("minimum=",rechercher_le_maximum);
/* Argument introduit le 20140923101411... */
GET_ARGUMENT_L("circulaire=",Pconvolution_____parcourir_circulairement_les_spirales_carrees);
/* Option introduite le 20060606113338. Cela permet d'utiliser un noyau circulaire a */
/* condition que le nombre de points soit egal au carre d'un nombre impair multiplie */
/* par pi/4 ('v $xiii/di_image$FON 20060606125544'). Le 20061224122356, l'option */
/* suivante ("circulaire_optimale=") permet de resoudre cette contrainte automatiquement... */
GET_ARGUMENT_L("circulaire_optimale="
,Pconvolution_____adapter_le_nombre_de_points_lors_du_parcours_circulaire_des_spirales_carrees
);
/* Option introduite le 20061224122356... */
GET_ARGUMENT_C("paletteA=""palette=""pA=",nom_paletteA);
/* ATTENTION : le parametre "p=" ne peut etre defini ici a cause de 'nombre_de_points'... */
GET_ARGUMENT_P("sp=""seuil_palette=",seuil_de_FAUX_VRAI_pour_les_niveaux_a_traiter);
GET_ARGUMENT_L("exclure=",exclure_un_niveau_de_la_convolution);
GET_ARGUMENT_P("niveau_a_exclure=""ne=",niveau_a_exclure_de_la_convolution);
GET_ARGUMENT_I("points=""p=",nombre_de_points_du_voisinage);
)
);
CALi(Inoir(ImageR));
/* Initialisation de l'image Resultat. */
SELECTION_DES_NIVEAUX(nom_paletteA,niveaux_a_traiter,niveaux_testables);
/* Introduit sous cette forme le 20060306092247... */
Test(IFLE(NOMBRE_DE_POINTS_EFFECTIF_D_UN_NOYAU_DE_CONVOLUTION_PARCOURU_CIRCULAIREMENT(nombre_de_points_du_voisinage)
,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION
)
)
Bblock
DoIn(index
,PREMIER_POINT
,LSTX(PREMIER_POINT
,NOMBRE_DE_POINTS_EFFECTIF_D_UN_NOYAU_DE_CONVOLUTION_PARCOURU_CIRCULAIREMENT(nombre_de_points_du_voisinage)
)
,I
)
Bblock
VOISINAGE(index);
/* Initialisation du voisinage. */
Eblock
EDoI
Eblock
ATes
Bblock
PRINT_ERREUR("la taille demandee pour le noyau de convolution est incompatible avec les definitions");
EGAL(nombre_de_points_du_voisinage,NOMBRE_DE_POINTS_DU_VOISINAGE);
CAL1(Prer1("(la valeur %d par defaut est forcee)\n",nombre_de_points_du_voisinage));
/* Introduit le AAAAMMJJhhmmss car, en effet, manquait cruellement... */
Eblock
ETes
Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA1,nom_imageA))))
/* Chargement de l'image a transformer. */
Bblock
CALS(Iextrema_locaux(ImageA2
,ImageA1
,rechercher_le_maximum
,niveaux_a_traiter,niveaux_testables
,nombre_de_points_du_voisinage,inhibition_des_voisins
)
);
/* Et recherche des extrema locaux de l'image Argument. */
Test(IL_FAUT(calculer_le_gradient))
Bblock
CALS(Isoustraction_avec_renormalisation(ImageR,ImageA2,ImageA1));
/* Puis soustraction des niveaux locaux aux extrema locaux afin d'approximer le gradient. */
Eblock
ATes
Bblock
CALS(Imove(ImageR,ImageA2));
/* Et en fait, on ne s'interesse qu'aux extrema locaux (introduit le 20051207094244)... */
Eblock
ETes
CALi(Iupdate_image(nom_imageR,ImageR));
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
RETU_Commande;
Eblock
ECommande
Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.