/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E   L A   D I M E N S I O N   F R A C T A L E   G E N E R A L I S E E                                      */
/*        P A R   E X A M E N   D U   V O I S I N A G E   D E S   P O I N T S                                                        */
/*        E T   P E R M E T T A N T   S I M U L T A N E M E N T   L ' E X T R A C T I O N   D E   C O N T O U R S  :                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Cette commande calcule la dimension                                                                            */
/*                  fractale generalisee en examinant le                                                                             */
/*                  voisinage des points par convolution.                                                                            */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/dimension.02$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1993??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I R E C T I V E S   S P E C I F I Q U E S   D E   C O M P I L A T I O N  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   SEUIL_D_INHIBITION                                                                                                            \
                    GRIS_4                                                                                                              \
                                        /* Seuil de definition de l'autorisation (>=seuil) ou d'inhibition (<seuil) du noyau.        */

#define   EDITER_LE_NOYAU                                                                                                               \
                    FAUX                                                                                                                \
                                        /* Indique s'il faut editer les valeurs du noyau ('VRAI') ou pas ('FAUX').                   */

#define   LE_NOYAU_DE_CONVOLUTION_EST_CARRE                                                                                             \
                    VRAI                                                                                                                \
                                        /* Indique si le noyau de convolution est carre ('VRAI') ou circulaire ('FAUX').             */
#define   NOMBRE_DE_POINTS_DU_NOYAU                                                                                                     \
                    EXP2(DOUP(QUATRE))                                                                                                  \
                                        /* Nombre de points du noyau. On notera qu'il est prefererable que le noyau soit symetrique  */ \
                                        /* ce qui implique que sa dimension soit le carre d'un nombre impair, auquel cas, il a un    */ \
                                        /* centre...                                                                                 */

#define   METHODE_LINEAIRE                                                                                                              \
                    VRAI                                                                                                                \
                                        /* Cet indicateur precise si l'on doit utiliser la methode lineaire ('VRAI') qui consiste    */ \
                                        /* a regarder les pentes des droites formees par les couples de points, ou a ajuster une     */ \
                                        /* courbe parabolique passant par les trois points calcules...                               */

#define   NORMALISER_LE_NOMBRE_DE_POINTS_GENERALISE                                                                                     \
                    VRAI                                                                                                                \
                                        /* Cet indicateur precise si l'on doit normaliser le nombre de points generalise ('VRAI')    */ \
                                        /* ou bien le laisser tel quel et donc certainement non entier ('FAUX').                     */
#define   NORMALISER_GLOBALEMENT_LES_IMAGES_COEFFICIENTS                                                                                \
                    VRAI                                                                                                                \
                                        /* Cet indicateur precise si l'on doit normaliser globalement les trois image coefficients   */ \
                                        /* 'c1', 'c2' et 'c3' ('VRAI') ou localement ('FAUX'). Cette possibilite a ete introduite    */ \
                                        /* le 20151105112345, la valeur par defaut garantissant la compatibilite anterieure.         */

#define   EN_VUE_D_EXTRAIRE_DES_CONTOURS                                                                                                \
                    FAUX                                                                                                                \
                                        /* Option destinee a assurer (lorsque sa valeur est 'VRAI') la compatibilite avec le         */ \
                                        /* fonctionnement anterieur au 20020226095028 ('v $xiio/LENA_CONT.11'). Cette compatibilite  */ \
                                        /* sera complete en utilisant les parametres suivant :                                       */ \
                                        /*                                                                                           */ \
                                        /*                  contours=VRAI normaliser=FAUX eviter=-1                                  */ \
                                        /*                                                                                           */

#define   COMPATIBILITE_20070621                                                                                                        \
                    FAUX                                                                                                                \
                                        /* Permet de proceder a des calculs de dimension fractale compatibles avec ceux effectues    */ \
                                        /* anterieurement au 20070621101434.                                                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xci/convol.01.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E   L A   D I M E N S I O N   F R A C T A L E   G E N E R A L I S E E                                      */
/*        P A R   E X A M E N   D U   V O I S I N A G E   D E S   P O I N T S  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageV),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageF),NOM_PIPE));
                                        /* Nom de l'image a displayer. On notera que par defaut :                                    */
                                        /*                                                                                           */
                                        /*                  imageV = BLANC                                                           */
                                        /*                  imageF = seuil_d_inhibition                                              */
                                        /*                                                                                           */
     DEFV(CHAR,INIC(POINTERc(nom_imageR2),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageR1),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageR0),NOM_PIPE));
                                        /* Nom des trois images Resultat donnant les coefficients 'c1', 'c2' et 'c3'.                */
     DEFV(Logical,INIT(le_noyau_de_convolution_est_carre,LE_NOYAU_DE_CONVOLUTION_EST_CARRE));
                                        /* Indique si le noyau de convolution est carre ('VRAI') ou circulaire ('FAUX').             */
     DEFV(Logical,DTb1(niveaux_a_traiter,COULEURS));
                                        /* Definit les niveaux sur lesquels on doit faire la convolution par 'Pconvolution()'.       */
     DEFV(Logical,DTb1(niveaux_cumulables,COULEURS));
                                        /* Definit les niveaux cumulables lors du calcul de 'Pconvolution_____cumul_courant'.        */
     DEFV(genere_p,INIT(seuil_d_inhibition,SEUIL_D_INHIBITION));
                                        /* Seuil de definition de l'autorisation (>=seuil) ou d'inhibition (<seuil) du noyau.        */
     DEFV(Int,INIT(nombre_de_points,NOMBRE_DE_POINTS_DU_NOYAU));
                                        /* Nombre de points du noyau. On notera qu'il est prefererable que le noyau soit symetrique  */
                                        /* ce qui implique que sa dimension soit le carre d'un nombre impair, auquel cas, il a un    */
                                        /* centre...                                                                                 */
     DEFV(Float,DTb1(noyau,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION));
                                        /* Noyau de la convolution,                                                                  */
     DEFV(Logical,DTb1(inhibition_du_noyau,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION));
                                        /* Et sa liste d'activite.                                                                   */
     DEFV(Int,INIT(index,UNDEF));
                                        /* Index d'initialisation du noyau.                                                          */
     DEFV(Logical,INIT(editer_le_noyau,EDITER_LE_NOYAU));
                                        /* Indique s'il faut editer les valeurs du noyau ('VRAI') ou pas ('FAUX').                   */
     DEFV(Logical,INIT(methode_lineaire,METHODE_LINEAIRE));
                                        /* Cet indicateur precise si l'on doit utiliser la methode lineaire ('VRAI') qui consiste    */
                                        /* a regarder les pentes des droites formees par les couples de points, ou a ajuster une     */
                                        /* courbe parabolique passant par les trois points calcules...                               */
     DEFV(Logical,INIT(normaliser_le_nombre_de_points_generalise,NORMALISER_LE_NOMBRE_DE_POINTS_GENERALISE));
                                        /* Cet indicateur precise si l'on doit normaliser le nombre de points generalise ('VRAI')    */
                                        /* ou bien le laisser tel quel et donc certainement non entier ('FAUX').                     */
     DEFV(Logical,INIT(normaliser_globalement_les_images_coefficients,NORMALISER_GLOBALEMENT_LES_IMAGES_COEFFICIENTS));
                                        /* Cet indicateur precise si l'on doit normaliser globalement les trois image coefficients   */
                                        /* 'c1', 'c2' et 'c3' ('VRAI') ou localement ('FAUX'). Cette possibilite a ete introduite    */
                                        /* le 20151105112345, la valeur par defaut garantissant la compatibilite anterieure.         */

     DEFV(Logical,INIT(en_vue_d_extraire_des_contours,EN_VUE_D_EXTRAIRE_DES_CONTOURS));
                                        /* Option destinee a assurer (lorsque sa valeur est 'VRAI') la compatibilite avec le         */
                                        /* fonctionnement anterieur au 20020226095028 ('v $xiio/LENA_CONT.11'). Cette compatibilite  */
                                        /* sera complete en utilisant les parametres suivant :                                       */
                                        /*                                                                                           */
                                        /*                  contours=VRAI normaliser=FAUX eviter=-1                                  */
                                        /*                                                                                           */

     DEFV(genere_Float,INIT(minimum_du_coefficient_de_d2,F_INFINI));
     DEFV(genere_Float,INIT(maximum_du_coefficient_de_d2,F_MOINS_L_INFINI));
                                        /* Extrema du coefficient 'c2'.                                                              */
     DEFV(genere_Float,INIT(minimum_du_coefficient_de_d1,F_INFINI));
     DEFV(genere_Float,INIT(maximum_du_coefficient_de_d1,F_MOINS_L_INFINI));
                                        /* Extrema du coefficient 'c1'.                                                              */
     DEFV(genere_Float,INIT(minimum_du_coefficient_de_d0,F_INFINI));
     DEFV(genere_Float,INIT(maximum_du_coefficient_de_d0,F_MOINS_L_INFINI));
                                        /* Extrema du coefficient 'c0'.                                                              */

     DEFV(Logical,INIT(compatibilite_20070621,COMPATIBILITE_20070621));
                                        /* Permet de proceder a des calculs de dimension fractale compatibles avec ceux effectues    */
                                        /* anterieurement au 20070621101434.                                                         */
     /*..............................................................................................................................*/
     GET_ARGUMENTSi(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("compatibilite_20070621=",compatibilite_20070621);

                         GET_ARGUMENT_C("imageA=""A=",nom_imageA);
                         GET_ARGUMENT_C("imageV=""V=",nom_imageV);
                         GET_ARGUMENT_C("imageF=""F=",nom_imageF);

                         GET_ARGUMENT_C("p3=""imageR2=""d2=""c2=""R2=",nom_imageR2);
                         GET_ARGUMENT_C("p2=""imageR1=""d1=""c1=""R1=",nom_imageR1);
                         GET_ARGUMENT_C("p1=""imageR0=""d0=""c0=""R0=",nom_imageR0);

                         GET_ARGUMENT_L("standard=",les_images_sont_standards);
                         GET_ARGUMENT_P("seuil=",seuil_d_inhibition);
                         GET_ARGUMENT_L("editer=",editer_le_noyau);
                         GET_ARGUMENT_L("noyau_carre=""ncarre=",le_noyau_de_convolution_est_carre);
                                        /* Le 20060118092653, "carre=" a ete remplace par "noyau_carre=" et "ncarre=" (risque de     */
                                        /* double definition...).                                                                    */
                         GET_ARGUMENT_N("noyau_circulaire=""ncirculaire=",le_noyau_de_convolution_est_carre);
                                        /* Ces deux parametres furent introduits le 20071003113851...                                */
                         GET_ARGUMENT_I("sautC=""saut=",Pconvolution_____nombre_de_points_sautes);
                         GET_ARGUMENT_I("sautN=",CALCUL_D_UN_NOYAU_DE_CONVOLUTION_VARIABLE_____Pnoyau_nombre_de_points_sautes);
                                        /* Option introduite le 20050225214158...                                                    */

                         GET_ARGUMENT_L("circulaire=",Pconvolution_____parcourir_circulairement_les_spirales_carrees);
                                        /* Option introduite le 20040703110213...                                                    */
                         GET_ARGUMENT_L("circulaire_optimale="
                                       ,Pconvolution_____adapter_le_nombre_de_points_lors_du_parcours_circulaire_des_spirales_carrees
                                        );
                                        /* Option introduite le 20061224122302...                                                    */
                         GET_ARGUMENTS2_I("spirale_pasX=""spX=""spx="
                                         ,SPIRALE_DEPLACEMENT_____amplitude_horizontale
                                         ,SPIRALE_CIRCULAIRE_DEPLACEMENT_ET_PARCOURS_____amplitude_horizontale
                                          );
                         GET_ARGUMENTS2_I("spirale_pasY=""spY=""spy="
                                         ,SPIRALE_DEPLACEMENT_____amplitude_verticale__
                                         ,SPIRALE_CIRCULAIRE_DEPLACEMENT_ET_PARCOURS_____amplitude_verticale__
                                          );
                                        /* Options introduites le 20151109150609...                                                  */

                         GET_ARGUMENT_I("points=""p=",nombre_de_points);
                         GET_ARGUMENT_L("lineaire=",methode_lineaire);
                         GET_ARGUMENT_L("normaliser_nombre_points=""normaliser=",normaliser_le_nombre_de_points_generalise);
                         GET_ARGUMENT_L("contours=",en_vue_d_extraire_des_contours);
                         GET_ARGUMENT_F("eviter=",IFnombre_de_points_generalise_dans_un_voisinage_____evitement_des_zones_noires);

                         GET_ARGUMENT_L("normaliser_globalement_coefficients=""ngc=",normaliser_globalement_les_images_coefficients);
                         GET_ARGUMENT_N("normaliser_localement=""nlc=",normaliser_globalement_les_images_coefficients);
                         GET_ARGUMENT_F("ponderation_cumul=""pc="
                                       ,IFnombre_de_points_generalise_dans_un_voisinage_____ponderation_du_cumul_courant____________
                                        );
                         GET_ARGUMENT_F("ponderation_dispersion=""pd="
                                       ,IFnombre_de_points_generalise_dans_un_voisinage_____ponderation_de_la_dispersion_des_niveaux
                                        );
                         GET_ARGUMENT_F("ponderation_dispersion_minimum=""pdmin="
                                       ,Pconvolution_____dispersion_des_niveaux_sur_la_spirale__ponderation__minimum
                                        );
                         GET_ARGUMENT_F("ponderation_dispersion_moyenne=""pdmoy="
                                       ,Pconvolution_____dispersion_des_niveaux_sur_la_spirale__ponderation__moyenne
                                        );
                         GET_ARGUMENT_F("ponderation_dispersion_maximum=""pdmax="
                                       ,Pconvolution_____dispersion_des_niveaux_sur_la_spirale__ponderation__maximum
                                        );
                         GET_ARGUMENT_F("ponderation_dispersion_translation=""pdt="
                                       ,Pconvolution_____dispersion_des_niveaux_sur_la_spirale__ponderation__translation
                                        );
                                        /* Options introduites le 20151105105356 et completees le 20151105112345 avec la             */
                                        /* normalisation des coefficients...                                                         */
                                        /*                                                                                           */
                                        /* Les options de ponderation des composantes de normalisation de la dispersion ont          */
                                        /* ete introduites le 20151112093708...                                                      */

                         GET_ARGUMENT_L("message_extrema=""me=",Ifloat_std_____editer_le_message_d_attention_relatif_aux_extrema);
                                        /* Pour 'v $xrC/CompressionDeCompression_CompressionSegmentsFractalsHomogenes.01$vv$Z'       */
                                        /* cette option a ete introduite le 20160708105527...                                        */
                         )
                    );

     EGAL(IFnombre_de_points_generalise_dans_un_voisinage_____evitement_des_zones_noires
         ,COND(IL_FAUT(compatibilite_20070621)
              ,NEUT(POUR_OBTENIR_UN_LOGARITHME_POSITIF)
              ,FZERO
               )
          );
                                        /* Pour compenser via 'anti_translation_des_valeurs' la translation effectuee avec           */
                                        /* 'POUR_OBTENIR_UN_LOGARITHME_POSITIF' dans la fonction                                     */
                                        /* 'v $xiii/di_image$FON IFdynamique_logarithmique_sans_translation_dynamique'.              */
                                        /*                                                                                           */
                                        /* Le 20070621101434 je note donc quelque chose qui me parait faux. En effet, lors du calcul */
                                        /* de 'v $xiii/di_image$FON IFdynamique_logarithmique_sans_translation_dynamique', on fait   */
                                        /* en chaque point {X,Y} le calcul suivant :                                                 */
                                        /*                                                                                           */
                                        /*        loadF_point(imageA,X,Y)                                                            */
                                        /*        - IFnombre_de_points_generalise_dans_un_voisinage_____evitement_des_zones_noires   */
                                        /*        + POUR_OBTENIR_UN_LOGARITHME_POSITIF                                               */
                                        /*                                                                                           */
                                        /* soit :                                                                                    */
                                        /*                                                                                           */
                                        /*                                                                  0                        */
                                        /*        loadF_point(imageA,X,Y) - anti_translation_des_valeurs + e                         */
                                        /*                                                                                           */
                                        /* soit encore :                                                                             */
                                        /*                                                                                           */
                                        /*        loadF_point(imageA,X,Y) - anti_translation_des_valeurs + 1                         */
                                        /*                                                                                           */
                                        /* Pour obtenir des logarithmes positifs ou nuls, il faut donc evidemment que :              */
                                        /*                                                                                           */
                                        /*        anti_translation_des_valeurs = 0                                                   */
                                        /*                                                                                           */
                                        /* d'ou le 'FZERO' ci-dessus...                                                              */
                                        /*                                                                                           */
                                        /* On notera que cela ne s'etait pas vu plus tot (en particulier lors de la mise au point    */
                                        /* de ce programme 'v $xci/dimension.02$K') a cause du fait que la validation des images     */
                                        /* flottantes ('v $xiii/files$FON VERIFICATION_HEURISTIQUE_DES_genere_Float') n'a ete        */
                                        /* introduite que le 20030211085553 alors que 'v $xci/dimension.02$K' est de 19930000000000 .*/

     Test(IL_FAUT(methode_lineaire))
          Bblock
          Eblock
     ATes
          Bblock
          EGAL(IFdynamique_logarithmique_sans_translation_dynamique_____moins_l_infini,F_MOINS_LE_PETIT_INFINI);
                                        /* Afin d'eviter l'apparition de l'infini lorsque 'IL_NE_FAUT_PAS(methode_lineaire)'         */
                                        /* (introduit le 20020225155414).                                                            */
          Eblock
     ETes

     CALi(Inoir(ImageA5));
     CALi(Inoir(ImageA6));
     CALi(Inoir(ImageA7));
                                        /* Initialisation de l'image Resultat.                                                       */

     BoIn(niveau,NOIR,BLANC,PAS_COULEURS)
          Bblock
          EGAL(ITb1(niveaux_a_traiter,INDX(niveau,NOIR)),VRAI);
          EGAL(ITb1(niveaux_cumulables,INDX(niveau,NOIR)),VRAI);
                                        /* Initialisation telle que tous les niveaux soient a la fois "traitables" et "cumulables".  */
          Eblock
     EBoI

     Test(IFET(IFNE_chaine(nom_imageV,NOM_PIPE),IFNE_chaine(nom_imageF,NOM_PIPE)))
          Bblock
          DEFV(pointF_2D,centre_de_la_spirale_de_definition_du_noyau);
          INITIALISATION_POINT_2D(centre_de_la_spirale_de_definition_du_noyau
                                 ,_____cNORMALISE_OX(Xcentre)
                                 ,_____cNORMALISE_OY(Ycentre)
                                  );
          Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA3,nom_imageV))))
               Bblock
               Eblock
          ATes
               Bblock
               CALi(Iblanc(ImageA3));
                                        /* En cas d'erreur de chargement de l'image "Valeur", on force le BLANC...                   */
               Test__CODE_ERREUR__ERREUR07;
               Eblock
          ETes

          Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA4,nom_imageF))))
               Bblock
               Eblock
          ATes
               Bblock
               CALi(Iinitialisation(ImageA4,seuil_d_inhibition));
                                        /* En cas d'erreur de chargement de l'image "Forme", on force le seuil d'inhibition...       */
               Test__CODE_ERREUR__ERREUR07;
               Eblock
          ETes

          CALS(Igeneration_d_un_noyau_de_convolution(noyau
                                                    ,inhibition_du_noyau
                                                    ,nombre_de_points
                                                    ,ADRESSE(centre_de_la_spirale_de_definition_du_noyau)
                                                    ,CALCUL_D_UN_NOYAU_DE_CONVOLUTION_VARIABLE_____Pnoyau_nombre_de_points_sautes
                                                    ,ImageA3
                                                    ,ImageA4
                                                    ,seuil_d_inhibition
                                                     )
               );
                                        /* Enfin, generation du noyau de convolution en fonction des images (ImageA3,ImageA4).       */
                                        /*                                                                                           */
                                        /* ATTENTION, on consultera avec soin les commentaires contenus dans 'v $xiii/di_image$FON'  */
                                        /* relatifs a la fonction 'Igeneration_d_un_noyau_de_convolution(...)' au sujet des rapports */
                                        /* entre la taille des images et la "forme" des noyaux...                                    */
          Eblock
     ATes
          Bblock
          Test(IFLE(nombre_de_points,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION))
               Bblock
               DoIn(index,PREMIER_POINT,LSTX(PREMIER_POINT,nombre_de_points),I)
                    Bblock
                    NOYAU(index,FU);
                                        /* Initialisation du noyau de convolution.                                                   */
                    Eblock
               EDoI
               Eblock
          ATes
               Bblock
               PRINT_ERREUR("la taille demandee pour le noyau de convolution est incompatible avec les definitions");

               EGAL(nombre_de_points,NOMBRE_DE_POINTS_DU_NOYAU);
               CAL1(Prer1("(la valeur %d par defaut est forcee)\n",nombre_de_points));
                                        /* Introduit le 20111031140938 car, en effet, manquait cruellement...                        */
               Eblock
          ETes
          Eblock
     ETes

     Test(IL_FAUT(editer_le_noyau))
          Bblock
          Test(IFLE(nombre_de_points,TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION))
               Bblock
               DoIn(index,PREMIER_POINT,LSTX(PREMIER_POINT,nombre_de_points),I)
                    Bblock
                    CAL3(Prme3("noyau(%d)=%g   (actif=%s)\n"
                              ,index
                              ,ITb1(noyau,INDX(index,PREMIER_POINT))
                              ,ETAT_LOGIQUE(ITb1(inhibition_du_noyau,INDX(index,PREMIER_POINT)))
                               )
                         );
                    Eblock
               EDoI
               Eblock
          ATes
               Bblock
               PRINT_ERREUR("la taille demandee pour le noyau de convolution est incompatible avec les definitions");
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA,nom_imageA))))
                                        /* Chargement de l'image dont on veut calculer la dimension fractale.                        */
          Bblock
          BDEFV(imageF,coefficient_de_d2_ou_pente_p3);
          BDEFV(imageF,coefficient_de_d1_ou_pente_p2);
          BDEFV(imageF,coefficient_de_d0_ou_pente_p1);
                                        /* Images flottantes contenant les trois coefficient permettant de verifier la presence      */
                                        /* d'une "bonne" dimension fractale.                                                         */

          CALi(IFinitialisation(coefficient_de_d2_ou_pente_p3,FZERO));
          CALi(IFinitialisation(coefficient_de_d1_ou_pente_p2,FZERO));
          CALi(IFinitialisation(coefficient_de_d0_ou_pente_p1,FZERO));
                                        /* Nettoyage...                                                                              */

          CALS(IFdimension_fractale_convolution(coefficient_de_d2_ou_pente_p3
                                               ,coefficient_de_d1_ou_pente_p2
                                               ,coefficient_de_d0_ou_pente_p1
                                               ,ImageA
                                               ,niveaux_a_traiter,niveaux_cumulables
                                               ,nombre_de_points
                                               ,noyau,inhibition_du_noyau
                                               ,methode_lineaire
                                               ,normaliser_le_nombre_de_points_generalise
                                               ,en_vue_d_extraire_des_contours
                                                )
               );
                                        /* Calcul des trois pentes 'p1', 'p2' et 'p3' ou des trois coefficients 'c2, 'c1' et 'c0'    */
                                        /* par convolution.                                                                          */

          Test(EST_VRAI(les_images_sont_standards))
               Bblock
               DEFV(genere_Float,INIT(minimum_global_des_coefficients_de_d2_d1_d0,FLOT__NIVEAU_UNDEF));
               DEFV(genere_Float,INIT(maximum_global_des_coefficients_de_d2_d1_d0,FLOT__NIVEAU_UNDEF));

               CALS(IFnivo_extrema(coefficient_de_d2_ou_pente_p3
                                  ,ADRESSE(minimum_du_coefficient_de_d2)
                                  ,ADRESSE(maximum_du_coefficient_de_d2)
                                   )
                    );
               CALS(IFnivo_extrema(coefficient_de_d1_ou_pente_p2
                                  ,ADRESSE(minimum_du_coefficient_de_d1)
                                  ,ADRESSE(maximum_du_coefficient_de_d1)
                                   )
                    );
               CALS(IFnivo_extrema(coefficient_de_d0_ou_pente_p1
                                  ,ADRESSE(minimum_du_coefficient_de_d0)
                                  ,ADRESSE(maximum_du_coefficient_de_d0)
                                   )
                    );
                                        /* Calcul des extrema des trois coefficients 'c2, 'c1' et 'c0'.                              */

               EGAL(minimum_global_des_coefficients_de_d2_d1_d0
                   ,MIN3(minimum_du_coefficient_de_d2,minimum_du_coefficient_de_d1,minimum_du_coefficient_de_d0)
                    );
               EGAL(maximum_global_des_coefficients_de_d2_d1_d0
                   ,MAX3(maximum_du_coefficient_de_d2,maximum_du_coefficient_de_d1,maximum_du_coefficient_de_d0)
                    );

               CALS(Ifloat_std(ImageA7
                              ,coefficient_de_d2_ou_pente_p3
                              ,COND(IL_FAUT(normaliser_globalement_les_images_coefficients)
                                   ,minimum_global_des_coefficients_de_d2_d1_d0
                                   ,minimum_du_coefficient_de_d2
                                    )
                              ,COND(IL_FAUT(normaliser_globalement_les_images_coefficients)
                                   ,maximum_global_des_coefficients_de_d2_d1_d0
                                   ,maximum_du_coefficient_de_d2
                                    )
                               )
                    );
               CALS(Ifloat_std(ImageA6
                              ,coefficient_de_d1_ou_pente_p2
                              ,COND(IL_FAUT(normaliser_globalement_les_images_coefficients)
                                   ,minimum_global_des_coefficients_de_d2_d1_d0
                                   ,minimum_du_coefficient_de_d1
                                    )
                              ,COND(IL_FAUT(normaliser_globalement_les_images_coefficients)
                                   ,maximum_global_des_coefficients_de_d2_d1_d0
                                   ,maximum_du_coefficient_de_d1
                                    )
                               )
                    );
               CALS(Ifloat_std(ImageA5
                              ,coefficient_de_d0_ou_pente_p1
                              ,COND(IL_FAUT(normaliser_globalement_les_images_coefficients)
                                   ,minimum_global_des_coefficients_de_d2_d1_d0
                                   ,minimum_du_coefficient_de_d0
                                    )
                              ,COND(IL_FAUT(normaliser_globalement_les_images_coefficients)
                                   ,maximum_global_des_coefficients_de_d2_d1_d0
                                   ,maximum_du_coefficient_de_d0
                                    )
                               )
                    );
                                        /* Renormalisation...                                                                        */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          CALi(gIupdate_image(les_images_sont_standards,nom_imageR2,ImageA7,coefficient_de_d2_ou_pente_p3));
          CALi(gIupdate_image(les_images_sont_standards,nom_imageR1,ImageA6,coefficient_de_d1_ou_pente_p2));
          CALi(gIupdate_image(les_images_sont_standards,nom_imageR0,ImageA5,coefficient_de_d0_ou_pente_p1));
                                        /* L'image 'nom_imageR2' (par exemple) pourra etre utilisee pour extraire les contours de    */
                                        /* 'nom_imageA' a condition de lui faire subir un :                                          */
                                        /*                                                                                           */
                                        /*                  $xci/passe_bande$X  inf=$NOIR sup=80 ...                                 */
                                        /*                                                                                           */
                                        /* suivi d'un :                                                                              */
                                        /*                                                                                           */
                                        /*                  $xci/seuil$X        ...                                                  */
                                        /*                                                                                           */
                                        /* Le 20070621104338, je note que lorsque la demande d'aide a l'extraction de contours       */
                                        /* n'est pas faite (ce qui est le cas par defaut...), l'image 'nom_imageR2' semble donner    */
                                        /* par son maximum (si "standard=FAUX"), la dimension fractale de 'nom_imageA'...            */

          EDEFV(imageF,coefficient_de_d0_ou_pente_p1);
          EDEFV(imageF,coefficient_de_d1_ou_pente_p2);
          EDEFV(imageF,coefficient_de_d2_ou_pente_p3);
                                        /* Images flottantes contenant les trois coefficient permettant de verifier la presence      */
                                        /* d'une "bonne" dimension fractale.                                                         */
          Eblock
     ATes
          Bblock
          Test__CODE_ERREUR__ERREUR07;
          Eblock
     ETes

     RETU_Commande;
     Eblock
ECommande



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.