IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Interpolation de tableau 3D


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 399
    Points : 300
    Points
    300
    Par défaut Interpolation de tableau 3D
    Bonjour,

    Je veux faire de la correction de couleurs dans une image en utilisant des tables de correction de type .cube pour une appli Delphi VCL.
    Je recupère les données de la table dans un tableau de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TLutValeur = record
           r,v,b : Byte;
      end;
     
    TableLut : array[0..35,0..35,0..35] of TLutValeur
    Pour appliquer la correction, pour chaque pixel de mon image qui est caractérisé par une valeur du canal Rouge, une du canal Vert et une du canal Bleu.
    avec ce triplet de valeur je vais chercher dans la table le triplet R, V, B correspondant qui est appliqué aux pixels de l'image.
    Le problème c'est que ma table d'entrée contient 36 valeurs sur chaque axe.
    Les pixels ont des couleurs sur une gamme de 256 valeurs par axe.

    Je voudrais donc interpoler les valeurs de la table TableLut pour remplir cette structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TableLut255 : array[0..255,0..255,0..255] of TLutValeur;
    Je n'arrive pas à trouver la solution et à mettre en place les boucles de calcul des points intermédiaires.
    Merci

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Le rapport est de 256/36=7,1 dans chaque dimension. En considérant le cube central X X X O X X X d'une grande dimension, on lui attribue la valeur de celui du petit tableau.
    Il s'agit ensuite d'attribuer les valeurs intermédiaires (X) : o1 X X X X X X o2 entre ces milieux pour toutes les lignes, puis toutes les colonnes.
    Et pour respecter la décimale du rapport des tailles, répéter une ligne et une colonne de temps en temps...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,

    le rapport, je pense que c'est plutot 255/35 ?

    Voici un bout de code valable pour 2 tableaux d'entiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    procedure TForm1.Button2Click(Sender: TObject);
    Const
      n1 = 4 ;
      n2 = 12 ;
    Var
      T1 : Array[0..n1-1] of Integer ;
      T2 : Array[0..n2-1] of Integer ;
      Rap : Double ;
      i, j :Integer ;
      jDeb, jFin : Integer ;
    begin
      Memo1.Clear ;
      Memo2.Clear ;
      For j := 0 To n1-1 Do
        Begin
          T1[j] := 7*j ;
          Memo1.Lines.Add('i = '+InttoStr(j) +'     - T1(i) = '+IntToStr(T1[j])) ;
        End ;
      Rap := (n2-1)/(n1-1) ;
      T2[0] := T1[0] ;
      Memo2.Lines.Add('j = 0     - T2(j) = '+IntToStr(T2[0])) ;
      For i := 0 To n1-2 do
        Begin
          jDeb := Round(i * Rap) ;
          jFin := Round((i+1)*Rap) ;
          If (jDeb <> jFin) Then
            Begin
              For j := jDeb+1 To jFin do
                Begin
                 T2[j] := Round(T1[i]+(T1[i+1]-T1[i]) *(j-jDeb)/(jFin-jDeb)) ;
                 Memo2.Lines.Add('j = '+InttoStr(j) +'     - T2(j) = '+IntToStr(T2[j])) ;
                End ;
            End
          Else
            T2[JDeb] := T1[i] ;
        End ;
    end;
    Tu pourras facilement l'adapter pour chaque composante de ton triplet R G B

    A+
    Charly

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,

    je ne pense pas que tu puisses remplir complétement TableLut255 à partir de TableLut par interpolation.

    Regarde mon exemple ou j'ai interpolé la composante rouge d'une table 4x4 vers une table 6x6. Certaines valeurs ne peuvent pas être calculées (voir l'image dans mon appli) :

    TableLut.zip

    A+
    Charly

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 399
    Points : 300
    Points
    300
    Par défaut
    Bonjour et merci pour refléchir au problème.

    J'en étais arrivé à la même conclusion que toi et je suis parti dans une autre direction pour cette interpolation surtout que l'essai que j'avais fait prenait un temps considérable.
    L'autre axe de mes reflexions pas encore finalisé :
    Le problème quand je pars d'un triplet RVB dans mon image j'ai un ensemble de 2 valeurs sur un espace de codage de 0 à 255.
    Ma table de Lut est par exemple dans un espace de 36 valeurs. D'autres valeurs sont possible mais le pb est le même.
    Lorsque je ramène le rouge par exemple 187 et que je le ramène vers l'espace de la table j'obtiens 187/(256/36)=26,296... donc la "bonne valeur" de rouge est entre 26 et 27.
    Pour les composantes verte et bleue même calcul, donc la couleur d'un pixel est comprise entre Table[R,V,B] et Table[R+1,V+1,B+1]
    Je calcul ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EcartR:=Table[R+1,V+1,B+1].r -Table[R,V,B].r;
    et si je reprend ma valeur 187 qui me donne 26 plus 0,296 la valeur du pixel transformé pour le rouge sera égale à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Round(Table[R,V,B].r +EcartR*0.296);
    Ce type de calcul donne de meilleurs résultats sur les dégradés de couleur que l’application simple de r:=Table[Round(R/k),(V/k),(B/k)].r avec k:=256/36;

    Cela me paraît juste, qu'en penses tu ? Le résultat pour certaines tables est surprenant et même quand c'est "normal" dans certains cas je suis un peu moins bon que Affinity le concurrent de photoshop.

    Si tu veux tester : http://www.vscalendrier.fr/ApplisBB/...2017-12-13.exe

    Le fichier est gros car il contient plein de table de lut

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonsoir,

    je pense que ta méthode doit être correcte et qu'elle est assez simple à implémenter.

    Je n'ai pas pu tester ton envoi, car mon W10 refuse de l'exécuter !

    A+
    Charly

    PS : je n'y connais pas grand chose en traitement d'image et manipulation de pixels !!

Discussions similaires

  1. Interpolations dans un tableau
    Par Julienbot dans le forum Général Python
    Réponses: 5
    Dernier message: 11/05/2015, 10h06
  2. Interpolation tableau 2D
    Par eaglewatch dans le forum LabVIEW
    Réponses: 1
    Dernier message: 04/10/2011, 18h01
  3. Inversion tableau + Interpolation sous VBA
    Par keko38 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/05/2009, 22h09
  4. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 11h15
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo