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

Composants FMX Delphi Discussion :

Analyser une image contenant un gradient (dégradé de couleurs)


Sujet :

Composants FMX Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 915
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 915
    Billets dans le blog
    66
    Par défaut Analyser une image contenant un gradient (dégradé de couleurs)
    Bonjour,

    Je cherche des pistes pour mieux définir mon analyse de gradient.

    Mon programme test est basique. Au design je créé un rectangle avec un gradient.

    puis via le onclick j'utilise ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm3.Rectangle2Click(Sender: TObject);
    var bmp : Tbitmap;
        dbmp : TBitmapData;
        dobreak : boolean;
        x,y :integer;
    begin
     bmp:=Rectangle2.MakeScreenshot;
     bmp.Map(TMapAccess.read,dbmp);
     var tcolor:=dbmp.GetPixel(0,0);   // topleft
     var cColor:=dbmp.GetPixel(dbmp.width div 2, dbmp.height div 2);   // center
     radiant.text:=format('%s %s',[AlphaColorToString(tcolor), AlphaColorToString(ccolor)]);
     bmp.Unmap(dbmp);
     freeandnil(bmp);
    end;
    Nom : Capture.png
Affichages : 121
Taille : 24,8 Ko

    Facile, oui, mais, ce n'est qu'un exemple particulier !
    Comment détecter le type (radial dans cet exemple) et surtout le centre ?
    Dans le cas d'un gradient linéaire cela devient encore plus compliqué puisque l'angle va jouer !

    Et enfin, je ne me suis arrêté qu'à deux couleurs or les possibilités des gradients (même si je trouve que le designer est plutôt bogué) sont énormes.

    Il y a déjà un bail, j'avais fait un truc par code pour un composant led
    . Cet aparté me fait penser que depuis 2022 les choses ont peut-être changé

    Vous vous poserez peut-être la question du pourquoi je me casse la tête. Ma réponse : cela concerne toujours les styles firemonkey
    Nom : Capture.png
Affichages : 130
Taille : 155,0 Ko
    Comment extraire le gradient du style Calypso complexe puisqu'il me semble qu'il est impossible à réaliser avec Delphi, il doit manquer les gradients de type conique et mesh (encore que pour ce dernier je pense que ce n'est qu'un problème de centre)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes), D13 (Florence)
    SGBD : Firebird 2.5, 3, 5 et SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Invité de passage
    Homme Profil pro
         ​​​  
    Inscrit en
    Décembre 2025
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité :      ​​​  

    Informations forums :
    Inscription : Décembre 2025
    Messages : 65
    Par défaut
    Bonjour,
    Je pense pour mieux analyser l'image c'est de la convertir en format moins précis soit en niveau de gris puis le format 16bit ou autres.. soit limiter le nombre de couleurs celà créera des délimitations bien claires pour détecter le type du dégradé.

    EDIT:


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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 966
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Peut-être l'analyse de la luminosité pourrait-elle aider ?
    Chercher le minimum et le maximum puis si des points équidistants (dans différentes directions) présentent des différences de luminosité proportionnelles à cette distance ou variant dans le même sens.
    Delphi 5 Pro - Delphi 12 Athènes Community Edition - CodeTyphon 8.80 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 !

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 915
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 915
    Billets dans le blog
    66
    Par défaut
    @Tourlourou Point intéressant, j'y avais plus ou moins pensé, mais rien de concret. Je vais dormir dessus.

    Pendant ce temps, j'ai concocté ceci
    Nom : Capture.png
Affichages : 88
Taille : 27,8 Ko
    avec ce code
    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 TForm3.Rectangle3Click(Sender: TObject);
    var bmp : Tbitmap;
        dbmp : TBitmapData;
        dobreak : boolean;
        maxx,maxy,minx,miny :integer;
        Maxcolor, Mincolor : TAlphaColor;
    begin
     bmp:=Rectangle3.MakeScreenshot;
     bmp.Map(TMapAccess.read,dbmp);
     
     maxcolor:=TalphaColors.White;
     mincolor:=TalphaColors.Alpha;
    // var tcolor:=dbmp.GetPixel(0,0);
    // var cColor:=dbmp.GetPixel(dbmp.width div 2, dbmp.height div 2);
     
     for var x := 0 to dbmp.width-1 do
        for var y := 0 to dbmp.height-1 do
          begin
            var acolor:=dbmp.GetPixel(x,y);
            if acolor<maxcolor then begin
                 maxcolor:=acolor;
                 maxx:=x;
                 maxy:=y;
            end;
            if aColor>mincolor then
              begin
               mincolor:=aColor;
               minx:=x;
               miny:=y;
              end;
          end;
     
     
     radiant3.text:=format('%s - %d %d; %s - %d %d',[AlphaColorToString(maxcolor),maxx,maxy, AlphaColorToString(mincolor),minx,miny]);
     bmp.Unmap(dbmp);
     freeandnil(bmp);
    end;
    demain je me lance donc dans une transformation du gradient au runtime histoire de tester un peu plus ce truc
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes), D13 (Florence)
    SGBD : Firebird 2.5, 3, 5 et SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 966
    Billets dans le blog
    6
    Par défaut
    Bonjour Serge,
    Le sens des comparaisons if acolor<maxcolor et if aColor>mincolor est-il juste ?
    Delphi 5 Pro - Delphi 12 Athènes Community Edition - CodeTyphon 8.80 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 !

  6. #6
    Membre confirmé

    Profil pro
    senior scientist
    Inscrit en
    Mai 2003
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : senior scientist

    Informations forums :
    Inscription : Mai 2003
    Messages : 97
    Billets dans le blog
    1
    Par défaut
    Comme l'a suggéré @Tourlourou, le "gradient" va être déterminé par la variation de la luminance dans chaque couleur.

    Je ne sais pas trop ce que signifie "gradient" dans ce contexte d'IHM, mais je suppose qu'il s'agit d'une variation linéaire, donc que la surface qui représente la variation de luminance est plane.

    Plus exactement: un plan, si le centre est sur un bord de l'image; un cône, si le le gradient est radial et le centre est dans l'image, un "toit de maison" dans ce cas si le gradient n'est pas radial.
    Mathématiquement, la direction du gradient va être déterminée par l'orientation de la normale à cette surface située à la position de son centre (donc de son maximum).

    Donc, il faudrait (dans chaque couleur) déterminer d'abord la position du maximum de luminance.
    Si le maximum est sur un bord, la direction du gradient est dans la direction perpendiculaire (le long de l'autre bord).
    Sinon, si le maximum est à l'intérieur de l'image, il est atteint en un seul point (gradient radial) ou le long d'une ligne (comme dans ton 2ème exemple). Sa direction peut être déterminée par la variation de luminance dans n'importe quelle direction (cas radial) ou par la direction perpendiculaire à l'arête trouvée (dans le cas non radial).

    ça devrait pouvoir se coder facilement.
    Par exemple en utilisant le produit vectoriel de deux vecteurs (à 3 dimensions: position et luminance) constitués chacuns d'un point de l'image et d'un point dans l'ensemble des points du maximum de luminance.

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 548
    Par défaut
    Salut,

    Comme ça, intuitivement, je partirais sur la valeur médiane du rayon (ou du gradient/radien selon ce que tu manipules).

    Je récupérerais ensuite tous les pixels possédant cette valeur, ou compris dans une certaine tolérance autour de celle-ci.

    À partir de cet ensemble de points, je chercherais ensuite la forme géométrique dominante qui s’en dégage :

    cercle,
    cube,
    courbe,
    droite,
    croix,
    X,
    etc.

    L’idée serait donc :

    segmenter les pixels par valeur,
    extraire des amas cohérents,
    analyser leur géométrie,
    identifier la primitive correspondante.
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag :resolu:

  8. #8
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 838
    Par défaut
    Ce que veut faire @anapurna, cela s'appelle 1 convolution : regarde sur la page Wikipédia kernel (<- en anglais) et sur cette page en français (filtre de Sobel et autres)

    En gros tu as 1 matrice (souvent 3x3) que tu vas faire glisser points par points et tu vas sommer les multiplications d'un point de l'image avec la valeur dans la matrice (<- cela va faire 3 multiplications pour chaque couleur; RGB)

    Et ensuite ? c'est là que cela devient technique :

    Mais tout cela va dépendre de ta détection si elle réussie vraiment à détecter 1 cercle (gradient radial) ou des lignes

Discussions similaires

  1. Découpages d'une image contenant plusieurs objets sur un fond uni
    Par PerlPicker dans le forum Traitement d'images
    Réponses: 0
    Dernier message: 04/01/2010, 16h17
  2. Réponses: 4
    Dernier message: 20/10/2009, 03h11
  3. [Turbo Pascal] Peut-on utiliser GetPixel pour analyser une image sans l'afficher ?
    Par _Hope_ dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 01/01/2009, 22h07
  4. Zoom sur une image contenant des liens hypertexte
    Par Eric C dans le forum Powerpoint
    Réponses: 6
    Dernier message: 26/04/2008, 09h53
  5. Réponses: 3
    Dernier message: 08/06/2007, 13h49

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