#!/bin/csh

#######################################################################################################################################
#                                                                                                                                     #
#         E X T R A C T I O N   D E   T O U S   L E S   C O N T O U R S   D ' U N E   I M A G E  :                                    #
#                                                                                                                                     #
#                                                                                                                                     #
#         Utilisation :                                                                                                               #
#                                                                                                                                     #
#                   $xci/contours.11$Z  <image> <contours> [<seuil> [<liste_les_contours> [<G> [<pas> [<Ex> [<Tx> [<Ey> [<Ty>]]]]]]]] #
#                                                                                                                                     #
#                                                                                                                                     #
#         Author of '$xci/contours.11$Z' :                                                                                            #
#                                                                                                                                     #
#                     Jean-Francois Colonna (LACTAMME, AAAAMMJJhhmmss).                                                               #
#                                                                                                                                     #
#######################################################################################################################################

set                 imageA=$1
set                 imageR=$2
set                 SeuilContours=$3
set                 ListerContours=$4
set                 CentreGravite=$5
set                 PasContours=$6
set                 EchelleX=$7
set                 TranslationX=$8
set                 EchelleY=$9
set                 TranslationY=$10

setArgum            SeuilContours                 $GRIS_4
                                        # Seuil d'extraction des contours...                                                          #

setArgum            ListerContours                "VRAI"
                                        # Afin de lister les contours sous la forme {x,y}.                                            #

setArgum            CentreGravite                 "FAUX"
                                        # Pour editer les coordonnees du centre de gravite de chaque contour (cette possibilite fut   #
                                        # introduite le 20051207161319)...                                                            #

if        ("$PasContours" == "$K_VIDE") then
#20051207161319____:          set       PasContours=4                                                                                 #
          set       PasContours=1
                                        # Pas de parcours des contours.                                                               #
else
endif

setArgum            EchelleX                      1.0
                                        # Echelle des coordonnees 'X'..                                                               #

setArgum            TranslationX                  0.0
                                        # Translation des coordonnees 'X'..                                                           #

setArgum            EchelleY                      1.0
                                        # Echelle des coordonnees 'Y'..                                                               #

setArgum            TranslationY                  0.0
                                        # Translation des coordonnees 'Y'..                                                           #

#20051207165125____:set                 NiveauContours=$GRIS_4                                                                        #
@                   NiveauContours = $SeuilContours + 1
set                 NiveauRempli=$GRIS_8

FileTmpB            imageAT

$xci/cadre$X                                                                                                                            \
                    A=$imageA                                                                                                           \
                    niveau=$NOIR                                                                                                        \
                    epaisseur=1                                                                                                         \
                    R=$imageAT                                                                                                          \
                                                                                                                        $formatI
                                        # Definition de l'image courante dans laquelle on va progressivement supprimer des            #
                                        # contours remplis, mais en ayant enleve au prealable le tour de l'image. ATTENTION, on ne    #
                                        # peut pas reduire a 0 l'epaisseur du cadre '$NOIR' sous peine de voir boucler ce processus.  #
                                        # En effet, '$xci/contours.11$X' peut recuperer des contours "lineaires" colles a l'un des    #
                                        # bords de l'image ; '$xci/contours.12$X' ne remplit alors rien, et le processus se met       #
                                        # a boucler, puisque l'image courante '$imageAT' (a laquelle on soustrait les remplissages)   #
                                        # n'evolue alors plus...                                                                      #
$xci/init$X                                                                                                                             \
                    niveau=$NOIR                                                                                                        \
                    R=$imageR                                                                                                           \
                                                                                                                        $formatI
                                        # Initialisation de l'image Resultat contenant les contours remplis qui ont ete extraits...   #

FileTmpB            imageC1
FileTmpB            imageC2
FileTmpB            FileT

set                 Iterer=$EXIST
                                        # Afin de boucler sur l'extraction de tous les contours.                                      #
set                 Numero1=1
set                 Numero=$Numero1
                                        # Afin de compter les contours.                                                               #

while               ($Iterer == $EXIST)
                    set                 Arguments="A=$imageAT seuil=$SeuilContours pas=$PasContours niveau=$NiveauContours R=$imageC1"
                                        # Arguments necessaires a '$xci/contours.11$X'.                                               #

                    if                  ("$ListerContours" == "VRAI") then
                                        if                  ($Numero > $Numero1) then
                                                            saut
                                        else
                                        endif

                                        echo                "CONTOUR=""$Numero"
                                        # Edition, si necessaire, du numero de contour courant...                                     #
                    else
                    endif

                    $xci/contours.11$X                                                                                                  \
                                        $Arguments                                                                                      \
                                        points_contour=$ListerContours                                                                  \
                                        centre_gravite=$CentreGravite                                                                   \
                                        EX=$EchelleX TX=$TranslationX                                                                   \
                                        EY=$EchelleY TY=$TranslationY                                                                   \
                                        point_interieur=FAUX                                                                            \
                                                                                                                        $formatI
                                        # Extraction du contour courant avec edition eventuelle de la liste des points extraits du    #
                                        # contour courant avec leur mise a l'echelle eventuelle...                                    #
                    $xci/contours.11$X                                                                                                  \
                                        $Arguments                                                                                      \
                                        points_contour=FAUX                                                                             \
                                        centre_gravite=FAUX                                                                             \
                                        point_interieur=VRAI                                                                            \
                                        EX=1.0 TX=0.0                                                                                   \
                                        EY=1.0 TY=0.0                                                                                   \
                                                                                                                        $formatI        \
                                                                                                    >& $FileT
                    set                 PointInterieur="`$CA $FileT`"
                    $DELETE             $FileT
                                        # Recuperation des coordonnees {x,y} d'un point interieur au contour 'v $imageC1'.            #

                    $xci/contours.12$X                                                                                                  \
                                        A=$imageC1                                                                                      \
                                        seuil=$SeuilContours                                                                            \
                                        niveau=$NiveauRempli                                                                            \
                                        $PointInterieur                                                                                 \
                                        R=$imageC2                                                                                      \
                                                                                                                        $formatI
                                        # Remplissage du contour courant.                                                             #
                    $xci/or_02$X                                                                                                        \
                                        A1=$imageR                                                                                      \
                                        A2=$imageC2                                                                                     \
                                        R=$imageR                                                                                       \
                                                                                                                        $formatI
                                        # Cumul des contours remplis...                                                               #

                    $xci/complement$X                                                                                                   \
                                        A=$imageC2                                                                                      \
                                                                                                                        $formatI  |     \
                    $xci/and$X                                                                                                          \
                                        A2=$imageAT                                                                                     \
                                        R=$imageAT                                                                                      \
                                                                                                                        $formatI
                                        # Suppression du contour courant rempli de l'image courante.                                  #

                    $xci/extrema$X                                                                                                      \
                                        A=$imageAT                                                                                      \
                                        coordonnees=FAUX                                                                                \
                                        minimum=FAUX                                                                                    \
                                        moyenne=FAUX                                                                                    \
                                        maximum=VRAI                                                                                    \
                                                                                                                        $formatI        \
                                                                                                    >& $FileT
                    set                 Maximum="`$CA $FileT`"
                    $DELETE             $FileT
                                        # Recuperation du maximum de l'image courante.                                                #

                    if                  ($Maximum < $SeuilContours) then
                                        set                 Iterer=$NEXIST
                                        # Afin d'arreter de boucler car il n'y a plus de contours a extraire...                       #
                    else
                                        @                   Numero = $Numero + 1
                                        # Pour compter les contours extraits...                                                       #
                    endif
end

FileTmpE            imageAT
FileTmpE            imageC1
FileTmpE            imageC2
FileTmpE            FileT



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.