#!/bin/csh

#######################################################################################################################################
#                                                                                                                                     #
#         R E D U C T I O N   D ' U N   E N S E M B L E   D ' I M A G E S   D E   F O R M A T S   Q U E L C O N Q U E S  :            #
#                                                                                                                                     #
#                                                                                                                                     #
#         Utilisation :                                                                                                               #
#                                                                                                                                     #
#                                       $xci/reduction$Z    <imageR> {<imageA> <palette>}                                             #
#                                                                                                                                     #
#                   (en fausses couleurs, chaque image de la liste doit etre suivie de sa palette)                                    #
#                                                                                                                                     #
#                                       $xci/reduction$Z    <imageR> {<imageA>}                                                       #
#                                                                                                                                     #
#                   (cas des vraies couleurs)                                                                                         #
#                                                                                                                                     #
#                                                                                                                                     #
#         Nota :                                                                                                                      #
#                                                                                                                                     #
#                     Il est rendu possible le 20180212154819                                                                         #
#                   de pouvoir redimensionner les images de la                                                                        #
#                   facon suivante :                                                                                                  #
#                                                                                                                                     #
#                                       setenv              METHODE_reduction  ...                                                    #
#                                       $xci/reduction$Z    <imageR> [<imageA> [<palette>]]                                           #
#                                       unsetenv            METHODE_reduction                                                         #
#                                                                                                                                     #
#                   qui permet donc de definir '$Fmethode' par                                                                        #
#                   la suite.                                                                                                         #
#                                                                                                                                     #
#                   Ce passage "exotique" d'argument a cette                                                                          #
#                   commande '$xci/reduction$Z' est lie au                                                                            #
#                   fait qu'elle recoit un nombre variable                                                                            #
#                   d'arguments...                                                                                                    #
#                                                                                                                                     #
#                                                                                                                                     #
#         Nota :                                                                                                                      #
#                                                                                                                                     #
#                     L'option "moyenne=VRAI" est positionnee                                                                         #
#                   par defaut, mais (malheureusement) des qu'une                                                                     #
#                   image en fausses couleurs est detectee, elle                                                                      #
#                   passe a "moyenne=FAUX". Il est donc suggere                                                                       #
#                   de ne traiter que des images en vraies couleurs                                                                   #
#                   ('v $xiav/$Fnota .xiav.INFINI.12.R16') afin de                                                                    #
#                   beneficier de la meilleure qualite...                                                                             #
#                                                                                                                                     #
#                                                                                                                                     #
#         Nota :                                                                                                                      #
#                                                                                                                                     #
#                     Il est possible de demander a ce qu'une                                                                         #
#                   interpolation rajoutant 3 ($Pas-1) images                                                                         #
#                   intermediaires soit faite a condition de                                                                          #
#                   faire la sequence suivante :                                                                                      #
#                                                                                                                                     #
#                                       setenv              INTER_reduction    $EXIST                                                 #
#                                       $xci/reduction$Z    <imageR> [<imageA> [<palette>]]                                           #
#                                       unsetenv            INTER_reduction                                                           #
#                                                                                                                                     #
#                   ce passage "exotique" d'argument a cette                                                                          #
#                   commande '$xci/reduction$Z' est lie au                                                                            #
#                   fait qu'elle recoit un nombre variable                                                                            #
#                   d'arguments...                                                                                                    #
#                                                                                                                                     #
#                     Ceci est utilisable pour generer des sequences                                                                  #
#                   d'images "continues" exploitables ensuite pour                                                                    #
#                   faire, par exemple, des boucles a l'aide de '$MPEG'                                                               #
#                   ('v $xiirv/DEMO.31$R64').                                                                                         #
#                                                                                                                                     #
#                                                                                                                                     #
#         Author of '$xci/reduction$Z' :                                                                                              #
#                                                                                                                                     #
#                     Jean-Francois COLONNA (LACTAMME, AAAAMMJJhhmmss).                                                               #
#                                                                                                                                     #
#######################################################################################################################################

set       liste="$*"

set       formatR=`echo $formatI | $SE -e "s/=/R=/g"`
                                        # Definition du format de l'image Resultat.                                                   #
if        ($?METHODE_reduction == $NEXIST) then
          set       Fmethode=7
                                        # Choix de la methode de '$xci/format.01$X'.                                                  #
else
          set       Fmethode=$METHODE_reduction
                                        # Possibilite introduite le 20180212154819...                                                 #
endif

set       nomDT=`GetXTmp $D`
$MKDIR    $nomDT
                                        # Creation d'un directory temporaire. ATTENTION, il est impossible d'utiliser le nom 'nomD'   #
                                        # car en effet l'alias 'EROR' ci-dessous l'utilise via les alias 'path_f' et 'direct'...      #
set       nomI=$nomDT$K_sepS`Genom5`$K_sepP
                                        # Creation du nom des images intermediaires. Avant le 19970319161312, c'etait "images"        #
                                        # qui etait utilise, mais cela avait le dramatique inconvenient de la non "reentrance"...     #

set       premier=$EXIST
                                        # Indicateur precisant si l'on recherche le premier element de la liste ou les suivants...    #
set       numero0=0
set       numero=$numero0
                                        # Numero de l'element courant dans la liste...                                                #
if        ($?INTER_reduction == $NEXIST) then
          set       Pas=1
                                        # Lorsqu'il n'y a pas d'interpolation, le pas est egal a 1.                                   #
else
          set       Pas=4
                                        # Sinon, il est strictement superieur...                                                      #
          saut
          echo      "ATTENTION, c'est le processus avec interpolation qui est actif."
          saut
endif

set       Ipalette=$NEXIST
                                        # Indicateur precisant si l'on recherche actuellement un palette...                           #

set       moyenne=VRAI
set       maximum=FAUX
                                        # A priori, la reduction se fera avec un moyennage, mais des qu'une image fausses couleurs    #
                                        # est trouvee, ce moyennage est inhibe (voir les commentaires de 'v $xci/$reduction$K').      #
foreach   element   ($liste)
          if        ($premier == $EXIST) then
                    set       imageR=$element
                                        # Le premier element de la liste est le nom de l'image Resultat.                              #
                    set       premier=$NEXIST
                                        # Indicateur precisant si l'on recherche le premier element de la liste ou les suivants...    #
          else
                                        # Les elements suivants donnent les images Argument a reduire...                              #
                    set       GenImage=$NEXIST
                                        # A priori, on ne genere pas d'image...                                                       #

                    if        ($Ipalette == $NEXIST) then
                                        # Cas ou l'on recherche une image :                                                           #
                              set       imageA=$element
                                        # Recuperation du nom d'une image Argument...                                                 #
                              set       Numero=`$xci/nombres$X premiere=$numero derniere=$numero`
                                        # Generation du numero de l'image...                                                          #

                              if        (    (    (-e $imageA$ROUGE) && (-e $imageA$VERTE) && (-e $imageA$BLEUE)                        \
                                              )                                                                                         \
                                        &&   (! -e $imageA)                                                                             \
                                         ) then
                                        # Cas ou l'image courante est en vraies couleurs sans ambiguite :                             #
                                        set       Ipalette=$NEXIST
                                        # Indicateur precisant que l'element suivant ne doit pas etre une palette (on notera qu'il    #
                                        # a deja cette valeur...).                                                                    #
                              else
                                        if        (    (    (! -e $imageA$ROUGE) || (! -e $imageA$VERTE) || (! -e $imageA$BLEUE)        \
                                                        )                                                                               \
                                                  &&   (-e $imageA)                                                                     \
                                                   ) then
                                        # Cas ou l'image courante est en fausses couleurs sans ambiguite :                            #
                                                  set       Ipalette=$EXIST
                                        # Indicateur precisant que l'element suivant doit etre une palette...                         #
                                        else
                                                  if   (    (    (! -e $imageA$ROUGE) || (! -e $imageA$VERTE) || (! -e $imageA$BLEUE)   \
                                                             )                                                                          \
                                                       ||   (! -e $imageA)                                                              \
                                                        ) then
                                                       EROR      "L'image '$imageA' n'existe pas."
                                                  else
                                        # Cas ou il y a ambiguite :                                                                   #
                                                            EROR      "L'image '$imageA' existe en fausses et en vraies couleurs."

                                                            answero   "Doit-on alors choisir la version vraies couleurs ?"

#20030418104108____:                                                            if        (    ("$answer" == "oui")                \  #
#20030418104108____:                                                                      ||   ("$answer" == "yes")                \  #
#20030418104108____:                                                                      ||   ("$answer" == "$K_VIDE")            \  #
#20030418104108____:                                                                       ) then                                     #
                                                            if        ("$answer" == "$Reponse_OUI") then
                                                                      echo      "Version vraies couleurs de l'image '$imageA'."
                                                                      set       Ipalette=$NEXIST
                                                            else
                                                                      echo      "Version fausses couleurs de l'image '$imageA'."
                                                                      echo      "ATTENTION, il faut donc qu'un nom de palette suive."
                                                                      set       Ipalette=$EXIST
                                                            endif
                                                  endif
                                        endif
                              endif

                              if        ($Ipalette == $NEXIST) then
                                        # Cas ou l'image courante est en vraies couleurs sans ambiguite :                             #

                                        Format    $imageA$ROUGE
                                        set       FormatR="$Format"
                                        Format    $imageA$VERTE
                                        set       FormatV="$Format"
                                        Format    $imageA$BLEUE
                                        set       FormatB="$Format"

                                        set       ImAgER=`echo $FormatR | $GRE "EROR"`
                                        set       ImAgEV=`echo $FormatV | $GRE "EROR"`
                                        set       ImAgEB=`echo $FormatB | $GRE "EROR"`

                                        if        (    ("$ImAgER" == "$K_VIDE")                                                         \
                                                  &&   ("$ImAgEV" == "$K_VIDE")                                                         \
                                                  &&   ("$ImAgEB" == "$K_VIDE")                                                         \
                                                   ) then
                                                  if        (    ("$FormatR" == "$FormatV")                                             \
                                                            &&   ("$FormatR" == "$FormatB")                                             \
                                                            &&   ("$FormatV" == "$FormatB")                                             \
                                                             ) then
                                                            SformatI
                                                            eval                "$Format"

                                                            $xci/format.01$X    A=$imageA$ROUGE                                         \
                                                                                methode=$Fmethode                                       \
                                                                                $formatI                                                \
                                                                                R=$nomI$Numero$ROUGE                                    \
                                                                                                                        $formatR
                                                            $xci/format.01$X    A=$imageA$VERTE                                         \
                                                                                methode=$Fmethode                                       \
                                                                                $formatI                                                \
                                                                                R=$nomI$Numero$VERTE                                    \
                                                                                                                        $formatR
                                                            $xci/format.01$X    A=$imageA$BLEUE                                         \
                                                                                methode=$Fmethode                                       \
                                                                                $formatI                                                \
                                                                                R=$nomI$Numero$BLEUE                                    \
                                                                                                                        $formatR
                                        # Recuperation de l'image vraies couleurs.                                                    #
                                                            set       GenImage=$EXIST
                                        # On vient de generer une image...                                                            #

                                                            RformatI

                                                  else
                                                  endif
                                        else
                                        endif
                              else
                                        # Cas ou l'on l'image courante est en fausses couleurs : il faut attendre la palette...       #
                              endif

                              @         numero = $numero + $Pas
                                        # Numero de l'image courante dans la liste qui n'est incremente bien entendu que lorsque      #
                                        # l'on ne recherche pas une palette...                                                        #
                    else
                              set       paletteA=$element
                                        # Recuperation du nom d'une palette Argument...                                               #

                              set       VaLiDeP=`GetPath $paletteA`

                              if        ("$VaLiDeP" != "$xiP") then
                                        # Validation introduite le 20120202153546 lors du calcul de 'v $xiav/INFINI.13$R16'...        #
                                        EROR      "La palette '$paletteA' n'est pas dans '"'$xiP'"' parce qu'elle est peut-etre \c"
                                        ECHO      "en realite une image et que celle qui la precede est en fausses couleurs \c"
                                        ECHO      "alors que sa palette a ete omise."
                              else
                              endif

                              unset     VaLiDeP

                              Format    $imageA
                              set       ImAgE=`echo $Format | $GRE "EROR"`

                              if        ("$ImAgE" == "$K_VIDE") then
                                        SformatI
                                        eval      "$Format"

                                        $xci/format.01$X    A=$imageA                                                                   \
                                                            methode=$Fmethode                                                           \
                                                            $formatI                                                                    \
                                                            R=$nomI$Numero                                                              \
                                                                                                                        $formatR
                                        RformatI

                                        $xci/vraies_C$X     A=$nomI$Numero p=$paletteA                                                  \
                                                            RR=$nomI$Numero$ROUGE RV=$nomI$Numero$VERTE RB=$nomI$Numero$BLEUE           \
                                                                                                                        $formatI
                                        # Recuperation de l'image fausses couleurs...                                                 #
                                        set       GenImage=$EXIST
                                        # On vient de generer une image...                                                            #
                              else
                              endif

                              set       Ipalette=$NEXIST
                                        # Indicateur precisant que l'element suivant doit etre une image...                           #
                              set       moyenne=FAUX
                              set       maximum=FAUX
                                        # Des qu'une image fausses couleurs est trouvee, le moyennage est inhibe (voir les            #
                                        # commentaires de '$xci/$reduction$X'), et de plus on demande a prendre alors le point        #
                                        # courant (et non point le maximum) ce qui garantit que l'on selectionne le meme point sur    #
                                        # trois composantes...                                                                        #
                    endif

                    if        ($?INTER_reduction == $EXIST) then
                                        # Cas ou l'interpolation est demandee :                                                       #
                              if        ($GenImage == $EXIST) then
                                        # Cas ou une image vient effectivement d'etre generee :                                       #
                                        if        ($?numeroPr == $EXIST) then
                                        # Cas ou il y a bien une image precedente :                                                   #
                                                  @         numeroPr1 = $numeroPr + 1
                                                  @         numero1 = $numero - $Pas
                                                  @         numero1 = $numero1 - 1
                                                  set       ListeInter=`$xci/nombres$X premiere=$numeroPr1 derniere=$numero1`
                                        # Generation des numeros d'images interpolees...                                              #
                                                  set       NumeroPr=`$xci/nombres$X premiere=$numeroPr derniere=$numeroPr`
                                        # Generation des numeros d'images interpolees...                                              #

                                                  set       Divis=$Pas
                                                  set       Multi=1
                                        # Initialisation du processus de generation de {alpha,beta}.                                  #

                                                  foreach   NumeroI   ($ListeInter)
                                                            @    Compl = $Divis - $Multi
                                                            set  Alpha=`$xcg/scale$X nombre=1.0 diviseur=$Divis multiplicateur=$Compl`
                                                            set  Beta=`$xcg/scale$X nombre=1.0 diviseur=$Divis multiplicateur=$Multi`
                                                            @    Multi = $Multi + 1
                                        # Generation de {alpha,beta}.                                                                 #

                                                            $xci/interpole.01$X alpha=$Alpha                                            \
                                                                                A1=$nomI$NumeroPr$ROUGE                                 \
                                                                                beta=$Beta                                              \
                                                                                A2=$nomI$Numero$ROUGE                                   \
                                                                                R=$nomI$NumeroI$ROUGE                                   \
                                                                                $formatI                                                \
                                                                                                                        $formatI
                                                            $xci/interpole.01$X alpha=$Alpha                                            \
                                                                                A1=$nomI$NumeroPr$VERTE                                 \
                                                                                beta=$Beta                                              \
                                                                                A2=$nomI$Numero$VERTE                                   \
                                                                                R=$nomI$NumeroI$VERTE                                   \
                                                                                $formatI                                                \
                                                                                                                        $formatI
                                                            $xci/interpole.01$X alpha=$Alpha                                            \
                                                                                A1=$nomI$NumeroPr$BLEUE                                 \
                                                                                beta=$Beta                                              \
                                                                                A2=$nomI$Numero$BLEUE                                   \
                                                                                R=$nomI$NumeroI$BLEUE                                   \
                                                                                $formatI                                                \
                                                                                                                        $formatI
                                        # Interpolation entre l'image precedente '$numeroPr' et l'image courante '$numero'...         #
                                                  end
                                        else
                                        endif

                                        @         numeroPr = $numero - $Pas
                                        # Pour l'interpolation suivante...                                                            #
                              else
                              endif
                    else
                    endif
          endif
end

if        ($numero <= 4) then
#AAAAMMJJhhmmss____:          set       reduction="reduction_04"                                                                      #
          set       reduction="reduction_16"
                                        # Choix du programme de reduction. On notera l'usage de 'reduction_16' et non pas de          #
                                        # 'reduction_04' afin de rendre compatible la taille physique des images obtenues et          #
                                        # permettre ainsi des decoupages et des collages compatibles...                               #
else
          if        ($numero <= 16) then
                    set       reduction="reduction_16"
                                        # Choix du programme de reduction.                                                            #
          else
                    if        ($numero <= 64) then
                              set       reduction="reduction_64"
                                        # Choix du programme de reduction.                                                            #
                    else
                              EROR      "Il y a plus de 64 images,"

                              if        ($?INTER_reduction == $EXIST) then
                                        EROR      "Ce qui peut etre normal, l'option '$K_DOLLAR""INTER_reduction' etant active."
                              else
                              endif

                              set       reduction="reduction_64"
                                        # Choix du programme de reduction (sachant que l'on va perdre les images de numero superieur  #
                                        # a 64...).                                                                                   #
                    endif
          endif
endif

#20030912____:$xci/$reduction$X   A=$nomI premiere=$numero0 pas=1 erreur=FAUX postfixe=$ROUGE moyenne=$moyenne maximum=$maximum    \  #
#20030912____:                    R=$imageR$ROUGE                                                                       $formatI      #
#20030912____:$xci/$reduction$X   A=$nomI premiere=$numero0 pas=1 erreur=FAUX postfixe=$VERTE moyenne=$moyenne maximum=$maximum    \  #
#20030912____:                    R=$imageR$VERTE                                                                       $formatI      #
#20030912____:$xci/$reduction$X   A=$nomI premiere=$numero0 pas=1 erreur=FAUX postfixe=$BLEUE moyenne=$moyenne maximum=$maximum    \  #
#20030912____:                    R=$imageR$BLEUE                                                                       $formatI      #

$xci/$reduction$X   A=$nomI premiere=$numero0 pas=1 ErreurLecture=FAUX postfixe=$ROUGE moyenne=$moyenne maximum=$maximum                \
                    R=$imageR$ROUGE                                                                                     $formatI
$xci/$reduction$X   A=$nomI premiere=$numero0 pas=1 ErreurLecture=FAUX postfixe=$VERTE moyenne=$moyenne maximum=$maximum                \
                    R=$imageR$VERTE                                                                                     $formatI
$xci/$reduction$X   A=$nomI premiere=$numero0 pas=1 ErreurLecture=FAUX postfixe=$BLEUE moyenne=$moyenne maximum=$maximum                \
                    R=$imageR$BLEUE                                                                                     $formatI
                                        # Et reduction finale. ATTENTION, l'option :                                                  #
                                        #                                                                                             #
                                        #                   moyenne=VRAI                                                              #
                                        #                                                                                             #
                                        # provoquera en general sur les images en fausses couleurs des artefacts ; prenons par        #
                                        # exemple le cas de deux zones contigues, l'une de couleur verte et l'autre de couleur        #
                                        # magenta lorsqu'elle est visualisee avec '$xiP/cercle.32'. Une fois separees en vraies       #
                                        # couleur, la composante $VERTE contiendra la zone verte anterieure, mais la zone qui lui     #
                                        # etait contigue (et magenta) deviendra noire (dans la composante $VERTE) ; la procedure      #
                                        # de moyennage va donc introduire un lisere fonce autour de la zone verte... Alors quelle     #
                                        # est la solution ? Faire :                                                                   #
                                        #                                                                                             #
                                        #                   moyenne=FAUX                                                              #
                                        #                                                                                             #
                                        # resoudrait le probleme, mais crerait un probleme de qualite pour les images en vraies       #
                                        # couleurs. La solution (provisoire ?) est d'introduire la variable '$moyenne' qui inhibe     #
                                        # le moyennage des qu'une image en fausse couleur est rencontree...                           #

$DELETE   $nomI*
$RMDIR    $nomDT
unset     nomDT
                                        # Nettoyage final...                                                                          #



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.