/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I L T R A G E   D ' U N E   I M A G E   P A R   T R A N S F O R M E E   D E   F O U R I E R   C O M P L E X E  :         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    En notant '*' le produit terme a                                                                               */
/*                  terme de deux matrices complexes, le                                                                             */
/*                  le resultat de cette commande est                                                                                */
/*                  l'image :                                                                                                        */
/*                                                                                                                                   */
/*                                        -1                                                                                         */
/*                                      TF  (TF(image)*TF(noyau))                                                                    */
/*                                                                                                                                   */
/*                  ou 'image' et 'noyau' designent l'image                                                                          */
/*                  a filtrer et le noyau respectivement.                                                                            */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Remarque sur certaines invariances :                                                                                       */
/*                                                                                                                                   */
/*                    Le 20181109111259, j'ai fait des experiences                                                                   */
/*                  pour verifier, par exemple, l'invariance                                                                         */
/*                  de la 'TF' par transposition. Soit 'image' une                                                                   */
/*                  image carree ('Std' par exemple). On calcule                                                                     */
/*                  les deux 'TF's suivantes :                                                                                       */
/*                                                                                                                                   */
/*                                      image1 = TF(image)                                                                           */
/*                                      image2 = TRANPOSITION(TF(TRANPOSITION(image)))                                               */
/*                                                                                                                                   */
/*                  Les deux images 'image1' et 'image2' sont                                                                        */
/*                  absolument identiques, d'ou l'invariance...                                                                      */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/filtre.01$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  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
@define   PRAGMA_CPP_____POUR_LES_Iload_NE_PAS_VERIFIER_LES_MULTIPLES_UTILISATIONS_DE_L_IMAGE_____ImageA3
@define   PRAGMA_CPP_____POUR_LES_Iload_NE_PAS_VERIFIER_LES_MULTIPLES_UTILISATIONS_DE_L_IMAGE_____ImageA4
                                        /* Introduit le 20060124092138.                                                              */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_BASE
#include  image_image_IMAGESF_EXT
#include  image_image_IMAGESJ_EXT
#include  maths_trans_FOURIER_EXT
#include  image_image_QUAD_IMAGE_EXT

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xci/filtre.01.I"

#define   RESPECTER_LES_EXTREMA_DE_L_IMAGE_ARGUMENT                                                                                     \
                    FAUX                                                                                                                \
                                        /* Indique si l'on doit respecter les extrema de 'ImageA' pour 'ImageR' dans le cas standard */ \
                                        /* ('VRAI') ou pas ('FAUX'), c'est-a-dire exploiter {NOIR,BLANC} comme c'etait le cas avant  */ \
                                        /* le 20011215102450.                                                                        */

#define   FILTRER                                                                                                                       \
                    VRAI                                                                                                                \
                                        /* Indique si l'on doit filtrer l'image Argument ('VRAI') ou juste faire 'FFT(FFT-1(...))'   */ \
                                        /* ('FAUX').                                                                                 */

#define   EDITER_LES_EXTREMA                                                                                                            \
                    FAUX                                                                                                                \
                                        /* Indique si l'on doit editer les extrema ('VRAI') ou pas ('FAUX'). Ceci fut introduit le   */ \
                                        /* 20240708081512...                                                                         */

#define   TRANSLATIONS_DIRECTES                                                                                                         \
                    VRAI                                                                                                                \
                                        /* Indique si l'on doit passer de {X_translate,Y_translate} a {X,Y} ('VRAI') ou l'inverse,   */ \
                                        /* c'est-a-dire passer de {X,Y} a {X_translate,Y_translate} ('FAUX').                        */

#define   AVERTIR_S_IL_Y_A_REDIMENSIONNEMENT                                                                                            \
                    FAUX                                                                                                                \
                                        /* Indique si l'on doit avertir lorsqu'il y a redimensionnement ('VRAI') ou pas ('FAUX').    */
#define   METHODE_DE_REDIMENSIONNEMENT_A_UTILISER_POUR_LES_IMAGES                                                                       \
                    REECHANTILLONNAGE_PAR_INTERPOLATION_BILINEAIRE
#define   METHODE_DE_REDIMENSIONNEMENT_A_UTILISER_POUR_LES_NOYAUX                                                                       \
                    REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_AU_CENTRE
                                        /* Methode de redimensionnement a utiliser si besoin est (introduit le 20210106151223 et     */
                                        /* complete le 20210107100532)...                                                            */

#define   AVERTIR_EN_PRESENCE_D_UN_NOYAU_DE_FILTRAGE_NON_IMPLICITE                                                                      \
                    VRAI                                                                                                                \
                                        /* Indique si l'on doit avertir lorsque le noyau n'est pas implicite (introduit le           */ \
                                        /* 20060515112945).                                                                          */

#define   COMPATIBILITE_20030910                                                                                                        \
                    FAUX                                                                                                                \
                                        /* Permet de proceder a des filtrages compatibles a ceux qui furent effectues anterieurement */ \
                                        /* au 20030910092458.                                                                        */
#define   COMPATIBILITE_20210106                                                                                                        \
                    FAUX                                                                                                                \
                                        /* Permet de proceder a des filtrages compatibles a ceux qui furent effectues anterieurement */ \
                                        /* au 20210106151223.                                                                        */
#define   COMPATIBILITE_20210107                                                                                                        \
                    FAUX                                                                                                                \
                                        /* Permet de proceder a des filtrages compatibles a ceux qui furent effectues anterieurement */ \
                                        /* au 20210107100147.                                                                        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   DEFINITION_DU_NOIR_BLANC_DE_ImageA                                                                                            \
                    Bblock                                                                                                              \
                    DEFV(pointF_2D,point_minimum);                                                                                      \
                    DEFV(pointF_2D,point_maximum);                                                                                      \
                                        /* Definitions necessaires pour appeler 'Inivo_extrema(...)'...                              */ \
                                                                                                                                        \
                    CALS(Inivo_extrema(ImageA                                                                                           \
                                      ,ADRESSE(Ifloat_std_____niveau_NOIR),ADRESSE(point_minimum)                                       \
                                      ,ADRESSE(Ifloat_std_____niveau_BLANC),ADRESSE(point_maximum)                                      \
                                       )                                                                                                \
                         );                                                                                                             \
                                        /* Positionnement du {NOIR,BLANC} effectif pour le 'Ifloat_std(...)' ulterieur.              */ \
                    Eblock                                                                                                              \
                                        /* Definition de {NOIR,BLANC} destine a 'Ifloat_std(...)'. ATTENTION, le fait de modifier    */ \
                                        /* {Ifloat_std_____niveau_NOIR,Ifloat_std_____niveau_BLANC} dans le code meme de la          */ \
                                        /* fonction 'Ifloat_std(...)' pourrait etre tres dangereux si cette fonction etait appelee   */ \
                                        /* ci-apres plusieurs fois de suite dans des "roles" differents...                           */

#define   GENERATION_DE_formatI_Sxu                                                                                                     \
                    chain_Aconcaten8(" Xmin="                                                                                           \
                                    ,chain_Aentier(COORDONNEE_MINIMALE)                                                                 \
                                    ," Xmax="                                                                                           \
                                    ,chain_Aentier(COORDONNEE_MAXIMALE(logarithme_entier_en_base_2_de_la_plus_grande_dimension))        \
                                    ," Ymin="                                                                                           \
                                    ,chain_Aentier(COORDONNEE_MINIMALE)                                                                 \
                                    ," Ymax="                                                                                           \
                                    ,chain_Aentier(COORDONNEE_MAXIMALE(logarithme_entier_en_base_2_de_la_plus_grande_dimension))        \
                                     )
#define   GENERATION_DE_formatR_Sxu                                                                                                     \
                    chain_Aconcaten8(" XminR="                                                                                          \
                                    ,chain_Aentier(COORDONNEE_MINIMALE)                                                                 \
                                    ," XmaxR="                                                                                          \
                                    ,chain_Aentier(COORDONNEE_MAXIMALE(logarithme_entier_en_base_2_de_la_plus_grande_dimension))        \
                                    ," YminR="                                                                                          \
                                    ,chain_Aentier(COORDONNEE_MINIMALE)                                                                 \
                                    ," YmaxR="                                                                                          \
                                    ,chain_Aentier(COORDONNEE_MAXIMALE(logarithme_entier_en_base_2_de_la_plus_grande_dimension))        \
                                     )
                                        /* Afin de passer au format carre et puissance de 2 immediatement superieur (ceci fut        */
                                        /* introduit le 20120906174241 et le probleme n'avait pas ete vu avant !)...                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C H O I X   D E   L A   F A C O N   D ' I M P L E M E N T E R   L E S   T R A N S F O R M E E S  :                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xci/filtre.02.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I L T R A G E   D ' U N E   I M A G E   P A R   T R A N S F O R M E E   D E   F O U R I E R   C O M P L E X E  :         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
                                        /* Nom de l'image Resultat filtree.                                                          */
     DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE));
                                        /* Nom de l'image Argument a filtrer.                                                        */
     DEFV(CHAR,INIC(POINTERc(nom_noyauNM),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_noyauNA),NOM_PIPE));
                                        /* Nom des noyaux de filtrage.                                                               */
     DEFV(CHAR,INIC(POINTERc(nom_image_translation_horizontale),NOM_UNDEF));
     DEFV(CHAR,INIC(POINTERc(nom_image_translation_verticale),NOM_UNDEF));
                                        /* Nom des deux images optionnelles destinees a translater la transformee de Fourier de      */
                                        /* l'image Argument avant filtrage. ATTENTION, ces deux images doivent etre presentes        */
                                        /* simultanement pour qu'elles soient appliquees...                                          */
     DEFV(CHAR,INIC(POINTERc(nom_image_deplacement_horizontal),NOM_UNDEF));
     DEFV(CHAR,INIC(POINTERc(nom_image_deplacement_vertical),NOM_UNDEF));
                                        /* Nom des deux images optionnelles deplacer a modifier la transformee de Fourier de         */
                                        /* l'image Argument avant filtrage. ATTENTION, ces deux images doivent etre presentes        */
                                        /* simultanement pour qu'elles soient appliquees...                                          */

     DEFV(Logical,INIT(filtrer,FILTRER));
                                        /* Indique si l'on doit filtrer l'image Argument ('VRAI') ou juste faire 'FFT(FFT-1(...))'   */
                                        /* ('FAUX').                                                                                 */

     DEFV(Logical,INIT(editer_les_extrema,EDITER_LES_EXTREMA));
                                        /* Indique si l'on doit editer les extrema ('VRAI') ou pas ('FAUX'). Ceci fut introduit le   */ \
                                        /* 20240708081512...                                                                         */

#include  xci/filtre.03.I"

     DEFV(Logical,INIT(respecter_les_extrema_de_l_image_Argument,RESPECTER_LES_EXTREMA_DE_L_IMAGE_ARGUMENT));
                                        /* Indique si l'on doit respecter les extrema de 'ImageA' pour 'ImageR' dans le cas standard */
                                        /* ('VRAI') ou pas ('FAUX'), c'est-a-dire exploiter {NOIR,BLANC} comme c'etait le cas avant  */
                                        /* le 20011215102450.                                                                        */

     DEFV(Logical,INIT(translations_directes,TRANSLATIONS_DIRECTES));
                                        /* Indique si l'on doit passer de {X_translate,Y_translate} a {X,Y} ('VRAI') ou l'inverse,   */
                                        /* c'est-a-dire passer de {X,Y} a {X_translate,Y_translate} ('FAUX').                        */
     DEFV(Logical,INIT(avertir_s_il_y_a_redimensionnement,AVERTIR_S_IL_Y_A_REDIMENSIONNEMENT));
                                        /* Indique si l'on doit avertir lorsqu'il y a redimensionnement ('VRAI') ou pas ('FAUX').    */
     DEFV(Logical,INIT(methode_de_redimensionnement_a_utiliser_pour_les_images
                      ,METHODE_DE_REDIMENSIONNEMENT_A_UTILISER_POUR_LES_IMAGES
                       )
          );
     DEFV(Logical,INIT(methode_de_redimensionnement_a_utiliser_pour_les_noyaux
                      ,METHODE_DE_REDIMENSIONNEMENT_A_UTILISER_POUR_LES_NOYAUX
                       )
          );
                                        /* Methode de redimensionnement a utiliser si besoin est (introduit le 20210106151223 et     */
                                        /* complete le 20210107100532)...                                                            */

     DEFV(Logical,INIT(avertir_en_presence_d_un_noyau_de_filtrage_non_implicite
                      ,AVERTIR_EN_PRESENCE_D_UN_NOYAU_DE_FILTRAGE_NON_IMPLICITE
                       )
          );
                                        /* Indique si l'on doit avertir lorsque le noyau n'est pas implicite (introduit le           */
                                        /* 20060515112945).                                                                          */

     DEFV(Logical,INIT(compatibilite_20030910,COMPATIBILITE_20030910));
                                        /* Permet de proceder a des filtrages compatibles a ceux qui furent effectues anterieurement */
                                        /* au 20030910092458.                                                                        */
     DEFV(Logical,INIT(compatibilite_20210106,COMPATIBILITE_20210106));
                                        /* Permet de proceder a des filtrages compatibles a ceux qui furent effectues anterieurement */
                                        /* au 20210106151223.                                                                        */
     DEFV(Logical,INIT(compatibilite_20210107,COMPATIBILITE_20210107));
                                        /* Permet de proceder a des filtrages compatibles a ceux qui furent effectues anterieurement */
                                        /* au 20210107100147.                                                                        */
     /*..............................................................................................................................*/
     GET_ARGUMENTSi(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("compatibilite_20030910=",compatibilite_20030910);
                         GET_ARGUMENT_L("compatibilite_20210106=",compatibilite_20210106);
                         GET_ARGUMENT_L("compatibilite_20210107=",compatibilite_20210107);

                         GET_ARGUMENT_C("imageA=""A=",nom_imageA);
                         GET_ARGUMENT_C("noyauNM=""noyau=""N=""NM=",nom_noyauNM);
                         GET_ARGUMENT_C("noyauNA=""NA=",nom_noyauNA);
                         GET_ARGUMENT_C("tX=""imageTX=",nom_image_translation_horizontale);
                         GET_ARGUMENT_C("tY=""imageTY=",nom_image_translation_verticale);
                         GET_ARGUMENT_C("imageDX=""dX=",nom_image_deplacement_horizontal);
                         GET_ARGUMENT_C("imageDY=""dY=",nom_image_deplacement_vertical);
                         GET_ARGUMENT_C("imageR=""R=",nom_imageR);
                         GET_ARGUMENT_L("standardA=",les_imagesA_sont_standards);
                                        /* Introduit le 20060307140432...                                                            */
                         GET_ARGUMENT_L("standardN=",les_imagesN_sont_standards);
                                        /* Introduit le 20240812122025...                                                            */
                         GET_ARGUMENT_L("standardR=""standard=",les_imagesR_sont_standards);
                                        /* 'les_images_sont_standards' fut remplace par 'les_imagesR_sont_standards' le              */
                                        /* 20060307140022 afin de pouvoir introduire 'les_imagesA_sont_standards'. Au passage,       */
                                        /* la logique voudrait que l'on supprime le parametre "standard=" (qui fut donc remplace     */
                                        /* a cette date par "standardR="), mais cela impliquerait trop de modifications un peu       */
                                        /* partout ; d'ou cette solution de facilite...                                              */
                         GET_ARGUMENT_L("filtrer=",filtrer);
                         GET_ARGUMENT_L("editer_extrema=""ee=",editer_les_extrema);
                                        /* Introduit le 20240708081512...                                                            */
                         GET_ARGUMENT_L("etaler=",etaler_le_filtre);
                         GET_ARGUMENT_I("seuil=""s=",seuil_d_etalement_du_filtre);
                         GET_ARGUMENT_L("binariser=",binariser_le_filtre);
                         GIT_ARGUMENT_F("trx=""trX=",translation_OX,_____lNORMALISE_OX(X_TRANSLATION));
                         GIT_ARGUMENT_F("try=""trY=",translation_OY,_____lNORMALISE_OY(Y_TRANSLATION));
                         GET_ARGUMENT_L("rn=""renormaliser=",renormaliser_l_image);
                         GET_ARGUMENT_L("respecter=",respecter_les_extrema_de_l_image_Argument);
                         GET_ARGUMENT_L("zero=",Ifloat_std_____conserver_le_zero);
                         GET_ARGUMENT_L("tronquer=",tronquer_les_niveaux);
                         GET_ARGUMENT_L("directes=""direct=",translations_directes);
                         GET_ARGUMENT_I("mode=""methode=""mode_image=""methode_image=""mi="
                                       ,methode_de_redimensionnement_a_utiliser_pour_les_images
                                        );
                         GET_ARGUMENT_I("mode_noyau=""methode_noyau=""mn="
                                       ,methode_de_redimensionnement_a_utiliser_pour_les_noyaux
                                        );
                                        /* Le parametre "mode=""methode=" a ete introduit le 20210106151223 et complete le           */
                                        /* 20210107100532 avec les noyaux...                                                         */
                         GET_ARGUMENT_L("avertir_redimensionnement=",avertir_s_il_y_a_redimensionnement);
                         GET_ARGUMENT_L("avertir_non_implicite=""ani=",avertir_en_presence_d_un_noyau_de_filtrage_non_implicite);
                                        /* Le parametre "ani=" a ete introduit le 20090801165236...                                  */
                         )
                    );

     Test(EST_VRAI(les_imagesA_sont_standards))
          Bblock
          Eblock
     ATes
          Bblock
          Test(EST_VRAI(les_imagesR_sont_standards))
               Bblock
               PRINT_ERREUR("les options 'standardA=' et 'standardR=' ne sont pas utilisees correctement");
               CAL1(Prer2("(l'utilisation de 'standardA=%s' necessite 'standardR=%s' qui est donc force)\n"
                         ,ETAT_LOGIQUE(NEUL(les_imagesA_sont_standards))
                         ,ETAT_LOGIQUE(NOTL(les_imagesR_sont_standards))
                          )
                    );

               EGAL(les_imagesR_sont_standards,FAUX);
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ETes

     Test(I4ET(IFEQ(dimX,dimY)
              ,EST_UNE_PUISSANCE_DE_2(dimX)
              ,EST_UNE_PUISSANCE_DE_2(dimY)
              ,IFEQ(pasX,pasY)
               )
          )
                                        /* Les tests 'EST_UNE_PUISSANCE_DE_2(...)'s furent introduits le 20060313100708...           */
                                        /*                                                                                           */
                                        /* Je note le 20170829130321 que ces tests 'EST_UNE_PUISSANCE_DE_2(...)'s ont imposes la     */
                                        /* modifications 'v $Fcompilers 20170829120356'...                                           */
          Bblock
          CALi(Inoir(ImageR));
                                        /* Initialisation de l'image Resultat. ATTENTION, ceci ne peut etre fait comme d'habitude    */
                                        /* par :                                                                                     */
                                        /*                                                                                           */
                                        /*                  CALi(gInettoyage(les_imagesR_sont_standards,ImageR,IFmage_PR));          */
                                        /*                                                                                           */
                                        /* car, en effet, l'initialisation de 'ImageR' a 'NOIR' est imperative, cette valeur etant   */
                                        /* utilisee pour initialiser par la suite 'IFmage_PI'...                                     */

          Test(EST_VRAI(les_imagesR_sont_standards))
               Bblock
                                        /* Cas d'une image 'image' :                                                                 */
               Eblock
          ATes
               Bblock
                                        /* Cas d'une image 'imageF' :                                                                */
               CALi(IFinitialisation(IFmage_PR,FZERO));
                                        /* Initialisation de l'image Resultat.                                                       */
               Eblock
          ETes

          INITIALISATION_ACCROISSEMENT_2D(translation,translation_OX,translation_OY);
                                        /* Definition de la translation sur le noyau.                                                */

          Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_imagesA_sont_standards,ImageA,IFmageA,nom_imageA))))
               Bblock
                                        /* A  = image a filtrer.                                                                     */
               Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_imagesN_sont_standards,ImageA1,IFmageA2,nom_noyauNM))))
                    Bblock
                                        /* A1 = image definissant le noyau de filtrage Multiplicatif.                                */
                                        /*                                                                                           */
                                        /* Le 20240812122025 a ete introduite la possibilite que le noyau de filtrage Multiplicatif  */
                                        /* ne soit pas standard (il est alors dans 'IFmageA2')...                                    */

#ifdef    IMPLEMENTATION_DES_TRANSFORMEES_DE_FOURIER_VERSION_01
                    BDEFV(imageJ,transformee_de_fourier_avant_filtrage);
                                        /* Image complexe contenant la transformee de Fourier complexe de l'image                    */
                                        /* Argument (avant filtrage).                                                                */
                    BDEFV(imageJ,transformee_de_fourier_apres_filtrage);
                                        /* Image complexe contenant la transformee de Fourier complexe de l'image                    */
                                        /* Resultat (apres filtrage).                                                                */
#Aifdef   IMPLEMENTATION_DES_TRANSFORMEES_DE_FOURIER_VERSION_01
#Eifdef   IMPLEMENTATION_DES_TRANSFORMEES_DE_FOURIER_VERSION_01

#ifdef    IMPLEMENTATION_DES_TRANSFORMEES_DE_FOURIER_VERSION_02
#    define    transformee_de_fourier_avant_filtrage                                                                                    \
                         IJmageR                                                                                                        \
                                        /* Image complexe contenant la transformee de Fourier complexe de l'image                    */ \
                                        /* Argument (avant filtrage).                                                                */
#    define    transformee_de_fourier_apres_filtrage                                                                                    \
                         IJmageA                                                                                                        \
                                        /* Image complexe contenant la transformee de Fourier complexe de l'image                    */ \
                                        /* Resultat (apres filtrage).                                                                */
#Aifdef   IMPLEMENTATION_DES_TRANSFORMEES_DE_FOURIER_VERSION_02
#Eifdef   IMPLEMENTATION_DES_TRANSFORMEES_DE_FOURIER_VERSION_02

                    Test(IFNE_chaine(nom_noyauNA,NOM_PIPE))
                                        /* Test introduit le 20240707141548...                                                       */
                         Bblock
                         CALi(IFinitialisation(IFmageA1,FZERO));
                                        /* A priori...                                                                               */

                         Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(IFmageA1,nom_noyauNA))))
                              Bblock
                                        /* FA1 = image definissant le noyau de filtrage Additif...                                   */
                              Eblock
                         ATes
                              Bblock
                              Test__CODE_ERREUR__ERREUR07;
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(IFET(EST_VRAI(les_imagesR_sont_standards),IL_FAUT(respecter_les_extrema_de_l_image_Argument)))
                         Bblock
                         DEFINITION_DU_NOIR_BLANC_DE_ImageA;
                                        /* Positionnement du {NOIR,BLANC} effectif pour le 'Ifloat_std(...)' ulterieur.              */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(EST_VRAI(les_imagesN_sont_standards))
                         Bblock
                         Test(IL_FAUT(etaler_le_filtre))
                              Bblock
#include  xci/filtre.04.I"

                              SET_FILTRAGE(ACTIF);
                              CALS(Imove(ImageA2,ImageA1));
                                        /* A2 = filtre "etale".                                                                      */
                              SET_FILTRAGE(INACTIF);
                              Eblock
                         ATes
                              Bblock
                              CALS(Imove(ImageA2,ImageA1));
                                        /* A2 = filtre conserve en l'etat...                                                         */
                              Eblock
                         ETes

                         Test(IFEQ(Inivo_maximum(ImageA2),NOIR))
                              Bblock
                              PRINT_ATTENTION("le filtre 'N' est completement 'NOIR'");
                                        /* Il faut peut-etre agir alors sur 'etaler_le_filtre' et 'seuil_d_etalement_du_filtre'.     */
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(EST_VRAI(les_imagesA_sont_standards))
                         Bblock
                         CALS(Istd_float(IFmage_PR,FLOT__NOIR,FLOT__BLANC,ImageA));
                         CALS(Istd_float(IFmage_PI,FLOT__NOIR,FLOT__BLANC,ImageR));
                         Eblock
                    ATes
                         Bblock
                         CALS(IFmove(IFmage_PR,IFmageA));
                         CALi(IFinitialisation(IFmage_PI,FZERO));
                                        /* Possibilite introduite le 20060307140432...                                               */
                         Eblock
                    ETes

                    CALS(Ireelle_complexe(IJmageA,IFmage_PR));
                    CALS(Iimaginaire_complexe(IJmageA,IFmage_PI));
                                        /* Generation de l'image Argument complexe a transformee avec (ImageA,NOIR) en notant que    */
                                        /* ce faisant, la dynamique de 'ImageA' est conservee, la conversion par 'Istd_float(...)'   */
                                        /* ayant lieu dans [NOIR,BLANC].                                                             */

                    CALS(IJfourier_2D_directe_complexe(transformee_de_fourier_avant_filtrage,IJmageA));
                                        /* On fait la transformee directe,                                                           */

                    Test(IFET(IFNE_chaine(nom_image_translation_horizontale,NOM_UNDEF)
                             ,IFNE_chaine(nom_image_translation_verticale,NOM_UNDEF)
                              )
                         )
                                        /* ATTENTION, ces deux images doivent etre presentes simultanement pour qu'elles soient      */
                                        /* appliquees...                                                                             */
                         Bblock
                         Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA3,nom_image_translation_horizontale))))
                              Bblock
                              Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA4,nom_image_translation_verticale))))
                                   Bblock
                                   BDEFV(imageJ,transformee_de_fourier_apres_translation);
                                        /* Image complexe contenant la transformee de Fourier complexe de l'image                    */
                                        /* Argument (apres translation).                                                             */

                                   CALS(IJtranslation_locale_quelconque(transformee_de_fourier_apres_translation
                                                                       ,transformee_de_fourier_avant_filtrage
                                                                       ,ImageA3
                                                                       ,ImageA4
                                                                       ,translations_directes
                                                                        )
                                        );
                                        /* Et translation quelconque...                                                              */
                                   CALS(IJmove(transformee_de_fourier_avant_filtrage,transformee_de_fourier_apres_translation));
                                        /* Et mise en place de la transformee de Fourier apres translation...                        */

                                   EDEFV(imageJ,transformee_de_fourier_apres_translation);
                                        /* Image complexe contenant la transformee de Fourier complexe de l'image                    */
                                        /* Argument (apres translation).                                                             */
                                   Eblock
                              ATes
                                   Bblock
                                   Test__CODE_ERREUR__ERREUR07;
                                   Eblock
                              ETes
                              Eblock
                         ATes
                              Bblock
                              Test__CODE_ERREUR__ERREUR07;
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(IFET(IFNE_chaine(nom_image_deplacement_horizontal,NOM_UNDEF)
                             ,IFNE_chaine(nom_image_deplacement_vertical,NOM_UNDEF)
                              )
                         )
                                        /* ATTENTION, ces deux images doivent etre presentes simultanement pour qu'elles soient      */
                                        /* appliquees...                                                                             */
                         Bblock
                         Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA3,nom_image_deplacement_horizontal))))
                              Bblock
                              Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA4,nom_image_deplacement_vertical))))
                                   Bblock
                                   BDEFV(imageJ,transformee_de_fourier_apres_deplacement);
                                        /* Image complexe contenant la transformee de Fourier complexe de l'image                    */
                                        /* Argument (apres deplacement).                                                             */

                                   CALS(IJdeplacement_local_quelconque(transformee_de_fourier_apres_deplacement
                                                                      ,transformee_de_fourier_avant_filtrage
                                                                      ,ImageA3
                                                                      ,ImageA4
                                                                       )
                                        );
                                        /* Et translation quelconque...                                                              */
                                   CALS(IJmove(transformee_de_fourier_avant_filtrage,transformee_de_fourier_apres_deplacement));
                                        /* Et mise en place de la transformee de Fourier apres translation...                        */

                                   EDEFV(imageJ,transformee_de_fourier_apres_deplacement);
                                        /* Image complexe contenant la transformee de Fourier complexe de l'image                    */
                                        /* Argument (apres deplacement).                                                             */
                                   Eblock
                              ATes
                                   Bblock
                                   Test__CODE_ERREUR__ERREUR07;
                                   Eblock
                              ETes
                              Eblock
                         ATes
                              Bblock
                              Test__CODE_ERREUR__ERREUR07;
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(IL_FAUT(filtrer))
                         Bblock
                         Test(EST_VRAI(les_imagesN_sont_standards))
                              Bblock
                              CALS(IJfiltrage_multiplicatif(transformee_de_fourier_apres_filtrage
                                                           ,transformee_de_fourier_avant_filtrage
                                                           ,ImageA2
                                                           ,ImageA2
                                                           ,ADRESSE(translation)
                                                           ,ADRESSE(translation)
                                                            )
                                   );
                                        /* Filtrage par le noyau "etale" Multiplicatif "standard".                                   */
                              Eblock
                         ATes
                              Bblock
                              CALS(IJFfiltrage_multiplicatif(transformee_de_fourier_apres_filtrage
                                                            ,transformee_de_fourier_avant_filtrage
                                                            ,IFmageA2
                                                            ,IFmageA2
                                                            ,ADRESSE(translation)
                                                            ,ADRESSE(translation)
                                                             )
                                   );
                                        /* Filtrage par le noyau Multiplicatif "flottant".                                           */
                              Eblock
                         ETes

                         Test(IL_FAUT(editer_les_extrema))
                                        /* Test introduit le 20240708081512...                                                       */
                              Bblock
                              CAL3(Prme2("MinimumMultiplicatif=(%+.^^^,%+.^^^)\n"
                                        ,IJfiltrage_multiplicatif_____minimum_Reelle____
                                        ,IJfiltrage_multiplicatif_____minimum_Imaginaire
                                         )
                                   );
                              CAL3(Prme2("MaximumMultiplicatif=(%+.^^^,%+.^^^)\n"
                                        ,IJfiltrage_multiplicatif_____maximum_Reelle____
                                        ,IJfiltrage_multiplicatif_____maximum_Imaginaire
                                         )
                                   );
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes

                         Test(IFNE_chaine(nom_noyauNA,NOM_PIPE))
                                        /* Test introduit le 20240707141548...                                                       */
                              Bblock
                              CALS(IJFfiltrage_additif(transformee_de_fourier_apres_filtrage
                                                      ,transformee_de_fourier_apres_filtrage
                                                      ,IFmageA1
                                                      ,IFmageA1
                                                      ,ADRESSE(translation)
                                                      ,ADRESSE(translation)
                                                       )
                              );
                                        /* Filtrage par le noyau Additif.                                                            */

                              Test(IL_FAUT(editer_les_extrema))
                                        /* Test introduit le 20240708081512...                                                       */
                                   Bblock
                                   CAL3(Prme2("MinimumAdditif=(%+.^^^,%+.^^^)\n"
                                             ,IJFfiltrage_additif_____minimum_Reelle____
                                             ,IJFfiltrage_additif_____minimum_Imaginaire
                                              )
                                        );
                                   CAL3(Prme2("MaximumAdditif=(%+.^^^,%+.^^^)\n"
                                             ,IJFfiltrage_additif_____maximum_Reelle____
                                             ,IJFfiltrage_additif_____maximum_Imaginaire
                                              )
                                        );
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes

                         Eblock
                    ATes
                         Bblock
                         CALS(IJmove(transformee_de_fourier_apres_filtrage,transformee_de_fourier_avant_filtrage));
                                        /* Pas de filtrage...                                                                        */
                         Eblock
                    ETes

                    CALS(IJfourier_2D_inverse_complexe(IJmageR,transformee_de_fourier_apres_filtrage));
                                        /* Puis la transformee inverse.                                                              */

#include  xci/filtre.05.I"

                    CALi(gIupdate_image(les_imagesR_sont_standards,nom_imageR,ImageR,IFmage_PR));

#ifdef    IMPLEMENTATION_DES_TRANSFORMEES_DE_FOURIER_VERSION_01
                    EDEFV(imageJ,transformee_de_fourier_apres_filtrage);
                                        /* Image complexe contenant la transformee de Fourier complexe de l'image                    */
                                        /* Resultat (apres filtrage).                                                                */
                    EDEFV(imageJ,transformee_de_fourier_avant_filtrage);
                                        /* Image complexe contenant la transformee de Fourier complexe de l'image                    */
                                        /* Argument (avant filtrage).                                                                */
#Aifdef   IMPLEMENTATION_DES_TRANSFORMEES_DE_FOURIER_VERSION_01
#Eifdef   IMPLEMENTATION_DES_TRANSFORMEES_DE_FOURIER_VERSION_01

                    Eblock
               ATes
                    Bblock
                    Test__CODE_ERREUR__ERREUR07;
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Test__CODE_ERREUR__ERREUR07;
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Test(IFOU(IFOU(IFOU(IFNE_chaine(nom_image_translation_horizontale,NOM_UNDEF)
                             ,IFNE_chaine(nom_image_translation_verticale,NOM_UNDEF)
                              )
                        ,IFOU(IFNE_chaine(nom_image_deplacement_horizontal,NOM_UNDEF)
                             ,IFNE_chaine(nom_image_deplacement_vertical,NOM_UNDEF)
                              )
                         )
                   ,I3OU(IFEQ_chaine(nom_imageA,NOM_PIPE)
                        ,IFEQ_chaine(nom_noyauNM,NOM_PIPE)
                        ,IFEQ_chaine(nom_imageR,NOM_PIPE)
                         )
                    )
               )
               Bblock
               PRINT_ERREUR("les images doivent etre carrees (dimX=dimY et pasX=pasY)");
               PRINT_ATTENTION("le redimensionnement intermediaire 'Sdu/Squ/Shu' ne peut etre effectue");
                                        /* On notera que par la suite 'Sxu' designe l'un des formats {Sdu,Squ,Shu} correspondant     */
                                        /* au format carre et puissance de 2 immediatement superieur au '$formatI' courant...        */
               PRINT_ATTENTION("et ce pour deux raisons potentielles non exclusives l'une de l'autre :");
               PRINT_ATTENTION("1-l'une au moins des options [A=,NM=,R=] reference le 'pipe'");
               PRINT_ATTENTION("2-l'une au moins des options [tX=,tY=,dX=,dY=] est presente et reference une image");
                                        /* Lorsque des translations et/ou des deplacements sont demandes, on ne peut tenter le       */
                                        /* redimensionnement intermediaire 'Sxu' car c'est trop complique. Il en est de meme         */
                                        /* si l'une des images {A,N,R} arrive par le "pipe" ; ceci est evidemment du aux commandes   */
                                        /* que l'on va generer ci-apres...                                                           */
               Eblock
          ATes
               Bblock
               DEFV(CHAR,INIC(POINTERc(nom_imageA_Sxu),NOM_UNDEF));
               DEFV(CHAR,INIC(POINTERc(nom_noyauNM_Sxu),NOM_UNDEF));
               DEFV(CHAR,INIC(POINTERc(nom_noyauNA_Sxu),NOM_UNDEF));
               DEFV(CHAR,INIC(POINTERc(nom_gaussNM____),NOM_UNDEF));
               DEFV(CHAR,INIC(POINTERc(nom_imageR_Sxu),NOM_UNDEF));
                                        /* Pour pouvoir manipuler des copies 'Sxu' des images {nom_imageR,nom_imageA,nom_noyauNM}.   */
               DEFV(CHAR,INIC(POINTERc(commande_de_filtrage_Sxu),CHAINE_UNDEF));
                                        /* Definition de la commande filtrage en mode 'Sxu'.                                         */
               DEFV(Positive,INIT(nombre_de_coincidences_des_noyaux,ZERO));
                                        /* Nombre de coincidences entre le noyau argument ('ImageA1') et le noyau "implicite"        */
                                        /* ('ImageA5'). La valeur initiale ('ZERO') est choisie de facon a ce qu'il n'y ait          */
                                        /* a priori pas de coincidences...                                                           */

               DEFV(Float,INIT(logarithme_en_base_2_de_la_plus_grande_dimension,LO2X(MAX2(dimX,dimY))));
               DEFV(Int,INIT(logarithme_entier_en_base_2_de_la_plus_grande_dimension,UNDEF));

               Test(EST_ENTIER(logarithme_en_base_2_de_la_plus_grande_dimension))
                    Bblock
                                        /* Lorsque le logarithme en base 2 de la plus grande dimension est entier, cela signifie     */
                                        /* que cette plus grande dimension est deja une puissance de 2...                            */
                    Eblock
               ATes
                    Bblock
                    INCR(logarithme_en_base_2_de_la_plus_grande_dimension,I);
                                        /* Dans le cas contraire, en ajoutant une unite, lors du 'INTE(...)' qui suivra, on          */
                                        /* obtiendra la plus petite puissance de 2 immediatement superieure a la plus grande         */
                                        /* dimension...                                                                              */
                    Eblock
               ETes

               EGAL(logarithme_entier_en_base_2_de_la_plus_grande_dimension,INTE(logarithme_en_base_2_de_la_plus_grande_dimension));
                                        /* Ainsi, on va obtenir le plus petit carre dont le cote soit une puissance de 2 et qui      */
                                        /* englobe le format '$formatI' courant (calcul introduit le 20120906174241).                */


               Test(IL_FAUT(avertir_s_il_y_a_redimensionnement))
                    Bblock
                    PRINT_ATTENTION("un redimensionnement intermediaire 'Sdu/Squ/Shu' va etre effectue automatiquement");
                                        /* Cette fonctionalite a ete introduite le 19990414112509.                                   */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               EGAL(nom_imageA_Sxu,generation_d_un_nom_absolu_dans_xT_temporaire("A"));
               EGAL(nom_noyauNM_Sxu,generation_d_un_nom_absolu_dans_xT_temporaire("NM"));

               Test(IFNE_chaine(nom_noyauNA,NOM_PIPE))
                                        /* Test introduit le 20240707141548...                                                       */
                    Bblock
                    EGAL(nom_noyauNA_Sxu,generation_d_un_nom_absolu_dans_xT_temporaire("NA"));
                    Eblock
               ATes
                    Bblock
                    EGAL(nom_noyauNA_Sxu,nom_noyauNA);
                    Eblock
               ETes

               EGAL(nom_gaussNM____,generation_d_un_nom_absolu_dans_xT_temporaire("G"));
               EGAL(nom_imageR_Sxu,generation_d_un_nom_absolu_dans_xT_temporaire("R"));
                                        /* Creation des noms des copies 'Sxu' des images {nom_imageR,nom_imageA,nom_noyauNM}.        */

#define   MODE_REDIMENSIONNEMENT_POUR_LES_IMAGES                                                                                        \
                    COND(EST_VRAI(les_imagesR_sont_standards)                                                                           \
                        ,COND(IL_FAUT(compatibilite_20030910)                                                                           \
                             ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_AU_CENTRE                                              \
                             ,COND(IL_FAUT(compatibilite_20210106)                                                                      \
                                  ,REECHANTILLONNAGE_PAR_INTERPOLATION_BICUBIQUE                                                        \
                                  ,methode_de_redimensionnement_a_utiliser_pour_les_images                                              \
                                   )                                                                                                    \
                              )                                                                                                         \
                        ,COND(IL_FAUT(compatibilite_20210106)                                                                           \
                             ,REECHANTILLONNAGE_PAR_INTERPOLATION_BICUBIQUE                                                             \
                             ,methode_de_redimensionnement_a_utiliser_pour_les_images                                                   \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Mode a utiliser pour redimensionner les images.                                           */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : j'ai note le 20030909094922 que le redimensionnement n'etait pas du tout le   */ \
                                        /* meme suivant que l'image etait standard ou pas ; si elle n'est pas standard, cette        */ \
                                        /* operation lui fait occuper tout l'espace de l'image 'Sxu' alors que si elle est standard, */ \
                                        /* elle va se trouver au centre de l'image 'Sxu' entouree de NOIR. Cela a donc des           */ \
                                        /* consequences evidentes sur le resultat ; cela s'est vu lors de la generation de la        */ \
                                        /* sequence 'v _____xivPdf_06_2/033309_033436' qui avait utilisee "standard=FAUX" ce qui     */ \
                                        /* a donne alors un resultat tres different de 'v $xiia/TREF.21 p=$xiP/fract.02$Fi'. Cette   */ \
                                        /* sequence a donc ete regeneree en 'v _____xivPdf_06_2/033437_033564'...                    */ \
                                        /*                                                                                           */ \
                                        /* Le 20030910101808 il a fallu imposer 'REECHANTILLONNAGE_PAR_INTERPOLATION_BICUBIQUE'      */ \
                                        /* car, en effet, c'est le seul mode qui existe que les images soient standards ou pas.      */ \
                                        /* Or a compter du 20030910092458 le resultat du filtrage au format 'Sxu' est une image      */ \
                                        /* qui n'est pas standard ; il convient donc que tous les changement de format se fassent    */ \
                                        /* avec le meme mode (et donc 'REECHANTILLONNAGE_PAR_INTERPOLATION_BICUBIQUE'...) afin       */ \
                                        /* que l'on retombe sur ses pieds (lors du passage au format 'Sxu' et du retour au           */ \
                                        /* format original...).                                                                      */
#define   MODE_REDIMENSIONNEMENT_POUR_LES_NOYAUX                                                                                        \
                    COND(EST_VRAI(les_imagesR_sont_standards)                                                                           \
                        ,COND(IL_FAUT(compatibilite_20030910)                                                                           \
                             ,REECHANTILLONNAGE_SANS_REECHANTILLONNAGE_AVEC_MISE_AU_CENTRE                                              \
                             ,COND(IL_FAUT(compatibilite_20210107)                                                                      \
                                  ,REECHANTILLONNAGE_PAR_INTERPOLATION_BICUBIQUE                                                        \
                                  ,methode_de_redimensionnement_a_utiliser_pour_les_noyaux                                              \
                                   )                                                                                                    \
                              )                                                                                                         \
                        ,COND(IL_FAUT(compatibilite_20210107)                                                                           \
                             ,REECHANTILLONNAGE_PAR_INTERPOLATION_BICUBIQUE                                                             \
                             ,methode_de_redimensionnement_a_utiliser_pour_les_noyaux                                                   \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Mode a utiliser pour redimensionner les noyaux (introduit le 20210107100532). En effet    */ \
                                        /* les noyaux ne peuvent pas etre redimensionne comme les images sous peine d'introduire     */ \
                                        /* des anisotropies (c'est par exemple le cas d'un noyau gaussien qui est parfaitement       */ \
                                        /* symetrique et fait de cercles concentriques qui risquaient anterieurement de devenir      */ \
                                        /* des ellipses...).                                                                         */

#define   NATURE_DES_IMAGES_A                                                                                                           \
                    ETAT_LOGIQUE(les_imagesA_sont_standards)                                                                            \
                                        /* Nature des images a filtrer (introduit le 20060307140432)...                              */

#define   NATURE_DES_IMAGES_N                                                                                                           \
                    ETAT_LOGIQUE(les_imagesN_sont_standards)                                                                            \
                                        /* Nature des noyaux (introduit le 20240812122025)...                                        */

               EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(chain_Aconcaten13
                                                              (GENERATION_NOM_D_UNE_COMMANDE_X(Direct_xci,"format.01")
                                                              ," A=",nom_imageA
                                                              ," standard=",NATURE_DES_IMAGES_A
                                                              ," MdefRedim=",C_FAUX____
                                                              ," mode=",chain_Aentier(MODE_REDIMENSIONNEMENT_POUR_LES_IMAGES)
                                                              ," R=",nom_imageA_Sxu
                                                              ,GENERATION_DE_formatI
                                                              ,GENERATION_DE_formatR_Sxu
                                                               )
                                                          );
                                        /* Redimensionnement au format 'Sxu' de l'image Argument.                                    */

               EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(chain_Aconcaten6(GENERATION_NOM_D_UNE_COMMANDE_X(Direct_xci,"gauss")
                                                                          ," standard=",NATURE_DES_IMAGES_N
                                                                          ," R=",nom_gaussNM____
                                                                          ,GENERATION_DE_formatI
                                                                           )
                                                          );
                                        /* Generation d'un noyau de filtrage avec les options implicites de '$xci/gauss$X' et        */
                                        /* avec la dimension definie par '$formatI'.                                                 */

               Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_imagesN_sont_standards,ImageA1,IFmageA2,nom_noyauNM))))
                    Bblock
                                        /* A1 = image definissant le noyau de filtrage.                                              */
                    Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_imagesN_sont_standards,ImageA5,IFmageA3,nom_gaussNM____))))
                         Bblock
                                        /* A5 = noyau de filtrage "implicite".                                                       */
                         EGAL(nombre_de_coincidences_des_noyaux
                             ,gIcomptage_des_coincidences(les_imagesN_sont_standards,ImageA1,IFmageA2,ImageA5,IFmageA3)
                              );
                                        /* En comptant les coincidences entre le noyau argument ('ImageA1') et le noyau "implicite"  */
                                        /* ('ImageA5'), il est possible de savoir si le noyau argument a ete genere de facon         */
                                        /* "implicite" par '$xci/gauss$X'...                                                         */
                         Eblock
                    ATes
                         Bblock
                         Test__CODE_ERREUR__ERREUR07;
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Test__CODE_ERREUR__ERREUR07;
                    Eblock
               ETes

               Test(IFNE(nombre_de_coincidences_des_noyaux,dimXY))
                    Bblock
                                        /* Cas ou le noyau argument ('ImageA1') n'a pas ete genere de facon "implicite" par          */
                                        /* '$xci/gauss$X', on ne peut que redimensionner "betement" le noyau argument :              */

                    Test(IL_FAUT(avertir_en_presence_d_un_noyau_de_filtrage_non_implicite))
                         Bblock
                                        /* Test introduit le 20060515112945...                                                       */
                         PRINT_ATTENTION("le noyau de filtrage n'est pas 'implicite', il va etre redimensionne 'brutalement'");
                                        /* Cette fonctionalite a ete introduite le 19990427092629. Le "brutalement" signifie que     */
                                        /* l'on rajoute du 'NOIR' autour pour obtenir la dimension 'Sxu'...                          */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(chain_Aconcaten13
                        (GENERATION_NOM_D_UNE_COMMANDE_X(Direct_xci,"format.01")
                        ," A=",nom_noyauNM
                        ," standard=",NATURE_DES_IMAGES_N
                        ," MdefRedim=",C_FAUX____
                        ," mode=",chain_Aentier(MODE_REDIMENSIONNEMENT_POUR_LES_NOYAUX)
                        ," R=",nom_noyauNM_Sxu
                        ,GENERATION_DE_formatI
                        ,GENERATION_DE_formatR_Sxu
                         )
                                                               );
                                        /* Redimensionnement au format 'Sxu' de l'image Noyau M. ATTENTION, evidemment le noyau      */
                                        /* utilise en mode 'Sxu' correspond au Noyau argument avec du 'NOIR' autour...               */
                    Eblock
               ATes
                    Bblock
                                        /* Cas ou le noyau argument ('ImageA1') a ete genere de facon "implicite" par                */
                                        /* '$xci/gauss$X', on peut donc le regenerer de facon "implicite" en mode 'Sxu' :            */
                    EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(chain_Aconcaten6(GENERATION_NOM_D_UNE_COMMANDE_X(Direct_xci,"gauss")
                                                                               ," standard=",NATURE_DES_IMAGES_N
                                                                               ," R=",nom_noyauNM_Sxu
                                                                               ,GENERATION_DE_formatI_Sxu
                                                                                )
                                                               );
                                        /* Generation du noyau de filtrage correspondant au noyau argument en mode 'Sxu'...          */
                    Eblock
               ETes

               Test(IFNE_chaine(nom_noyauNA,NOM_PIPE))
                                        /* Test introduit le 20240707141548...                                                       */
                    Bblock
                    EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(chain_Aconcaten13
                        (GENERATION_NOM_D_UNE_COMMANDE_X(Direct_xci,"format.01")
                        ," A=",nom_noyauNA
                        ," standard=",C_FAUX____
                        ," MdefRedim=",C_FAUX____
                        ," mode=",chain_Aentier(MODE_REDIMENSIONNEMENT_POUR_LES_NOYAUX)
                        ," R=",nom_noyauNA_Sxu
                        ,GENERATION_DE_formatI
                        ,GENERATION_DE_formatR_Sxu
                         )
                                                               );
                                        /* Redimensionnement au format 'Sxu' de l'image Noyau A.                                     */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               RECONSTITUTION_DE_LA_COMMANDE_COURANTE(commande_de_filtrage_Sxu);
                                        /* Recuperation de la commande de filtrage courante. On notera que l'on recopie donc en      */
                                        /* particulier les arguments :                                                               */
                                        /*                                                                                           */
                                        /*                  A=...                                                                    */
                                        /*                  N=...                                                                    */
                                        /*                  R=...                                                                    */
                                        /*                  $formatI                                                                 */
                                        /*                                                                                           */
                                        /* mais que ces valeurs seront ulterieurement ignorees, car, ci-apres, vont etre rajoutees   */
                                        /* derriere la chaine courante 'commande_de_filtrage_Sxu' les veritables arguments           */
                                        /* {nom_imageA_Sxu,nom_noyauNM_Sxu,nom_imageR_Sxu,format_Sxu} a utiliser lors du filtrage    */
                                        /* 'Sxu'. Malheureusement, cela n'implique pas que l'un de ces arguments puisse referencer   */
                                        /* 'NOM_PIPE' ; en effet, le redimensionnement au format 'Sxu' de l'image Noyau, lorsqu'il   */
                                        /* necessaire, l'interdit...                                                                 */

#define   NATURE_DES_IMAGES_R                                                                                                           \
                    ETAT_LOGIQUE(COND(IL_FAUT(compatibilite_20030910),les_imagesR_sont_standards,FAUX))                                 \
                                        /* Nature des images a generer (introduit le 20030910092458)...                              */

               EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(chain_Aconcaten16(commande_de_filtrage_Sxu
                                                                           ," A=",nom_imageA_Sxu
                                                                           ," NM=",nom_noyauNM_Sxu
                                                                           ," NA=",nom_noyauNA_Sxu
                                                                           ," standardA=",NATURE_DES_IMAGES_A
                                                                           ," standardN=",NATURE_DES_IMAGES_N
                                                                           ," standardR=",NATURE_DES_IMAGES_R
                                                                           ," R=",nom_imageR_Sxu
                                                                           ,GENERATION_DE_formatI_Sxu
                                                                            )
                                                          );
                                        /* Execution de la commande de filtrage en mode 'Sxu' avec les arguments temporaires 'Sxu'.  */

               EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(chain_Aconcaten14
                                                              (GENERATION_NOM_D_UNE_COMMANDE_X(Direct_xci,"format.01")
                                                              ," A=",nom_imageR_Sxu
                                                              ," standard=",NATURE_DES_IMAGES_R
                                                              ," MdefRedim=",C_FAUX____
                                                              ," mode=",chain_Aentier(MODE_REDIMENSIONNEMENT_POUR_LES_IMAGES)
                                                              ," R=",nom_imageR
                                                              ,GENERATION_DE_formatI_Sxu
                                                              ,GENERATION_DE_formatR,GENERATION_DE_PasX_PasY_TraX_TraY
                                                               )
                                                          );
                                        /* Remise au format demande de l'image Resultat.                                             */

#undef    NATURE_DES_IMAGES_R
#undef    NATURE_DES_IMAGES_A

               Test(IL_FAUT(compatibilite_20030910))
                    Bblock
                    Eblock
               ATes
                    Bblock
                                        /* Le 20030910092458 il a ete decide de conserve le resultat du filtrage 'Sxu' precedent     */
                                        /* sous forme d'une image non standard et de la redimensionner dans ce format a l'aide       */
                                        /* du mode 'REECHANTILLONNAGE_PAR_INTERPOLATION_BICUBIQUE'. Ceci permet de garantir une      */
                                        /* gestion correcte des extrema des niveaux de l'image Resultat... Anterieurement a cette    */
                                        /* date, avec les arguments implicites, les niveaux d'une image Resultat de format non       */
                                        /* carre n'utilisaient pas tout le segment [NOIR,BLANC]. Au passage, cela a simultanement    */
                                        /* attenue (voire fait disparaitre...) les effets de bord...                                 */

#define   NATURE_DES_IMAGES_R                                                                                                           \
                    ETAT_LOGIQUE(les_imagesR_sont_standards)
#define   ZERO_DES_IMAGES                                                                                                               \
                    ETAT_LOGIQUE(Ifloat_std_____conserver_le_zero)
                                        /* Uniquement afin de raccorcir certaines lignes suivantes...                                */

                    EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(chain_Aconcaten15
                                                                   (GENERATION_NOM_D_UNE_COMMANDE_X(Direct_xci,"acces")
                                                                   ," A=",nom_imageR
                                                                   ," standard=",C_FAUX____
                                                                   ," convertir_non_standard=",NATURE_DES_IMAGES_R
                                                                   ," extrema=",C_VRAI____
                                                                   ," zero=",ZERO_DES_IMAGES
                                                                   ," R=",nom_imageR
                                                                   ,GENERATION_DE_formatI,GENERATION_DE_PasX_PasY_TraX_TraY
                                                                    )
                                                               );
                                        /* Enfin, conversion eventuelle...                                                           */

#undef    ZERO_DES_IMAGES
#undef    NATURE_DES_IMAGES_R

                    Eblock
               ETes

               CALZ_FreCC(commande_de_filtrage_Sxu);

               Test(IFET(EST_VRAI(les_imagesR_sont_standards),IL_FAUT(respecter_les_extrema_de_l_image_Argument)))
                    Bblock
                    Test(IFNE_chaine(nom_imageA,nom_imageR))
                         Bblock
                         Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA,nom_imageA))))
                              Bblock
                                        /* A  = image a filtrer.                                                                     */
                              Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageR,nom_imageR))))
                                   Bblock
                                        /* R  = image filtree (et oui, le 20020107123233, il a fallu introduire cette mise a jour    */
                                        /* de 'ImageR' qui vient d'etre calculee via un redimensionnement 'Sxu' lorsque le respect   */
                                        /* des extrema de 'ImageA' a ete demande...                                                  */
                                   BDEFV(imageF,image_flottante);
                                        /* Image flottante dans laquelle on trouve l'image a renormaliser.                           */

                                   DEFINITION_DU_NOIR_BLANC_DE_ImageA;
                                        /* Positionnement du {NOIR,BLANC} effectif pour le 'Ifloat_std_avec_renormalisation(...)'    */
                                        /* qui va suivre...                                                                          */

                                   CALS(Irenormalisation(ImageR,ImageR));
                                        /* Lorsque 'IL_FAUT(respecter_les_extrema_de_l_image_Argument)' et qu'il y a eu (ci-avant)   */
                                        /* un redimensionnement, le respect des extrema de 'ImageA' a eu lieu dans une image au      */
                                        /* format 'Sxu'. Lors du redimensionnement de retour au format courant, l'image 'ImageR'     */
                                        /* extraite a bien peu de chance de conserver ce respect (en particulier, les extrema        */
                                        /* pouvaient tres bien etre en dehors de l'image 'ImageR' redimensionnee puisqu'elle est     */
                                        /* plus petite que l'image 'Sxu'...).                                                        */

                                   CALi(Iupdate_image(nom_imageR,ImageR));
                                        /* Et mise a jour de 'ImageR'...                                                             */

                                   EDEFV(imageF,image_flottante);
                                        /* Image flottante dans laquelle on trouve l'image a renormaliser.                           */
                                   Eblock
                              ATes
                                   Bblock
                                   Test__CODE_ERREUR__ERREUR07;
                                   Eblock
                              ETes
                              Eblock
                         ATes
                              Bblock
                              Test__CODE_ERREUR__ERREUR07;
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         PRINT_ERREUR("le respect des niveaux de l'image Argument ne peut avoir lieu");
                         PRINT_ERREUR("(les noms des images Argument et Resultat sont identiques)");
                                        /* En effet, etant donne qu'on doit relire 'ImageA' et 'ImageR', puis utiliser 'ImageA'      */
                                        /* pour renormaliser 'ImageR', si les deux images sont identiques, il y a probleme...        */
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

#undef    MODE_REDIMENSIONNEMENT_POUR_LES_IMAGES

               CALS(Idelete_image(nom_imageA_Sxu));
               CALZ_FreCC(nom_imageA_Sxu);

               Test(IFNE_chaine(nom_noyauNA,NOM_PIPE))
                                        /* Test introduit le 20240708112313...                                                       */
                    Bblock
                    CALS(Idelete_image(nom_noyauNA_Sxu));
                    CALZ_FreCC(nom_noyauNA_Sxu);
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               CALS(Idelete_image(nom_noyauNM_Sxu));
               CALZ_FreCC(nom_noyauNM_Sxu);

               CALS(Idelete_image(nom_gaussNM____));
               CALZ_FreCC(nom_gaussNM____);

               CALS(Idelete_image(nom_imageR_Sxu));
               CALZ_FreCC(nom_imageR_Sxu);
                                        /* Nettoyage...                                                                              */
               Eblock
          ETes
          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.