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 :

de RVB en gris => comment choisir les params??


Sujet :

Traitement d'images

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut de RVB en gris => comment choisir les params??
    hello,

    Je veux convertir une image RVB en niveaux de gris. En faisant un histogramme sur chaque couleur je me rends compte que le canal vert est beaucoup plus étroit que les autres, or j'utilise la formule suivante:

    Y = 0.299*R + 0.587*G + 0.114*B

    Je voulais savoir si je pouvais calculer les 3 coefficients (0.299 ; 0.587 ; 0.114) en tenant compte de ma répartition RVB, de tel sorte d'obtenir une image plus "fine", dans mon exemple de diminuer le facteur pour le canal vert.

    existe-il un calcul particulier??

    ps: je sais bien que c'est pas une question d'algorithme mais je sais pas trop dans quel forum aller

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    tout les softs d'imagerie font la conversion, donc il existe des algos.

    Le plus simple ne serait il pas de faire la moyenne des trois couleurs ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #3
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    j'aurait dit une moyenne pondérée, afin de palier aux contraste trop forts...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    Voici le genre d'histogramme que j'obtiens:

    Je ne suis pas très sur que la moyenne des 3 canaux soit très performants...

    Toto13 sais tu ou je pourrais trouver ce genre d'algo (j'ai dans l'idée que ça utilise la moyenne et l'ecart type mais je sais pas exactement le calcul a appliquer)
    Images attachées Images attachées  

  5. #5
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Salut la formule :

    Y = 0.299*R + 0.587*G + 0.114*B

    correspond au calcul de la luminance. C'est la luminance telle que les êtres humains la perçoivent (brillant, sombre, etc...). L'oeil humain est plus influencé par la luminance des composantes vertes que celles des composantes bleues et rouges. C'est donc pour cela que le vert y est prédominant.

    C'est également pour cela, il me semble, que sur les filtres couleur des capteurs couleur , on trouve 2 pixels vert pour 1 pixel rouge et 1 pixel bleu en maille carrée (et aussi en maille hexagonale je crois).

    Le mode de conversion d'une image RGB en niveau de gris n'est pas "normalisé" et il ne tient qu'à toi de définir des propres coefficients de pondération.

    ... en tenant compte de ma répartition RVB, de tel sorte d'obtenir une image plus "fine", dans mon exemple de diminuer le facteur pour le canal vert.
    Par contre ton post traduit un induit un autre problème je pense. Peut-être l'espace RGB dans lequel tu travailles n'est pas celui qui correspond le mieux à ton problème. Si tu veux isoler un ensemble de teintes particulier, passe en HLS.

    A+

    Flo.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    pour resoudre mon probleme, j'ai fait un histogramme sur chaque canal (tabR, tabG, tabB), l'histo a une longeur de 22.

    et voila le travail:

    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
        int r, g, b;
        r = g = b = 22;
     
     
        for(i=0;i<22;i++)
        {
            if(tabR[i] == 0) r--;
            if(tabG[i] == 0) g--;
            if(tabB[i] == 0) b--;
        }
     
        int sum = r + g + b;
     
        *R = (float) r / sum;
        *G = (float) g / sum;
        *B = (float) b / sum;
    merci pour votre aide

  7. #7
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Il me semble que ton calcul n'est pas normalisé. Ton image résultat ne sera donc pas forcément étalée sur la pleine échelle des valeurs.

    C'est dommage : tu perds de l'information lors de cette conversion.

    Ton calcul est étrange, je suis pas sur qu'il corresponde à quelque chose de concrêt. Tu peux détailler son principe, stp ?

    Ton calcul est très dépendant du bruit aussi ...

    Flo.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    petite explication sur le calcul:

    j'ai un histogramme de 22 colonnes
    des que je n'ai pas de valeurs pour un canal, dans une colonne de l'histogramme, je soustrait 1 à 22 etc

    Lorsque j'ai balayé tout l'histogramme, j'obtiens un truc qui ressemble à ça:
    r = 15
    g = 20
    b = 12
    (ce qui signifie que 15 colonnes de l'histo rouge ne sont pas nulles, 20 pour le vert...)

    Ensuite je normalise mes valeurs R, G, B en divisant par la somme des colonnes non nulles des 3 canaux.

    Au final R+G+B = 1
    avec R = 15 / (15 + 20 + 12) = 0.31
    G = 0.42
    B = 0.25

    et voila je peux passer aux niveaux de gris:
    en appliquant la formule:
    Yn = R * (la valeur du pixel rouge) + G * (la valeur du pixel vert) + B * (la valeur du pixel bleu)

    ou Y signifie la valeur de mon pixel en niveau de gris de 0 à 255



    Dis moi flo qu'entends-tu par bruit ??

  9. #9
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Ok

    je pensais que :

    *R = (float) r / sum;
    *G = (float) g / sum;
    *B = (float) b / sum;
    correspondait au calcul RGB du pixel courant ... j'avais pas compris que R, G et B étaient tes coefficients de conversions en niveaux de gris (faut dire que c'était pas précisé) ...

    Quant aux bruits, imagine que tu as :

    tabR[1] = 1;

    Une valeur parasite, mal triée, mal seuillée, ..., du bruit quoi !!!

    Ben du coup, ça fausse ton calcul.

    Mais bon ça dépend de tes données : cependant mieux vaut ne pas traiter des donner brutes pour ta conversion ...

    Flo.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    Dis moi flo, je suis en train de me demander si je n'ai pas fait une bêtise:

    On est d'accord pour dire que le canal vert est plus résolu que les autres, mais curieusement c'est celui pour lequel la répartition dans l'histogramme est la plus étroite, et d'après ce que tu viens de me dire à propos du bruit c'est donc le canal le moins bruité.

    Il faudrait donc dans mon calcul que je fasse un truc qui ressemble à ça:
    r = 22 - r
    g = 22 - g
    b = 22 - b

    sum = r + g + b

    R = r / sum
    G = g / sum
    B = b / sum

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    effectivement après test les résultats sont (beaucoup) mieux

  12. #12
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Quelles genres de données traites-tu exactement ? Ce "22" est intriguant ...

    D'autre part je ré-itère mes avertissements, ta formule est très sensible au bruit. Si t'as des données bruitées, il se peut que les 22 éléments de ton histogramme ne soient pas nuls ... tes calculs seront faussés.

    En outre, ton calcul n'intègre pas (par exemple) la fréquence d'apparition des valeurs qui est une base du travail sur les histogrammes ... ça rejoint ma remarque sur le bruit.

    si tu as hist[a] = 100000 et hist[b] = 5

    N'est-il pas judicieux de considérer hist[b] = null ? Tu vois ce que je veux dire ?

    La probabilité d'obtenir un niveau "a" est beaucoup plus grande que celle d'obtenir un niveau "b" (qui peut être considérée comme quasiment nulle).

    Flo.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    Ok j'intègre ce que tu m'as dit pour le bruit.
    je vais essayer de trouver le seuil au dela duquel ce n'est plus considéré comme du bruit.


    le 22 correspond au tranches de valeurs:
    si pixel[i]<= 12 alors tabR[0]++
    si pixel[i]<=24 && pixel[i]>12 alors tabR[1]++
    ...
    si pixel[i]>252 alors tabR[21]++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment choisir les adresses IP des ordinateurs du réseau ?
    Par saadi-amina dans le forum Administration
    Réponses: 2
    Dernier message: 16/09/2008, 09h38
  2. Comment choisir les colonnes d'un fichier à charger?
    Par Monfy29 dans le forum SQL*Loader
    Réponses: 2
    Dernier message: 04/08/2008, 11h58
  3. Comment choisir les index d'une table
    Par whitespirit dans le forum Débuter
    Réponses: 10
    Dernier message: 27/05/2008, 07h53
  4. Comment choisir les bons chiffres pour ma somme?!
    Par rhum_un dans le forum Excel
    Réponses: 3
    Dernier message: 29/04/2008, 17h35
  5. [Lumières] Comment choisir les lumières à activer ?
    Par bigquick dans le forum OpenGL
    Réponses: 3
    Dernier message: 30/10/2004, 01h58

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