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

Traitement d'images Discussion :

Passer d'un rendu RGB par calculs à un rendu RYB par une table


Sujet :

Traitement d'images

  1. #181
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    Je ne peux pas répondre simultanément à toutes les questions qui se succèdent en rafale !

    Citation Envoyé par Jipété Voir le message
    ... Et comme je le disais hier, je n'ai pas la moindre idée du paramètre qui débloque, là.

    D'où ma souffrance indescriptible.

    Une question bête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # F(t) = Cos(t) ou F(t) = Cos(t)*(1 + 0.5*sin(t)^2) = Cos(t)*(5 - Cos(2*t))/4
    Que veut dire ce "ou" ? C'est Cos(t) tout court ou l'un des deux calculs ? Sur quels critères choisir ?

    Je suis parti sur ça :
    F(t) := Cos(t) et en remplaçant t, Cos(2 *Pi *i / largeur_wave); --> y := Round(255 * Cos(2 *Pi *i / largeur_wave));.

    Et ça m'affiche ça, le rouge est un poil plus resserré, par contre on note l'apparition d'un trait vert, c'est magique car je ne l'ai pas demandé ...
    Il fallait ajuster les fonctions; je pensais que tu l'avais fait dans le cas des sinusoïdes, en voyant les images produites.

    Puisqu'il y a urgence, essayer:
    F1(x) = (2*Cos(x) + 1)/3
    F2(x) = (8*Cos(x) + 4*Sin(x)2 + 1)/9
    F3(x) = (128*Cos(x) + 64*Sin(x)2 + 16*Sin(x)4 + 7)/135

    Tu pourras t'assurer que pour k = (1, 2, 3) on a:
    a) Fk(0) = Fk(2*Pi) = 1 ;
    b) Fk(2*Pi/3) = Fk(-2*Pi/3) = Fk(4*Pi/3) = 0 .

    Pour une valeur de (k) donnée, la fonction pixel est définie par:
    Ir = Round(255*Fk(x)) si Fk(x)>0 sinon Ir = 0;
    Iv = Round(255*Fk(x + 2*Pi/3)) si Fk(x + 2*Pi/3)>0 sinon Iv = 0;
    Ib = Round(255*Fk(x - 2*Pi/3)) si Fk(x - 2*Pi/3)>0 sinon Ib = 0.

    Commencer par le cas le plus simple (k=1); tu comprendras par la suite ce qui se passe.

    # En plus, je crois me souvenir que ta matrice Bitmap commence en haut à gauche, tandis que la mienne a le mauvais goût de commencer aussi à gauche, mais en bas: tes images apparaîtront donc renversées - mais ce n'est pas grave ...


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  2. #182
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    Je ne peux pas répondre simultanément à toutes les questions qui se succèdent !
    C'est parce que tu es mal organisé, te diras ton supérieur,
    À notre époque, ne pas être multi-tâches, mais tu vas dans le mur,

    Citation Envoyé par wiwaxia Voir le message
    Il fallait ajuster les fonctions par translation, en leur ajoutant une constante appropriée; je pensais que tu l'avais fait dans le cas des sinusoïdes, en voyant les images produites.
    Si tu savais...
    Ce qu'il y avait d'intéressant, sur le site dont j'ai donné le lien et que tu as descendu en flammes, c'est qu'il y avait une image de ce qu'on est censé obtenir, et en comparant l'image et son code simple, en changeant une valeur ici ou là, en plus puis en moins, j'arrive à peu près à me faire une vague idée de ce qui va advenir, mais c'est loin d'être complet et parfait, d'où mon image avec les courbes incomplètes, et mes questions.

    Citation Envoyé par wiwaxia Voir le message
    Puisqu'il y a urgence, essayer:
    F1(x) = (2*Cos(x) + 1)/3
    Non non, il n'y a aucune urgence, il y a juste une énorme lacune de connaissances.
    Et je ne dépasse pas cette étape.
    "Oh mais quelle drôle de chose" dit la poule en regardant un couteau tombé du ciel...
    Voilà que je découvre une nouvelle variable, la bien-nommée "x", dont je ne sais pas du tout ce qu'il faut en faire...

    Citation Envoyé par wiwaxia Voir le message
    Tu pourras t'assurer que pour k = (1, 2, 3) on a:
    a) Fk(0) = Fk(2*Pi) = 1 ;
    Et comment ?
    Quand je lis ce qui précède, les yeux me sortent de la tête et faut que j'aille les ramasser dans la poussière, ce qui n'arrange rien.
    Fk(0) = Fk(2*Pi) donc 0 = 2*Pi ?
    Fk(2*Pi) = 1 donc 2*Pi = 1 ?
    JE NE COMPRENDS RIEN.

    Mais si t'en as marre, on peut arrêter. Un jour la lumière se fera.
    Ou pas...

    Citation Envoyé par wiwaxia Voir le message
    # En plus, je crois me souvenir que ta matrice Bitmap commence en haut à gauche, tandis que la mienne a le mauvais goût de commencer aussi à gauche, mais en bas: tes images apparaîtront donc renversées - mais ce n'est pas grave ...
    Oh que non !
    Si je savais ce que j'écris, au moins...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #183
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    Citation Envoyé par Jipété Voir le message
    ... Ce qu'il y avait d'intéressant, sur le site dont j'ai donné le lien et que tu as descendu en flammes, c'est qu'il y avait une image de ce qu'on est censé obtenir ...
    J'ai simplement dit que les sites qui ne t'ont rien apporté ne sont pas bons, rien de plus ... Je n'en ai consulté aucun, parce que j'ai immédiatement compris ce que représentaient les graphes.

    Citation Envoyé par Jipété Voir le message
    ... il y a juste une énorme lacune de connaissances.
    Et je ne dépasse pas cette étape.
    "Oh mais quelle drôle de chose" dit la poule en regardant un couteau tombé du ciel...
    Voilà que je découvre une nouvelle variable, la bien-nommée "x", dont je ne sais pas du tout ce qu'il faut en faire ...
    Là, c'est de ma faute, j'aurais dû écrire "t" à la place de "x": la calculatrice, sur laquelle je testais les fonctions, ne me laissait pas le choix.
    Il peut y avoir un flottement dans la notation qui n'est pas la même dans un calcul mathématique, un programme Pascal, un programme sur calculatrice ou lors de l'annotation d'une image; j'en suis tellement coutumier que je n'y accorde souvent que peu d'attention.
    Mais je comprends que cela t'ai déstabilisé ... Désolé.

    De plus, il arrive souvent que l'on change, pour des raisons pratiques, quelques détails de notation lorsque l'on entreprend de nouveaux calculs; et j'ai effectivement commencé à répondre à d'autres questions, qui n'ont pas encore été publiées faute de temps
    D'où un décalage, auquel il ne faut pas accorder trop d'importance. Si tu ne comprends pas un détail, demande.

    Je rectifie, donc, pour abréger tes moments pénibles:
    F1(t) = (2*Cos(t) + 1)/3
    F2(t) = (8*Cos(t) + 4*Sin(t)2 + 1)/9
    F3(t) = (128*Cos(t) + 64*Sin(t)2 + 16*Sin(t)4 + 7)/135

    Tu pourras t'assurer que pour k = (1, 2, 3) on a:
    a) Fk(0) = Fk(2*Pi) = 1 ;
    b) Fk(2*Pi/3) = Fk(-2*Pi/3) = Fk(4*Pi/3) = 0 .

    Pour une valeur de (k) donnée, la fonction pixel est définie par:
    Ir = Round(255*Fk(t)) si Fk(t)>0 sinon Ir = 0;
    Iv = Round(255*Fk(t+ 2*Pi/3)) si Fk(t + 2*Pi/3)>0 sinon Iv = 0;
    Ib = Round(255*Fk(t - 2*Pi/3)) si Fk(t - 2*Pi/3)>0 sinon Ib = 0.
    Un détail permettant d'accélérer l'algorithme: les fonctions Fk(u) s'annulant toutes en (2*Pi/3) et (4*Pi/3), la condition Fk(u)>0
    peut être remplacée pas Cos(u)>-1/2
    qui dispense du calcul complet quand il est inutile.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  4. #184
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    Là, c'est de ma faute, j'aurais dû écrire "t" à la place de "x"
    Okay, je reverrai ça à tête reposée, demain matin.

    Là j'ai passé un certain temps à me concocter ça à partir d'un projet que j'avais commencé à étudier il y a quelques années, j'ai fait tourner Keith Jarrett en boucle, et hop !

    Nom : pense-bête.png
Affichages : 141
Taille : 7,3 Ko

    Le code est d'une simplicité éblouissante, par contre, le nom des variables risque de ne pas te plaire,
    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
    procedure TForm6.FormActivate(Sender: TObject);
    var
      x,y: integer;
      OffsetVal,
      Amplitude,
      Long_Onde: integer;
      deux_fois_pi_sur_Long_Onde: double;
    begin
      OffsetVal := img.Height div 2; // pos. vert. de la sinusoïde dans la fenêtre
      Amplitude := img.Height div 3; // hauteur d'une demi-sinusoïde 
      //Long_Onde := img.Width;
      Long_Onde := img.Width - 120;  // compresse les ondes --> fréquence augmente
      deux_fois_pi_sur_Long_Onde := 2 * pi / Long_Onde;
     
      img.Canvas.Pen.Color := clGray;
      img.Canvas.MoveTo(img.Width, OffsetVal);
      img.Canvas.LineTo(0, OffsetVal); // trait de dte à gche, sinon il est rouge
     
      img.Canvas.Pen.Color := clRed;
      //for x := 0 to img.Width-1 do   // largeur image 390
      for x := 0 to img.Width-41 do   // largeur image 390
      begin
        y := OffsetVal + Round(Amplitude * sin(x * deux_fois_pi_sur_Long_Onde));
        img.Canvas.LineTo(x, y);
        //memo1.Lines.Add(Format('%.3d %.3d',[x, y]));
      end;
    end;
    Bien sûr, toutes mes lacunes sont présentes, certains voient dans leur tête le rendu de (t - 2*Pi/3) et la différence avec (t + 2*Pi/3), et moi je ne vois rien…
    C'est comme ça…
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #185
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    J'ai fait un programme, pour vérification de l'algorithme et des codes des trois fonctions de couleur.

    Ce n'est pas compliqué:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
     FUNCTION F3(t: Reel): Byte;
       VAR Ct, s, St, St2, St4, u, v, w: Reel;
       BEGIN
         SinCos(t, St, Ct);
         IF (Ct>-0.5) THEN BEGIN
                             St2:= Sqr(St); St4:= Sqr(St2);
                             u:= 128 * Ct;  v:= 64 * St2;   w:= 16 * St4;
                             s:= u + v;     IncR(s, w + 7); w:= s / 135
                           END
                      ELSE w:= 0;
         Result:= Round(255 * w)
       END;
     
     FUNCTION F2(t: Reel): Byte;
       VAR Ct, s, St, St2, u, v, w: Reel;
       BEGIN
         SinCos(t, St, Ct);
         IF (Ct>-0.5) THEN BEGIN
                             St2:= Sqr(St); u:= 8 * Ct; v:= 4 * St2;
                             s:= u + v;     w:= (s + 1) / 9
                           END
                      ELSE w:= 0;
         Result:= Round(255 * w)
       END;
     
     FUNCTION F1(t: Reel): Byte;
       VAR Ct, St, u, w: Reel;
       BEGIN
         SinCos(t, St, Ct);
         IF (Ct>-0.5) THEN BEGIN
                             u:= 2 * Ct; w:= (u + 1) / 3
                           END
                      ELSE w:= 0;
         Result:= Round(255 * w)
       END;
     
     PROCEDURE CalcMatrIm(La, Ha: Z_32; VAR Ma: Tab_Pix);
       CONST D_Pi = 2 * Pi; Pi2s3 = D_Pi / 3;
       VAR k: Byte; La1, Ha1, Xm, Ym: Z_32; Alpha, Phi, r: Reel; Px: Pixel;
       BEGIN
         La1:= La - 1; Ha1:= Ha - 1;
         FOR Xm:= 0 TO La1 DO
           BEGIN
             r:= Xm / La1; Phi:= D_Pi * r;
             FOR k:= 1 TO 3 DO BEGIN
                                 Alpha:= (k - 1) * Pi2s3;
                                 Px[k]:= F3(Phi - Alpha)
                               END;
             FOR Ym:= 0 TO Ha1 DO Ma[Xm, Ym]:= Px
           END
       END;
    La juxtaposition des 3 palettes résulte d'une modification mineure d'une procédure, et l'intervention de variables fonctionnelles:
    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
     
     TYPE Fonction = FUNCTION(t: Reel): Byte;
     
     PROCEDURE CalcMatrIm_Fk(La, Ha: Z_32; VAR Ma: Tab_Pix);
       CONST D_Pi = 2 * Pi; Pi2s3 = D_Pi / 3;
       VAR k: Byte; La1, Ha1, Ha2, Xm, Ym, Y3: Z_32; Alpha, Phi, r: Reel;
           Px: Pixel; Fk: Fonction;
       BEGIN
         La1:= La - 1; Ha1:= Ha - 1; Ha2:= 2 * Ha;
         FOR Ym:= 0 TO Ha1 DO
           BEGIN
             Y3:= 3 * Ym;
             IF (Y3<Ha) THEN Fk:= F1
                        ELSE IF (Y3<Ha2) THEN Fk:= F2
                                         ELSE Fk:= F3;
             FOR Xm:= 0 TO La1 DO
               BEGIN
                 r:= Xm / La1; Phi:= D_Pi * r;
                 FOR k:= 1 TO 3 DO BEGIN
                                     Alpha:= (k - 1) * Pi2s3;
                                     Px[k]:= Fk(Phi - Alpha)
                                   END;
                 Ma[Xm, Ym]:= Px
               END
           END
       END;
    On voit de bas en haut les palettes correspondant à F1, F2 et F3.

    Nom : PalRVB_F1F2F3.png
Affichages : 172
Taille : 1,9 Ko


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  6. #186
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Et de mon côté j'ai réussi à dessiner où je voulais et comme je voulais les 3 courbes sinusoïdales.

    Nom : 3courbesRGB+dégradés.png
Affichages : 141
Taille : 8,4 Ko

    Dessous, le dégradé correspondant, on est loin d'un gradient RGB classique (comme tes deux premiers) où on peut trouver à gauche toute un vrai rouge à 255,0,0, ici il est à 254,63,63, c'est moins violent.

    On verra bien ce que ça donnera lors de la bascule vers RYB, mais avant, promis, j'étudie ton truc.

    Mais je maintiens que je pars avec un énorme handicap (je ferais mieux d'aller vendre des frites dans un camion, je me dis, des fois) car pour obtenir ces 3 belles courbes je suis reparti de briques déjà en ma possession, car récrire tout ça, au secours !
    Un exemple : pour avoir des décalages corrects et identiques entre les 3 couleurs, de g à dte, il a fallu que je joue comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      // ROUGE
        y := OffsetVal - Round(Amplitude * sin(x * deux_pi_sur_Long_Onde +PI/2));
      // VERT
        y := OffsetVal - Round(Amplitude * sin(x * deux_pi_sur_Long_Onde -PI/6));
      // BLEU
        y := OffsetVal - Round(Amplitude * sin(x * deux_pi_sur_Long_Onde -5*PI/6));
    Je suis sûr qu'il y a des gens à qui ça parle, ce -5*PI/6 et même, qui n'imaginent pas une seconde qu'à moi, ça ne dit absolument rien, à part que c'est une valeur qui permet de décaler ma courbe.
    Je ne m'en sortirai pas…

    EDIT : je constate à l'instant qu'il y a une logique à ces trois valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        y := OffsetVal - Round(Amplitude * sin(x * deux_pi_sur_Long_Onde +3*PI/6));
        y := OffsetVal - Round(Amplitude * sin(x * deux_pi_sur_Long_Onde -1*PI/6));
        y := OffsetVal - Round(Amplitude * sin(x * deux_pi_sur_Long_Onde -5*PI/6));
    Et là, on voit une progression de -4, donc avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        y := OffsetVal - Round(Amplitude * sin(x * deux_pi_sur_Long_Onde -9*PI/6));
    pour le rouge, ça fonctionne aussi.
    Et une logique essaie de se dessiner...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  7. #187
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                             s:= u + v;     IncR(s, w + 7); w:= s / 135
    Bonjour,

    je suis un peu coincé pour tester : IncR(a,b); n'est pas connu de l'unité mathématique de FreePascal/Lazarus,

    Est-ce qu'il s'agit d'une fonction d'incrémentation de la première variable par la valeur de la seconde (IncR(2, 5) va donner 7) ?
    Mais alors que signifie ce "R" dans son nom ? "Reverse" ? C'est une décrémentation ? IncR(2, 5) va donner -3 ?
    Merci de préciser.

    Et sinon, hier j'ai parlé d'un petit défaut, que je retrouve ce matin -- mais hier je t'ai noyé sous les questions : j'avais du temps, j'ai relu les derniers posts,
    Donc j'ai fait ça, dans les deux procédures, ça serait bien que tu jettes un œil, si tu as encore ton programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      FOR Xm:= 0 TO La1 DO BEGIN
    //    r:= Xm / La1; 
        r:= Xm / La;
    Au plaisir de te lire,


    EDIT :
    Et là, j'ai peur qu'il ne te reste qu'une poignée de minutes avant de ne plus avoir le droit d'éditer (on a 3 jours, je crois) :
    Citation Envoyé par Jipété Voir le message
    Citation Envoyé par wiwaxia Voir le message
    Figurent ici des coordonnées relatives: xréel = (Xpixel - Xa)/(Xb - Xa) , w = Icouleur/255 ;
    Le point (A) correspond au blanc (255, 255,255), (B) au noir (0, 0, 0), les points 5i, J) au pixel intermédiaire (PixelC).
    Et là, si tu te dépêches, tu devrais pouvoir éditer et corriger cette fucking faute qui m'a fait perdre un temps que même pas tu peux l'imaginer, à chercher partout les points 5i, J, jusqu'à ce que je comprenne qu'il faut lire (i, j), oui, c'est la même touche, juste caps ou pas caps,
    Alors dépêche dépêche dépêche !
    Clique sur les deux chevrons bleus à droite de ton pseudo dans la citation et zou !
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #188
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    Citation Envoyé par Jipété Voir le message
    ... EDIT :
    Et là, j'ai peur qu'il ne te reste qu'une poignée de minutes avant de ne plus avoir le droit d'éditer (on a 3 jours, je crois) :
    Alors dépêche dépêche dépêche !
    Clique sur les deux chevrons bleus à droite de ton pseudo dans la citation et zou !
    Erreur rectifiée, les fautes de frappe m'échappent facilement - merci pour le signalement

    Citation Envoyé par Jipété Voir le message
    ... je suis un peu coincé pour tester : IncR(a,b); n'est pas connu de l'unité mathématique de FreePascal/Lazarus,

    Est-ce qu'il s'agit d'une fonction d'incrémentation de la première variable par la valeur de la seconde (IncR(2, 5) va donner 7) ?
    Mais alors que signifie ce "R" dans son nom ? "Reverse" ? C'est une décrémentation ? IncR(2, 5) va donner -3 ?
    Merci de préciser ...
    C'est une procédure personnelle, qui incrémente le réel (u) de la quantité (v):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     PROCEDURE IncR(VAR u: Reel; v: Reel);
       VAR w: Reel;
       BEGIN
         w:= u + v; u:= w
       END;
    Bien pratique dans un certain nombre de cas, et qu'on peut aussi tranposer aux vecteurs et aux pixels.

    Citation Envoyé par Jipété Voir le message
    ...Et sinon, hier j'ai parlé d'un petit défaut, que je retrouve ce matin -- mais hier je t'ai noyé sous les questions : j'avais du temps, j'ai relu les derniers posts,
    Donc j'ai fait ça, dans les deux procédures, ça serait bien que tu jettes un œil, si tu as encore ton programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      FOR Xm:= 0 TO La1 DO BEGIN
    //    r:= Xm / La1; 
        r:= Xm / La;
    Au plaisir de te lire ...
    Lorsque la coordonnée entière (Xm) varie de (0) à (La1 = La - 1), le rapport réel (r) varie de (0) à (La1/La1 = 1) et l'on se retrouve alors dans la dernière colonne de pixels, dans l'image de largeur (La) que l'on s'est donnée.
    La couleur y est effectivement identique à celle de de la première colonne; c'est un choix discutable, mais sans conséquence dans le cas d'une palette ouverte; la rectification s'imposerait effectivement dans le cas d'une palette circulaire.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  9. #189
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Et voilà !


    Nom : et_hop.png
Affichages : 146
Taille : 5,6 Ko

    Bon, je ne sais pas encore ce qu'on en fera, si d'autres veulent jouer, voilà les corrections que j'ai apportées à ton code :

    d'abord j'ai conservé r:= Xm / La; puisque
    Citation Envoyé par wiwaxia Voir le message
    La couleur y est effectivement identique à celle de de la première colonne; c'est un choix discutable, mais sans conséquence dans le cas d'une palette ouverte; la rectification s'imposerait effectivement dans le cas d'une palette circulaire.
    donc autant faire les choses proprement dès le départ, surtout si ça ne mange pas d'pain, parce que partir à la chasse à ce genre de bug 6 mois plus tard, laisse tomber !

    Ensuite, j'ai considérablement remanié ton système de fonctions, il n'y en a plus qu'une à qui je passe le paramètre qui va bien pour qu'elle s'organise -- c'est vrai, quoi, 3 fonctions qui font presque la même chose, c'est lourd !
    Regarde (j'ai même inclus ton IncR -- boîte noire, boîte noire ) :
    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
    function fx_jpt(t: Real; idx: integer): byte;
    VAR
      Ct, St: extended;
      s, St2, St4, u, v, w: Real;
     
      PROCEDURE IncR(VAR u:Real; v:Real); VAR w:Real; BEGIN w:=u+v; u:=w; END;
     
    begin
      SinCos(t, St, Ct); // uses Math, entrée Float, 2 sorties Float
      w := 0; // éventuellement recalculé dessous
      if Ct > - 0.5 then
        case idx of
          1: BEGIN u:= 2 * Ct; w:= (u + 1) / 3; END;
          2: BEGIN St2:= Sqr(St); u:= 8 * Ct; v:= 4 * St2; s:= u + v; w:= (s + 1) / 9; END;
          3: BEGIN St2:= Sqr(St); St4:= Sqr(St2);
                   u:= 128 * Ct;  v:= 64 * St2;   w:= 16 * St4;
                   s:= u + v;     IncR(s, w + 7); w:= s / 135; END;
        end;
      Result:= Round(255 * w)
    end;
    Et cette petite merveille est appelée par l'une ou l'autre procédure ainsi :
    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
    PROCEDURE CalcMatrIm_Fk(La, Ha: uint; VAR Ma: Tab_Pix);
    ...
    //    FOR k:= 1 TO 3 DO BEGIN Alpha:= (k - 1) * Pi2s3; Px[k]:= Fk(Phi - Alpha); END;
          FOR k:= 1 TO 3 DO BEGIN
            Alpha:= (k - 1) * Pi2s3;
            case k of
              1: r:=fx_jpt(Phi - Alpha, Fk);
              2: g:=fx_jpt(Phi - Alpha, Fk);
              3: b:=fx_jpt(Phi - Alpha, Fk);
            end;
          END;
     
    PROCEDURE CalcMatrIm(La, Ha: uint; VAR Ma: Tab_Pix);
    ...
    //  FOR k:= 1 TO 3 DO BEGIN Alpha:= (k - 1) * Pi2s3; Px[k]:= F3(Phi - Alpha); END;
        FOR k:= 1 TO 3 DO BEGIN
          Alpha:= (k - 1) * Pi2s3;
          case k of
            1: r:=fx_jpt(Phi - Alpha, 3);
            2: g:=fx_jpt(Phi - Alpha, 3);
            3: b:=fx_jpt(Phi - Alpha, 3);
          end;
        END;
    Oui, j'ai été obligé de virer Px: Pixel;, remplacé par le triplet r,g,b: byte; et du coup la sortie des deux procédures devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        FOR Ym:= 0 TO Ha1 DO Ma[Xm, Ym]:= {Px } RGBtoColor(r,g,b);
    // pour l'une, et pour l'autre
          Ma[Xm, Ym]:= {Px } RGBtoColor(r,g,b);
    Tout ça est appelé/activé par une fiche contenant 1 TImage de 360 x 90, comme ça :
    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
    type
      Tab_Pix = array[0..359, 0..89] of TColor; // largeur hauteur du TImage
     
    procedure TForm7.FormActivate(Sender: TObject);
    var
      w,h: integer;
      Ma: Tab_Pix;
    begin
    //CalcMatrIm(   img.Width, img.Height, Ma); // = bande du bas de l'img dessous 
    // au choix
      CalcMatrIm_Fk(img.Width, img.Height, Ma);
     
      for h := 0 to img.Height-1 do
        for w := 0 to img.Width-1  do
          img.Canvas.Pixels[w, h] := TColor(Ma[w, h]);
    end;
    Attention, img.Canvas.Pixels est une manière de faire looooongue, irl il faut passer par Scanline, que je laisse aux lecteurs comme un exercice, il y a tout ce qu'il faut pour faire,

    J'ai un autre truc à voir, je laisse décanter ce qui précède, ça te laissera le temps de nous préparer quelques lignes et une belle image sur ces histoires de rupture de pente, que j'aimerais bien approfondir et conclure.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  10. #190
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    Au sujet des liens précédemment consultés (#173) dont tu déplorais le contenu

    Citation Envoyé par Jipété Voir le message
    ... mais leur mise en œuvre sur le web est une véritable catastrophe : je n'ai rien trouvé qui m'explique les choses intelligemment, chacun y va de son petit exemple avec des noms de variables à la onc, des commentaires qui se contredisent ou t'enfoncent dans le brouillard, bref, rien pour avancer sereinement ...
    je crois que le site qui t'a proposé la dernière palette mérite le pompon de sa catégorie

    Nom : JPT_Pal RVB_Sinus_139% & 2 autres pal.png
Affichages : 134
Taille : 24,9 Ko

    Du point de vue physique, assimiler l'abscisse à la longueur d'onde est une ânerie.
    Mais bien pire encore, j'ai reconstitué l'algorithme qui apparaît franchement consternant: la fonction s'y réduit à une translation près à la fonction Cos(t)2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     FUNCTION Fcos2(t: Reel): Byte;
       VAR u, w: Reel;
       BEGIN
         u:= Cos(0.5 * t); w:= Sqr(u);
         Result:= Round(255 * w)
       END;
    Je ne m'attendais, au premier abord, à une telle ineptie.
    Voici la palette reconstituée;
    Nom : PalRVB_Cosinus2.png
Affichages : 142
Taille : 775 octets

    Les défauts sont criants:
    Nom : JPT_PAl_Sinus_139% _A.png
Affichages : 159
Taille : 30,5 Ko
    a) les couleurs secondaires (A = Jaune, Cyan, Magenta) apparaissent assombries en raison d'une intensité trop faible (I = 255*(31/2/2)2 = 255*3/4 ~ 191 ;
    b) les couleurs primaires (B = Rouge, Vert, Bleu) sont rendues laiteuses parce qu'elles sont abîmées par un fond résiduel non négligeable (I = 255/4 ~ 64).


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  11. #191
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    a) les couleurs secondaires (A = Jaune, Cyan, Magenta) apparaissent assombries en raison d'une intensité trop faible (I = 255*(31/2/2)2 = 255*3/4 ~ 191 ;
    b) les couleurs primaires (B = Rouge, Vert, Bleu) sont rendues laiteuses parce qu'elles sont abîmées par un fond résiduel non négligeable (I - 255/4 ~ 64).
    Bravo pour l'analyse. Tu as effectivement une vision des choses que je n'ai pas, avec ces rapprochements entre les valeurs et les couleurs observées, où tu vois un lien qu'hélas je ne vois pas, même en me promenant sur l'image avec le colorpicker,

    Il faudrait donc avoir des courbes qui resteraient plus longtemps en haut et en bas, au prix d'une ascension et d'une descente plus abruptes et plus rapides, c'est ça ?

    Mais comment mettre ça en équation ? C'est là que pour moi le bât blesse,


    HS :
    Citation Envoyé par wiwaxia Voir le message
    Au sujet des liens précédemment consultés (#173) …
    Que du bonheur, le coup des références de post cliquables
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  12. #192
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    Là je suis noyé, et j'ai failli perdre mon dernier message

    ... c'est vrai, quoi, 3 fonctions qui font presque la même chose, c'est lourd ! ...
    La juxtaposition, c'était pour la comparaison des teintes; il faut bien sûr utiliser séparément ces fonctions, en les appelant par la procédure banale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CalcMatrIm_Sinus(Larg_Image, Haut_Image, Matr_Image);
    Tu choisis l'une des trois, à ta convenance: elles sont effectivement de plus en plus compliquées, mais conduisent à des palettes de qualité croissante:
    Les zones sombres s'estompent, sans qu'apparaissent des raies de brillance anormale: les fonctions utilisées sont continues et continument dérivables, donc dépourvues de rupture de pente au voisinages des plus fortes intensités.
    Les discontinuités aux points de raccordement aux paliers horizontaux (I = 0) sont invisibles puisqu'intervenant à intensité nulle.

    ... Il faudrait donc avoir des courbes qui resteraient plus longtemps en haut ...
    Mais comment mettre ça en équation ? C'est là que pour moi le bât blesse ...
    C'est précisément ce qu'elles font ! Elles ne t'ont pas été proposées pour le plaisir douteux de te voir glisser sur une peau de banane
    Dans leur partie supérieure, les graphes se rapprochent du palier supérieur (I = Imax = 255):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    t       0      Pi/3 = 60°
    F1     255     232.22 ~ 232
    F2     255     252.97 ~ 253
    F3     255     254.72 ~ 255
    en haut et en bas, au prix d'une ascension et d'une descente plus abruptes et plus rapides, c'est ça ?
    Non, car la coloration deviendrai discontinue.
    Il faut tracer les graphes des coefficients, pour bien comprendre ce qui se passe.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  13. #193
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    Il faut tracer les graphes des coefficients, pour bien comprendre ce qui se passe.
    Quelque chose comme ça ?
    Note : j'ai inversé le rendu des courbes, de sorte qu'on ait les grandes valeurs en haut, histoire que les courbes soient en phase avec le gradient, visuellement parlant.

    Nom : courbes2couleursRGB.png
Affichages : 144
Taille : 9,8 Ko

    J'ai fait au plus simple, à la suite du remplissage de la matrice dans FormActivate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      with img4courbes do // 360x256
        for h := 0 to Height-1 do begin
          for x := 0 to Width-1 do begin
            ijpColorToRGB(Ma[x,h], r,g,b);
            Canvas.Pixels[x,256-r] := clRed;
            Canvas.Pixels[x,256-g] := clGreen;
            Canvas.Pixels[x,256-b] := clBlue;
          end;
        end;
    et je ne comprends pas pourquoi j'ai deux colonnes au fond à droite pleines de cochonneries...

    EDIT :
    Et pendant que j'y suis, c'est l'affaire de 30 secondes, les deux autres modes :
    Nom : courbes2couleursRGB_mode2.png
Affichages : 142
Taille : 10,2 KoNom : courbes2couleursRGB_mode1.png
Affichages : 135
Taille : 11,1 Ko

    Tu reconnaîtras ta fonction F3 tout en haut et ci-dessus F2 à g et F1 à dte.

    Citation Envoyé par wiwaxia Voir le message
    Tu choisis l'une des trois, à ta convenance: elles sont effectivement de plus en plus compliquées, mais conduisent à des palettes de qualité croissante:
    Comme quoi les goûts et les couleurs, hein...
    Si ce n'était pas cette violente tache bleue, ma préférée est la plus simple.

    Mais ce bleu fort, de toute façon, se duplique en plus étroit sur les autres rendus : je pense qu'il faudrait apporter une correction propre aux couleurs, on en a déjà parlé un peu, mais là, je ne vois pas trop quoi, où, et comment l'introduire : du calcul ? Du brute-force par règle de 3 juste avant l'introduction dans la matrice ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  14. #194
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    ... Tu reconnaîtras ta fonction F3 tout en haut et ci-dessus F2 à g et F1 à dte.
    C'est bien ce qu'il m'avait paru.
    Tu as fait du bon travail.

    ... Comme quoi les goûts et les couleurs, hein...
    Si ce n'était pas cette violente tache bleue, ma préférée est la plus simple ...
    La finalité de cet échange n'est pas esthétique, mais technique; le but est des trouver les codes optimaux produisant des palettes de couleur d'éclat maximal, mais dépourvues de raies (ou de cercles) anormalement brillants; la continuité de la dérivée qui en découle pour les 3 fonctions envisagées dans un cadre donné constitue un critère suffisamment précis pour produire des résultats intéressants.

    Il existe une infinité de cercles chromatiques, dont on peut à loisir modifier les teintes, et qui pourraient être centrés sur une autre couleur que le blanc; mais cela nous entraînerait beaucoup trop loin, et fera éventuellement l'objet d'une autre échange.

    ... je ne comprends pas pourquoi j'ai deux colonnes au fond à droite pleines de cochonneries ...
    As-tu vérifié le balayage des abscisses ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOR Truc:= 0 TO Machin DO ...


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  15. #195
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    C'est bien ce qu'il m'avait paru.
    Tu as fait du bon travail.
    Merci, de ta part ça fait vraiment plaisir.

    Et en plus je peux mieux faire !

    En éliminant les cochonneries à droite et en affinant le dessin des points, les courbes sont plus belles, et j'en ai profité pour ajouter un petit paramètre à la fonction, qui permet donc de choisir la courbe aisément :

    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
    procedure TForm7.FormActivate(Sender: TObject);
    var
      w,h: integer;
      Ma: Tab_Pix;
      r,g,b: byte;
    begin
      // init matrice  -- prendre la hauteur de la plus grande des deux images
      for h:=0 to img4courbes.Height-1 do for w:=0 to WIDTH_IMGS-1 do Ma[w,h]:=0;
     
      CalcMatrIm(WIDTH_IMGS, img4courbes.Height, 1, Ma); // 1, 2, 3
     
      for w := 0 to WIDTH_IMGS-1  do begin
        with img4degrade do
          for h := 0 to Height-1 do
            Canvas.Pixels[w,h] := TColor(Ma[w,h]);
        with img4courbes do begin
          ijpColorToRGB(Ma[w,h], r,g,b);
          Canvas.Pixels[w,256-b] := clBlue;
          Canvas.Pixels[w,256-g] := clGreen;
          Canvas.Pixels[w,256-r] := clRed;
        end;
      end;
    end;
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type                         //89
      Tab_Pix = array[0..359, 0..255] of TColor; // largeur -- hauteur de la + gde des 2
     
    const
      WIDTH_IMGS = 360;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    PROCEDURE CalcMatrIm(La, Ha: uint; courbe: uint; VAR Ma: Tab_Pix);
    ...
    BEGIN
      if (courbe < 1) or (courbe > 3) then exit;
    ...
          case k of
            1: r:=fx_jpt(Phi - Alpha, courbe);
            2: g:=fx_jpt(Phi - Alpha, courbe);
            3: b:=fx_jpt(Phi - Alpha, courbe);
          end;
    Résultat,
    Nom : mode1_final.png
Affichages : 162
Taille : 10,4 Ko

    Et le coup d'initialiser la matrice à 0 partout permet d'éliminer les cochonneries à droite et d'afficher deux images noires si on passe autre chose que 1, 2 ou 3 à la fonction.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  16. #196
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Bonjour,

    hier j'ai un peu fait avancer empiriquement et je n'ai pas eu le temps de poster, alors ce matin à la fraîche, voilà ce qu'il en est.

    D'abord j'ai légèrement corrigé les rapports entre les 3 primaires, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        FOR k:= 1 TO 3 DO BEGIN
          Alpha:= (k - 1) * Pi2s3;
          case k of
            //1: r:=fx_jpt(Phi - Alpha, courbe);
            //2: g:=fx_jpt(Phi - Alpha, courbe);
            //3: b:=fx_jpt(Phi - Alpha, courbe);
            1: r:=trunc(fx_jpt(Phi - Alpha, courbe) * 0.95);
            2: g:=trunc(fx_jpt(Phi - Alpha, courbe) * 0.9);
            3: b:=trunc(fx_jpt(Phi - Alpha, courbe) * 0.85);
          end;
        END;
    Alors ce n'est certainement pas comme ça qu'il faudrait faire dans la vraie vie, mais ça aura au moins eu le mérite de me montrer que ça n'arrangeait pas les affaires du bleu, qui allait devenir encore plus sombre que ce qu'il était déjà.
    J'ai réfléchi à l'option opposée, qui consisterait à remonter les 2 autres couleurs du côté de 240, là où elles sont à 0, mais ne sachant pas du tout comment faire, j'ai tenté une méthode bourrin, genre, lors du dessin des courbes,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      for w := 0 to WIDTH_IMGS-1  do 
        with img4courbes do
          for h := 0 to Height-1 do begin
            ColorToRGB(Ma[w,h], r,g,b);
            if (w > 230) and (w < 250) then // correction r et g
              begin if r=0 then r:=r+10; if g=0 then g:=g+5; end;
            Canvas.Pixels[w,256-b] := clBlue;
            Canvas.Pixels[w,256-g] := clGreen;
            Canvas.Pixels[w,256-r] := clRed;
          end;
    Ce bidouillage se matérialise par les tout petits traits horizontaux entre 230 et 250, il faudrait arriver à des fins de droite en forme de courbe, mais là aussi, pas la moindre idée de quoi où comment faire…
    Nom : tentatives_corrections.png
Affichages : 210
Taille : 7,0 Ko

    EDIT : en regardant cette copie d'écran là dans le forum, je me dis soudain que ça serait intéressant de remplacer les parties plates des courbes, en bas, par les mêmes choses qu'on voit en haut, avec les jolis arrondis.
    C'est possible, ça ?

    Merci merci, et désolé pour la profondeur insondable de mon ignorance en ce domaine.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  17. #197
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    Re-bonjour,

    Je dispose de peu de temps.

    Citation Envoyé par Jipété Voir le message
    ... D'abord j'ai légèrement corrigé les rapports entre les 3 primaires, comme ça ...
    Nom : JPT_Calcul nouvelles fonctions_01.png
Affichages : 131
Taille : 71,0 Ko

    La fonction Trunc(.) est ici inappropriée, parce qu'elle correspond à une approximation systématique par défaut; elle diminue statistiquement les valeurs réelles d'une demi-unité (0.5), tandis que Round(.) n'introduit aucun biais.

    L'introduction de coefficients n'est pas illégitime, mais leur choix est d'ordre subjectif. Le résultat peut être intéressant, tans que l'affaiblissement n'est pas trop prononcé, et ne concerne essentiellement que le rouge et le vert, composantes auxquelles la rétine est le plus sensible.
    La gestion des teintes sombres dans une palette pourrait être abordée, mais d'une façon complètement différente.

    Citation Envoyé par Jipété Voir le message
    ... Alors ce n'est certainement pas comme ça qu'il faudrait faire dans la vraie vie ...
    Les couleurs de l'écran sont-elles les vraies couleurs observées dans la vraie vie ? Tu risques d'amorcer ici un très long débat ...

    Citation Envoyé par Jipété Voir le message
    ... J'ai réfléchi à l'option opposée, qui consisterait à remonter les 2 autres couleurs du côté de 240, là où elles sont à 0, mais ne sachant pas du tout comment faire, j'ai tenté une méthode bourrin, genre, lors du dessin des courbes ...
    ... Ce bidouillage se matérialise par les tout petits traits horizontaux entre 230 et 250, il faudrait arriver à des fins de droite en forme de courbe, mais là aussi, pas la moindre idée de quoi où comment faire…

    Nom : tentatives_corrections.png
Affichages : 210
Taille : 7,0 Ko

    EDIT : en regardant cette copie d'écran là dans le forum, je me dis soudain que ça serait intéressant de remplacer les parties plates des courbes, en bas, par les mêmes choses qu'on voit en haut, avec les jolis arrondis.
    C'est possible, ça ? ...
    L'objectif de la palette est en principe de présenter une gamme de couleurs pures, dont une composante au moins est nulle, et l'autre maximale:
    Min(r, v, b) = 0 ; Max(r, v, b) = 255 .
    L'entorse tolérée à la seconde condition a pour justification d'éviter une surbrillance marquée au voisinage des couleurs secondaires (pour r = v , v = b ou r = b).
    Cela concerne la méthode suivie, et n'exclut pas l'extension de la palette dans une seconde dimension (par évolution vers le blanc ou le noir, par exemple) _ on y reviendra.

    De plus le regard ne perçoit plus rien à basse intensité; c'est pourquoi les raccordements anguleux des courbes au paliers horizontaux d'ordonnée nulle n'ont aucune importance.
    Par ailleurs, la complexité des fonctions croît très rapidement en fonction du nombre de termes; l'établissement de l'expression de F4(t) a demandé de plus de 2 pages de calcul, qu'il a fallu recommencer 3 ou 4 fois . Tu l'ajouteras plus tard à ta panoplie.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  18. #198
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    La fonction Trunc(.) est ici inappropriée, parce qu'elle correspond à une approximation systématique par défaut; elle diminue statistiquement les valeurs réelles d'une demi-unité (0.5), tandis que Round(.) n'introduit aucun biais.
    Yes I know, mais là c'était plus une forme de précaution qu'autre chose : je me suis dit qu'avec tous ces nombres à virgule, si par malheur il y en avait un à par ex. 255,57, un Round nous le passerait à 256 et c'est pas glop pour les datas finales.
    Si on est sûr de chez sûr que jamais on ne dépassera 255 alors ok pour le Round.

    Citation Envoyé par wiwaxia Voir le message
    Citation Envoyé par jipété Voir le message
    ... Alors ce n'est certainement pas comme ça qu'il faudrait faire dans la vraie vie ...
    Les couleurs de l'écran sont-elles les vraies couleurs observées dans la vraie vie ? Tu risques d'amorcer ici un très long débat ...
    Je parlais de la manière de coder la correction, avec ces valeurs gravées dans le marbre et donc impossible d'avoir un curseur sur le côté de la fiche pour voir en temps réel de possibles variations.

    Citation Envoyé par wiwaxia Voir le message
    L'objectif de la palette est en principe de présenter une gamme de couleurs pures,
    D'accord d'accord, mais en général quand tu vas chez un marchand de couleurs, il va te sortir un échéancier avec plein de teintes variant de ceci à cela, et c'est un peu mon idée :
    - en haut les couleurs pures ;
    - dessous les couleurs modifiées avec le curseur sur le côté.
    Et on avise, à partir de là.

    J'ai modifié mon exemple, c'est une horreur, mais c'est pour montrer l'idée (parce que franchement, cette barre bleue à 0,0,255 est à vomir) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      for w := 0 to WIDTH_IMGS-1  do begin
        with img4degrade do
          for h := 0 to Height-1 do begin
    //        Canvas.Pixels[w,h] := Ma[w,h];
            ColorToRGB(Ma[w,h], r,g,b);
            if (w > 220) and (w < 260) then // corrections r et g
              begin if r < 15 then r:=r+30; if g < 15 then g:=g+30; end;
            Canvas.Pixels[w,h] := RGBtoColor(r,g,b);
          end;
    et le résultat :
    Nom : corrections_r-et-v.png
Affichages : 142
Taille : 789 octets

    C'est très moche, mais c'est juste pour montrer qu'on peut impacter le bleu violent de cette manière.

    Citation Envoyé par wiwaxia Voir le message
    l'établissement de l'expression de F4(t) a demandé plus de 2 pages de calcul, qu'il a fallu recommencer 3 ou 4 fois .
    Tu m'en vois sincèrement navré, si si. Je souffre également, dans certains domaines. Mais quelle satisfaction quand, d'un coup, ça tombe en marche !
    Tiens, d'ailleurs, ça me fait penser, avec toutes tes variables anonymes dans les fonctions, je ne sais absolument pas laquelle toucher pour arriver à tel ou tel résultat.
    Il faudrait que tu rajoutes des commentaires, quand tu auras 5 minutes.
    Parce qu'encore une fois, si un matheux capte instantanément ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          3: BEGIN St2:= Sqr(Sint); St4:= Sqr(St2);
                   u:= 128 * Cost;  v:= 64 * St2; w:= 16 * St4;
                   s:= u + v;     IncR(s, w + 7); w:=  s / 135
             END
    , un béotien est très très mal et croise très fort les doigts en espérant n'avoir jamais à devoir mettre les mains là-dedans, hé oui…
    Et si tu regardes bien, tu verras que j'avais un peu commencé : St --> Sint, Ct --> Cost, avec des effets de bord linguistiques indésirables, genre Sint qui pourrait se lire S-int et int c'est connu, en C, ou Cost qui fait penser à coût,
    Mais pour moi c'est toujours mieux que Ct qui fait penser à… rien ou St et il manque un prénom, là,

    Citation Envoyé par wiwaxia Voir le message
    Tu l'ajouteras plus tard à ta panoplie.
    Dès que j'aurais mis la main dessus.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  19. #199
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    Yes I know, mais là c'était plus une forme de précaution qu'autre chose : je me suis dit qu'avec tous ces nombres à virgule, si par malheur il y en avait un à par ex. 255,57, un Round nous le passerait à 256 et c'est pas glop pour les datas finales.
    Si on est sûr de chez sûr que jamais on ne dépassera 255 alors ok pour le Round.
    Les fonctions "internes" Gk(t) qui interviennent dans l'expression des intensités de couleur
    Fk(t) = Round(255 * Gk(t))
    ne dépassent jamais l'unité, et vérifient rigoureusement Gk(t) <= 1 .
    Leur expression est établie en vue des propriétés suivantes:
    G1(t) ~ 1 - K1*t2 (constante au 2nd ordre près)

    G2(t) ~ 1 - K2*t4 (constante au 4me ordre près)

    G3(t) ~ 1 - K3*t6 (constante au 6me ordre près)

    G4(t) ~ 1 - K4*t8 (constante au 8me ordre près)

    d'où le rapprochement progressif des graphes de la tangente horizontale à l'origine, d'ordonnée égale à 1.

    # Les expressions mathématiques des 3 premières ont été données auparavant #181
    avec une autre notation, mais ce n'est pas un obstacle.
    Je reviendrai sur les algorithmes correspondants, qui ne sont pas compliqués.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  20. #200
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    # Les expressions mathématiques des 3 premières ont été données auparavant #181
    avec une autre notation, mais ce n'est pas un obstacle.
    En suivant ton lien je suis retombé sur ça
    Citation Envoyé par wiwaxia Voir le message
    F1(x) = (2*Cos(x) + 1)/3
    F2(x) = (8*Cos(x) + 4*Sin(x)2 + 1)/9
    F3(x) = (128*Cos(x) + 64*Sin(x)2 + 16*Sin(x)4 + 7)/135

    Tu pourras t'assurer que pour k = (1, 2, 3) on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a) Fk(0) = Fk(2*Pi) = 1 ;
    b) Fk(2*Pi/3) = Fk(-2*Pi/3) = Fk(4*Pi/3) = 0 .
    Pour une valeur de (k) donnée, la fonction pixel est définie par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Ir = Round(255*Fk(x)) si Fk(x)>0 sinon Ir = 0;
    Iv = Round(255*Fk(x + 2*Pi/3)) si Fk(x + 2*Pi/3)>0 sinon Iv = 0;
    Ib = Round(255*Fk(x - 2*Pi/3)) si Fk(x - 2*Pi/3)>0 sinon Ib = 0.
    Commencer par le cas le plus simple (k=1); tu comprendras par la suite ce qui se passe.
    que tu as récrit, mais on était partis ailleurs, tu as bien fait de le remettre sur le tapis, au moins la première partie j'ai pu l'intégrer et du coup la fonction fx_jpt devient beaucoup plus lisible :
    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
    function fx_jpt(t: Real; idx: integer): byte;
    VAR
      Cost, Sint: extended;
      w: Real;
    begin
      SinCos(t, Sint, Cost); // uses Math, entrée Float, 2 sorties Float
      w := 0;
      if Cost > -0.5 then
        case idx of
          1: w := (  2*Cost + 1)/  3;
          2: w := (  8*Cost +  4*Sint*Sint + 1)/  9; 
          3: w := (128*Cost + 64*Sint*Sint + 16*Sint*Sint*Sint*Sint + 7)/135; 
        end; // 128 c'est 2^7 64 c'est 2^6 16 c'est 2^4
      Result:= Round(255 * w)
    end;
    Avec ces 3 lignes j'arrive à ça, de haut en bas 1 puis 2 et 3 :
    Nom : 3rendus.png
Affichages : 142
Taille : 1,8 Ko

    On voit très peu de différences entre 2 et 3, peut-être que les secondaires sont un poil plus larges en 3 qu'en 2.
    Une chose est sure, c'est qu'il y a obligatoirement des différences puisque les passages d'une image à l'autre sont visibles.

    Retour aux équations :
    Moi, j'ai besoin de comprendre, et avec mes faibles moyens je ne vois aucune logique dans ce qui précède et que je reprends ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1: w := (  2*Cost +                                         1)/  3;
    2: w := (  8*Cost +  4*Sint*Sint                          + 1)/  9;
    3: w := (128*Cost + 64*Sint*Sint + 16*Sint*Sint*Sint*Sint + 7)/135;
    128 c'est 27 et le 7 on le retrouve avant la parenthèse fermante, tout comme la 1re ligne où 2 c'est 21 qu'on retrouve au même endroit.
    Mais 8 c'est 23 et si je mets un 3 au lieu du 1 dans la parenthèse de la 2e ligne c'est la cata.
    Mauvais plan.
    Tout au bout, 1re ligne 3 c'est 31, dessous 9 c'est 32 mais 135 c'est rien, ou plutôt 33*5, rien à voir avec les deux précédents.
    À partir de ces informations, il m'est impossible d'envisager d'écrire une 4e ligne, à part
    4: w := (256*Cost + je_sais_pas_quoi)/34*?

    Au milieu, 4 c'est 22, 64 c'est 26, dois-je inventer un 210*Sint*Sint ?
    De toute façon, je ne saurai pas quoi mettre après.
    C'est dommage parce que de mon côté, ça avance tranquillou son petit bonhomme de chemin :
    Nom : avancement.png
Affichages : 134
Taille : 20,2 Ko

    À toi.
    (et une idée pour mettre à côté de 1, 2, 3 ? Quelques mots ?)
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

+ Répondre à la discussion
Cette discussion est résolue.
Page 10 sur 17 PremièrePremière ... 67891011121314 ... DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/06/2007, 11h40
  2. [SQL] calcul de plusieurs variables dans une table
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/03/2006, 21h53
  3. Etat bloqué par une table
    Par aujero dans le forum Access
    Réponses: 4
    Dernier message: 06/02/2006, 17h53
  4. Réponses: 12
    Dernier message: 21/10/2005, 14h35
  5. Réponses: 4
    Dernier message: 13/10/2005, 14h44

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