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