/*************************************************************************************************************************************/
/* */
/* C O N V O L U T I O N V A R I A B L E D E L ' I M A G E A R G U M E N T */
/* P A R L ' I N T E R M E D I A I R E D ' U N E I M A G E " N O Y A U " : */
/* */
/* */
/* Definition : */
/* */
/* Cette commande genere une image */
/* dont le nom est le premier argument */
/* d'appel ; elle est le resultat de */
/* la convolution de la deuxieme image */
/* par un noyau dont la longueur est */
/* variable et depend de la troisieme */
/* image. */
/* */
/* On prendra en general comme parametres */
/* les valeurs suivantes : */
/* */
/* $xci/convol.02$X ... V=$BLANC F=$BLANC ... $formatI */
/* */
/* qui constituent les parametres standards... */
/* */
/* */
/* Author of '$xci/convol.02$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1988??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 SEUIL_DE_FAUX_VRAI_POUR_LES_NIVEAUX_A_TRAITER \
GRIS_4 \
/* Seuil de discrimination {FAUX,VRAI} introduit le 20060304185106 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 20060303101341... */
#define SEUIL_D_INHIBITION \
GRIS_4 \
/* Seuil de definition de l'autorisation (>=seuil) ou d'inhibition (<seuil) du noyau. */
#define FACTEUR_MULTIPLICATIF_DE_CONVOLUTION \
FU \
/* Facteur multiplicatif du produit de convolution en chaque point {X,Y}. */
#define FACTEUR_DU_NOMBRE_DE_POINTS \
INVE(FLOT(DIVI(FLOT(NIVR(BLANC)) \
,FLOT(EXP2(DOUP(DEUX))) \
) \
) \
) \
/* Facteur par lequel on multiplie chaque niveau de 'imageN' pour obtenir */ \
/* la longueur courante du noyau au point {X,Y}. */
#define IL_FAUT_RENORMALISER \
FAUX \
/* Faut-il renormaliser l'image ? */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#include xci/convol.01.I"
/* Introduits le 20060304185759 pour 'SELECTION_DES_NIVEAUX(...)'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C O N V O L U T I O N V A R I A B L E D E L ' I M A G E A R G U M E N T */
/* P A R L ' I N T E R M E D I A I R E D ' U N E I M A G E " N O Y A U " : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageN),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageV),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageF),NOM_PIPE));
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 20060304185106... */
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 20060303101341... */
DEFV(Logical,DTb1(niveaux_a_traiter,COULEURS));
/* Definit les niveaux sur lesquels on doit faire la convolution par 'Pconvolution()'. */
DEFV(Logical,DTb1(niveaux_cumulables,COULEURS));
/* Definit les niveaux cumulables lors du calcul de 'Pconvolution_____cumul_courant'. */
DEFV(genere_p,INIT(seuil_d_inhibition,SEUIL_D_INHIBITION));
/* Seuil de definition de l'autorisation (>=seuil) ou d'inhibition (<seuil) du noyau. */
DEFV(Float,INIT(facteur_multiplicatif,FACTEUR_MULTIPLICATIF_DE_CONVOLUTION));
/* Facteur multiplicatif du produit de convolution en chaque point {X,Y}. */
DEFV(Float,INIT(facteur_du_nombre_de_points,FACTEUR_DU_NOMBRE_DE_POINTS));
/* Facteur par lequel on multiplie chaque niveau de 'imageN' pour obtenir */
/* la longueur courante du noyau au point {X,Y}. */
/*..............................................................................................................................*/
EGAL(les_images_standards_sont_a_renormaliser,IL_FAUT_RENORMALISER);
/* Faut-il renormaliser l'image ? */
GET_ARGUMENTSi(nombre_d_arguments
,BLOC(GET_ARGUMENT_L("IFconvolution_variable_____compatibilite_20151208=""compatibilite_20151208="
,IFconvolution_variable_____compatibilite_20151208
);
/* Options introduites le 20151208155323... */
GET_ARGUMENT_C("imageA=""A=",nom_imageA);
GET_ARGUMENT_C("imageN=""N=",nom_imageN);
GET_ARGUMENT_C("imageV=""V=",nom_imageV);
GET_ARGUMENT_C("imageF=""F=",nom_imageF);
GET_ARGUMENT_C("imageR=""R=",nom_imageR);
GET_ARGUMENT_C("paletteA=""palette=""pA=""p=",nom_paletteA);
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_L("circulaire=",Pconvolution_____parcourir_circulairement_les_spirales_carrees);
/* Option introduite le 20040703105946... */
GET_ARGUMENT_L("circulaire_optimale="
,Pconvolution_____adapter_le_nombre_de_points_lors_du_parcours_circulaire_des_spirales_carrees
);
/* Option introduite le 20061224121959... */
GET_ARGUMENT_L("tore=",Pconvolution_____placer_l_image_sur_un_tore);
GET_ARGUMENT_L("ponderations_utiles=",Pconvolution_____normaliser_uniquement_avec_les_ponderations_utilisees);
GET_ARGUMENT_P("seuil=",seuil_d_inhibition);
GET_ARGUMENT_F("fc=""facteur_convolution=""facteur=""f=",facteur_multiplicatif);
GET_ARGUMENT_F("fp=""facteur_points=""Facteur=",facteur_du_nombre_de_points);
GET_ARGUMENT_I("pmX=",Pconvolution_____pasX_de_la_mosaique_de_convolution);
GET_ARGUMENT_I("pmY=",Pconvolution_____pasY_de_la_mosaique_de_convolution);
GET_ARGUMENT_I("tmX=",Pconvolution_____translationX_de_la_mosaique_de_convolution);
GET_ARGUMENT_I("tmY=",Pconvolution_____translationY_de_la_mosaique_de_convolution);
GET_ARGUMENT_I("sautC=""saut=",Pconvolution_____nombre_de_points_sautes);
GET_ARGUMENT_I("sautN=",CALCUL_D_UN_NOYAU_DE_CONVOLUTION_VARIABLE_____Pnoyau_nombre_de_points_sautes);
/* Option introduite le 20050225214253... */
GET_ARGUMENT_F("transfert=",Pconvolution_____exposant_de_la_fonction_de_transfert);
GET_ARGUMENT_I("spirale_horizontal=",SPIRALE_DEFINITION_____facteur_delta_horizontal);
GET_ARGUMENT_I("spirale_vertical=",SPIRALE_DEFINITION_____facteur_delta_vertical);
GET_ARGUMENT_F("Pcumul=""Pcum=",Pconvolution_____ponderation_de_cumul_courant_normalise_apres_transfert);
GET_ARGUMENT_F("Pminimum=""Pmin=",Pconvolution_____ponderation_de_Pconvolution_____minimum_sur_la_spirale);
GET_ARGUMENT_F("Pmaximum=""Pmax=",Pconvolution_____ponderation_de_Pconvolution_____maximum_sur_la_spirale);
GET_ARGUMENT_F("Pmoyenne=""Pmoy=",Pconvolution_____ponderation_de_Pconvolution_____moyenne_sur_la_spirale);
/* Options {"Pcumul=","Pminimum=","Pmaximum="} introduites le 20070205133747... */
/* */
/* L'option "Pmoyenne=" a ete introduite le 20161117134239, meme si cela ne sert pas a grand */
/* chose, la moyenne ressemblant beaucoup au cumul si ce n'est que ce dernier est pondere... */
/* */
/* L'option "Pcum=" a ete introduite le 20161117135240 par "symetrie" avec les suivantes... */
GET_ARGUMENT_L("conserver_minimum=""cmin="
,Pconvolution_____conserver_le_niveau_du_centre_de_la_spirale_s_il_est_le_minimum
);
GET_ARGUMENT_L("conserver_maximum=""cmax="
,Pconvolution_____conserver_le_niveau_du_centre_de_la_spirale_s_il_est_le_maximum
);
/* Options {"conserver_minimum=","conserver_maximum="} introduites le 20130630185055... */
GET_ARGUMENT_L("disperser=",Pconvolution_____disperser_le_noyau_de_convolution);
GET_ARGUMENT_F("disperser_X_a00=""dX00=",Pconvolution_____disperser_le_noyau_de_convolution_X_a00);
GET_ARGUMENT_F("disperser_X_a01=""dX01=",Pconvolution_____disperser_le_noyau_de_convolution_X_a01);
GET_ARGUMENT_F("disperser_X_a02=""dX02=",Pconvolution_____disperser_le_noyau_de_convolution_X_a02);
GET_ARGUMENT_F("disperser_X_a10=""dX10=",Pconvolution_____disperser_le_noyau_de_convolution_X_a10);
GET_ARGUMENT_F("disperser_X_a11=""dX11=",Pconvolution_____disperser_le_noyau_de_convolution_X_a11);
GET_ARGUMENT_F("disperser_X_a12=""dX12=",Pconvolution_____disperser_le_noyau_de_convolution_X_a12);
GET_ARGUMENT_F("disperser_X_a20=""dX20=",Pconvolution_____disperser_le_noyau_de_convolution_X_a20);
GET_ARGUMENT_F("disperser_X_a21=""dX21=",Pconvolution_____disperser_le_noyau_de_convolution_X_a21);
GET_ARGUMENT_F("disperser_X_a22=""dX22=",Pconvolution_____disperser_le_noyau_de_convolution_X_a22);
GET_ARGUMENT_F("disperser_Y_a00=""dY00=",Pconvolution_____disperser_le_noyau_de_convolution_Y_a00);
GET_ARGUMENT_F("disperser_Y_a01=""dY01=",Pconvolution_____disperser_le_noyau_de_convolution_Y_a01);
GET_ARGUMENT_F("disperser_Y_a02=""dY02=",Pconvolution_____disperser_le_noyau_de_convolution_Y_a02);
GET_ARGUMENT_F("disperser_Y_a10=""dY10=",Pconvolution_____disperser_le_noyau_de_convolution_Y_a10);
GET_ARGUMENT_F("disperser_Y_a11=""dY11=",Pconvolution_____disperser_le_noyau_de_convolution_Y_a11);
GET_ARGUMENT_F("disperser_Y_a12=""dY12=",Pconvolution_____disperser_le_noyau_de_convolution_Y_a12);
GET_ARGUMENT_F("disperser_Y_a20=""dY20=",Pconvolution_____disperser_le_noyau_de_convolution_Y_a20);
GET_ARGUMENT_F("disperser_Y_a21=""dY21=",Pconvolution_____disperser_le_noyau_de_convolution_Y_a21);
GET_ARGUMENT_F("disperser_Y_a22=""dY22=",Pconvolution_____disperser_le_noyau_de_convolution_Y_a22);
/* Les options de "dispersion" ont ete introduites le 20201002120301... */
GET_ARGUMENT_L("rn=""renormaliser=""r=",les_images_standards_sont_a_renormaliser);
GET_ARGUMENT_L("messages_noyau_convolution_variable=""messages=""mncv="
,CALCUL_D_UN_NOYAU_DE_CONVOLUTION_VARIABLE_____editer_les_messages_du_calcul
);
/* Options {"messages_noyau_convolution_variable=","mncv="} introduites le 20091202100138... */
)
);
CALi(Inoir(ImageR));
/* Initialisation de l'image Resultat. */
Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA1,nom_imageA))))
/* Chargement de l'image a transformer. */
Bblock
Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA2,nom_imageN))))
/* Chargement de l'image de definition de la longueur du noyau courant. */
Bblock
Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA3,nom_imageV))))
/* Chargement de l'image de definition de la valeur du noyau courant. */
Bblock
Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA4,nom_imageF))))
/* Chargement de l'image de definition de la forme du noyau courant. On notera que la */
/* forme du noyau est definie par les points valides {X,Y} tels que : */
/* */
/* niveau(X,Y) >= seuil */
/* */
Bblock
SELECTION_DES_NIVEAUX(nom_paletteA,niveaux_a_traiter,niveaux_cumulables);
/* Introduit sous cette forme le 20060304185106... */
CALS(Iconvolution_variable_avec_renormalisation(ImageR
,facteur_multiplicatif
,ImageA1
,niveaux_a_traiter,niveaux_cumulables
,facteur_du_nombre_de_points
,ImageA2
,ImageA3
,ImageA4
,seuil_d_inhibition
,les_images_standards_sont_a_renormaliser
)
);
/* Et convolution de l'image Argument. */
/* */
/* ATTENTION, on consultera avec soin les commentaires contenus dans 'v $xiii/di_image$FON' */
/* relatifs a la fonction 'Igeneration_d_un_noyau_de_convolution(...)' au sujet des rapports */
/* entre la taille des images et la "forme" des noyaux... */
CALi(Iupdate_image(nom_imageR,ImageR));
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
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.