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

OpenCV Discussion :

Niveau de gris sur une image YCrCb


Sujet :

OpenCV

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 19
    Points
    19
    Par défaut Niveau de gris sur une image YCrCb
    Bonjour à tous.
    Je travail actuellement sur un projet de reconnaissance faciale, et je suis bloqué sur une fonction opencv : cvConvertImage(......);

    En effet, après avoir changer l'espace couleur de mon image de RGB à YCrCb en utilisant la fonction:cvCvtColor(img,img_y,CV_RGB2YCrCb), je dois appliqué le niveau de gris sur l'image en utilisant la composante luminance Y seulement.

    Voici mon code
    :

    IplImage* img=cvLoadImage(ch.c_str());
    IplImage* img_y=cvCloneImage(img);
    cvCvtColor(img,img_y,CV_RGB2YCrCb);
    img_nvg = cvCreateImage(cvGetSize(img_y), img_y->depth, 1);
    //Correction de l'origine si nécessaire
    int flip = 0;
    if(img->origin!=IPL_ORIGIN_TL){
    flip = CV_CVTIMG_FLIP;
    }
    cvConvertImage(img_y, img_nvg, flip);
    cvShowImage("Résultat", img_y);

    est ce que quelqu'un peut m'aider svp.

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    img_nvg = cvCreateImage(cvGetSize(img_y), img_y->depth, 1);
    8 bit l'image en nvg de plus ton image de départ doit être en 8 bit ou en float

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    img_nvg = cvCreateImage(cvGetSize(img_y), img_y->depth, 1)

    Le troisième paramètre (1) signifie qu'on utilise un seul canal c'est à dire l'image est codé sur 8 bit.

    En plus, j'ai déjà appliqué le niveau de gris sur l'image, mais le but c'est de l'appliquer seulement sur la composante luminance (Y) puisqu'on travaille dans l'espace couleur YCrCb.

    Merci d'avance.

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    IplImage* cvCreateImage(CvSize size, int depth, int channels)
    Creates an image header and allocates the image data
     
    Parameters: •size – Image width and height
    •depth – Image depth (see CreateImage)
    •channels – Number of channels (see CreateImage)
    le 1 correspond au nombre de channel et non à la taille

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    C'est vrai, tu as raison et j'ai modifié alors cette ligne:

    img_nvg = cvCreateImage(cvGetSize(img_y), IPL_DEPTH_8U, 1)

    Par contre, le problème, c'est qu'il faut appliquer le niveau de gris seulement sur la composante luminance Y.

    En utilisant cette fonction:
    cvConvertImage(img_y, img_nvg, flip);

    Je pense que je suis entrain d'appliquer le niveau de gris sur les trois canaux (Y, Cr, Cb).

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    Oui en effet tu le fais sur l'image complète mais ceci devrait t'aider :
    void cvSplit(const CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3)¶
    Divides multi-channel array into several single-channel arrays or extracts a single channel from the array.

    #define cvCvtPixToPlane cvSplit
    Parameters: •src – Source array
    •dst0 – Destination channel 0
    •dst1 – Destination channel 1
    •dst2 – Destination channel 2
    •dst3 – Destination channel 3


    The function divides a multi-channel array into separate single-channel arrays. Two modes are available for the operation. If the source array has N channels then if the first N destination channels are not NULL, they all are extracted from the source array; if only a single destination channel of the first N is not NULL, this particular channel is extracted; otherwise an error is raised. The rest of the destination channels (beyond the first N) must always be NULL. For IplImage Copy with COI set can be also used to extract a single channel from the image.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Par ailleurs, vu ton code, il faut utiliser CV_BGR2YCrCb et non CV_RGB2YCrCb car par défaut OpenCV représente les images en BGR et non en RGB (ordre des canaux inversé).

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    je dirais plutot que c'est du à l'encodage de l'image mais tu as raison sur le BGR

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Je vous remercie, pour votre aide.

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Juste une dernière question svp , en effet j'ai utilisé la fonction :

    cvSplit(img_y, dest0, dest1, dest2, 0);

    img_y => est image converti dans l'espace couleur YCrCb

    est ce que :

    dest0 = Y ?
    dest1 = Cr ?
    dest2 = Cb ?

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    normallement vi

  12. #12
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par snowpy Voir le message
    normallement vi
    C'est à dire

  13. #13
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    normallement oui, l'ordre donne l'entrelacement du codage donc le channel 0 doit être Y

  14. #14
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Merci

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

Discussions similaires

  1. objet en niveau de gris ds une image labelisée
    Par ImagingAllthe dans le forum Images
    Réponses: 4
    Dernier message: 23/10/2009, 15h29
  2. Réponses: 15
    Dernier message: 07/06/2009, 05h22
  3. niveau de gris d'une image
    Par bestof_net dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/05/2009, 21h44
  4. Réponses: 6
    Dernier message: 30/11/2006, 11h08
  5. Niveau de gris d'une image
    Par chahinez dans le forum C++Builder
    Réponses: 13
    Dernier message: 12/06/2006, 21h17

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