/*************************************************************************************************************************************/ /* */ /* R E M P L I S S A G E D ' U N C O N T O U R : */ /* */ /* */ /* Definition : */ /* */ /* Cette commande permet d'extraire */ /* un contour contenu dans une image */ /* Argument et de le remplir. */ /* */ /* */ /* Author of '$xci/contours.12$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 19990603133319). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 #include image_image_CONTOURS_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define SEUIL_DE_LIMITE_ENTRE_L_INTERIEUR_ET_L_EXTERIEUR \ GRIS \ /* Seuil de limite entre l'interieur et l'exterieur des contours. */ #define X_POINT_DE_DEPART_DU_CONTOUR \ _____cNORMALISE_OX(Xmin) #define Y_POINT_DE_DEPART_DU_CONTOUR \ _____cNORMALISE_OY(Ymin) /* Point de depart de l'extraction du contours. */ #define PARCOURS___EST \ VRAI #define PARCOURS__NORD \ VRAI #define PARCOURS_OUEST \ VRAI #define PARCOURS___SUD \ VRAI #define PARCOURS__NORD___EST \ VRAI #define PARCOURS__NORD_OUEST \ VRAI #define PARCOURS___SUD_OUEST \ VRAI #define PARCOURS___SUD___EST \ VRAI /* Pour choisir les directions de parcours (introduit le 20070213121905)... */ #define NIVEAU_DE_REMPLISSAGE_DU_CONTOUR \ BLANC \ /* Niveau de remplissage du contour. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define DEFINE_CONTOUR(logique1,logique2) \ Bblock \ BoIn(niveau,NOIR,seuil_de_limite_entre_l_interieur_et_l_exterieur,PAS_COULEURS) \ Bblock \ EGAL(ITb1(fond,INDX(niveau,NOIR)),logique1); \ EGAL(ITb1(bord,INDX(niveau,NOIR)),logique2); \ Eblock \ EBoI \ \ BoIn(niveau,SUCN(seuil_de_limite_entre_l_interieur_et_l_exterieur),BLANC,PAS_COULEURS) \ Bblock \ EGAL(ITb1(fond,INDX(niveau,NOIR)),logique2); \ EGAL(ITb1(bord,INDX(niveau,NOIR)),logique1); \ Eblock \ EBoI \ Eblock \ /* Definition de l'interieur et de l'exterieur d'un contour. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E M P L I S S A G E D ' U N C O N T O U R : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE)); DEFV(genere_p,INIT(seuil_de_limite_entre_l_interieur_et_l_exterieur,SEUIL_DE_LIMITE_ENTRE_L_INTERIEUR_ET_L_EXTERIEUR)); /* Seuil de limite entre l'interieur et l'exterieur des contours. */ DEFV(Logical,DTb1(fond,COULEURS)); /* Definition du fond (ce que l'on doit remplir). */ DEFV(Logical,DTb1(bord,COULEURS)); /* Et du bord (ce qui definit le contour et son exterieur). */ DEFV(pointF_2D,point_de_depart); /* Point de depart de l'extraction de contour. */ DEFV(genere_p,INIT(niveau_de_remplissage_du_contour,NIVEAU_DE_REMPLISSAGE_DU_CONTOUR)); /* Niveau de remplissage du contour. */ DEFV(Logical,INIT(parcours___est,PARCOURS___EST)); DEFV(Logical,INIT(parcours__nord,PARCOURS__NORD)); DEFV(Logical,INIT(parcours_ouest,PARCOURS_OUEST)); DEFV(Logical,INIT(parcours___sud,PARCOURS___SUD)); DEFV(Logical,INIT(parcours__nord___est,PARCOURS__NORD___EST)); DEFV(Logical,INIT(parcours__nord_ouest,PARCOURS__NORD_OUEST)); DEFV(Logical,INIT(parcours___sud_ouest,PARCOURS___SUD_OUEST)); DEFV(Logical,INIT(parcours___sud___est,PARCOURS___SUD___EST)); /* Pour choisir les directions de parcours (introduit le 20070213121905)... */ /*..............................................................................................................................*/ INITIALISATION_POINT_2D(point_de_depart,X_POINT_DE_DEPART_DU_CONTOUR,Y_POINT_DE_DEPART_DU_CONTOUR); /* Introduit le 20050310160202 pour eviter de voir "n'importe quoi" lorsque l'option */ /* "Parametres=VRAI" est active... */ GET_ARGUMENTSv(nombre_d_arguments ,BLOC(GET_ARGUMENT_C("imageA=""A=",nom_imageA); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_P("seuil=""s=",seuil_de_limite_entre_l_interieur_et_l_exterieur); GET_ARGUMENT_P("niveau=",niveau_de_remplissage_du_contour); GIT_ARGUMENT_F("x=""XI=""X=",ASD1(point_de_depart,x),X_POINT_DE_DEPART_DU_CONTOUR); /* 'XI' a ete introduit le 20051207141742 suite a la modification effectuee dans */ /* 'v $xci/contours.11$K XI='. */ GIT_ARGUMENT_F("y=""YI=""Y=",ASD1(point_de_depart,y),Y_POINT_DE_DEPART_DU_CONTOUR); /* 'YI' a ete introduit le 20051207141742 suite a la modification effectuee dans */ /* 'v $xci/contours.11$K YI='. */ GET_ARGUMENT_L("est=""dc1=",parcours___est); GET_ARGUMENT_L("nord=""dc2=",parcours__nord); GET_ARGUMENT_L("ouest=""dc3=",parcours_ouest); GET_ARGUMENT_L("sud=""dc4=",parcours___sud); GET_ARGUMENT_L("nord___est=""dc12=",parcours__nord___est); GET_ARGUMENT_L("nord_ouest=""dc23=",parcours__nord_ouest); GET_ARGUMENT_L("sud_ouest=""dc34=",parcours___sud_ouest); GET_ARGUMENT_L("sud___est=""dc41=",parcours___sud___est); /* Pour choisir les directions de parcours (introduit le 20070213121905)... */ /* */ /* Les Directions Cardinales de type 'v $xiii/vecteurs$DEF Rappel.sur.les.orientations' */ /* ont ete introduites le 20231201094206 dans l'idee d'une extension tridimensionnelle... */ GET_ARGUMENT_L("editer_centre_gravite=""ecg=" ,Iremplissage_____editer_le_centre_de_gravite ); /* Parametres introduits le 20161105105953... */ GET_ARGUMENT_L("editer_matrice_intertie=""emi=" ,Iremplissage_____editer_la_matrice_d_inertie ); /* Parametres introduits le 20230825102403... */ ) ); CALi(Inoir(ImageR)); /* Initialisation de l'image Resultat. */ Test(IFGE(seuil_de_limite_entre_l_interieur_et_l_exterieur,BLANC)) Bblock PRINT_ERREUR("le seuil de limite entre l'interieur et l'exterieur doit etre inferieur au niveau maximal"); EGAL(seuil_de_limite_entre_l_interieur_et_l_exterieur,PREN(BLANC)); Eblock ATes Bblock Eblock ETes Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA,nom_imageA)))) Bblock DEFV(pointF_2D,coin_inferieur_gauche); /* Coin inferieur gauche de la zone de remplissage, */ DEFV(pointF_2D,coin_superieur_droite); /* Coin superieur droite de la zone de remplissage. */ INITIALISATION_POINT_2D(coin_inferieur_gauche,CADRE_GAUCHE,CADRE_INFERIEUR); /* Definition du coin inferieur gauche de remplissage, */ INITIALISATION_POINT_2D(coin_superieur_droite,CADRE_DROITE,CADRE_SUPERIEUR); /* Definition du coin superieur droite de remplissage. */ DEFINE_CONTOUR(VRAI,FAUX); /* Definition de l'interieur et de l'exterieur du contour... */ CALS(Iremplissage(ImageR ,ImageA ,ADRESSE(point_de_depart) ,ADRESSE(coin_inferieur_gauche) ,ADRESSE(coin_superieur_droite) ,fond,bord ,parcours___est,parcours__nord,parcours_ouest,parcours___sud ,parcours__nord___est,parcours__nord_ouest,parcours___sud_ouest,parcours___sud___est ,niveau_de_remplissage_du_contour ) ); /* Remplissage du contour... */ CALi(Iupdate_image(nom_imageR,ImageR)); /* Memorisation du resultat. */ Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes RETU_Commande; Eblock ECommande