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 :

Conversion pas correctement faite de l'espace RGB vers l'espace L*a*b


Sujet :

OpenCV

  1. #1
    Membre du Club
    Inscrit en
    Mars 2012
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 165
    Points : 59
    Points
    59
    Par défaut Conversion pas correctement faite de l'espace RGB vers l'espace L*a*b
    Bonjour,

    Mon objectif est de convertir une image RGB vers l'espace couleur L*a*b.

    J'ai fait la conversion, j'ai généré les valeurs de L, a et b en se basant sur la documentation de opencv.

    A ma connaissance les valeurs de L sont comprises entre 0 et 100. Par contre, les valeurs de L générées sont supérieures à 100. Alors la conversion n'est pas correctement passée.

    Voilà mon programme :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include "cv.h"
    #include "highgui.h"
     
    double f(double t) {
     
           if(t > 0.008856)
                return pow(t, 1/3.0);
           else if (t <= 0.008856)
                return 7.787*t + 16/116;
    }
     
    double genererL(double y) {
     
           if(y > 0.008856)
                return 116*pow(y, 1/3.0) -16 ;
           else if(y <= 0.008856)
                return 903.3*y;      
    }
     
    int main(int argc, char *argv[])
    {
        IplImage *img=NULL, *dst=NULL;
        char *raster, *rasterLAB;
        int w,h,nCh;
        int i,j;
     
        img = cvLoadImage("fruits.jpg",CV_LOAD_IMAGE_COLOR);
        dst = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3);
     
        cvCvtColor(img, dst, CV_BGR2Lab);
        /* Lecture des informations sur l'image */
        raster =  img->imageData; 
        rasterLAB =  dst->imageData;
     
        w = img->width;
        h = img->height;
        nCh = img->nChannels;
     
         uchar R, G, B;
         uchar LAB_L, LAB_a, LAB_b;
     
         /* Image couleur */
         for(i=0;i<h;i++)
         for(j=0;j<w;j++) {
     
            // convert sRGB (R,G,B) to linear-rgb (r,g,b)
            R = *(raster+i*w*nCh+j*nCh);
            G = *(raster+i*w*nCh+j*nCh+1);
            B = *(raster+i*w*nCh+j*nCh+2);
     
            // convert to XYZ (assuming sRGB was D65)
            uchar X =  R*0.412453 + G*0.357580 + B*0.180423;
            uchar Y =  R*0.212671 + G*0.715160 + B*0.072169;
            uchar Z =  R*0.019334 + G*0.119193 + B*0.950227;
     
            // Rescale X/Y/Z relative to white point D65
            double Xr = 0.950456, Yr = 1.0, Zr = 1.088754;
            double xr = X/Xr;
            double yr = Y/Yr;
            double zr = Z/Zr;
     
            LAB_L = genererL(yr);
            LAB_a = 500*(f(xr)-f(yr));
            LAB_b = 200*(f(yr)-f(zr));
     
            if(j==0 && i==0) {
                    printf("\n%d %d %d\n",R, G, B);
                    printf("\n%d %d %d\n",LAB_L, LAB_a, LAB_b);
            }
     
            *(rasterLAB+i*dst->width*dst->nChannels+j*dst->nChannels) = LAB_L;
            *(rasterLAB+i*dst->width*dst->nChannels+j*dst->nChannels+1) = LAB_a;
            *(rasterLAB+i*dst->width*dst->nChannels+j*dst->nChannels+2) = LAB_b;     
         }
     
        /* Création de la fenêtre Windows */ 
        cvNamedWindow( "Source", CV_WINDOW_AUTOSIZE ); 
        cvShowImage( "Source", img );
     
     
        cvNamedWindow("Destination", CV_WINDOW_AUTOSIZE ); 
        cvShowImage( "Destination", dst );
     
        /* Position de la fenêtre */
        cvMoveWindow("Source", 100,100); 
     
        cvWaitKey(0);
     
        /* Libérer la mémoire de la structure image et la fenêtre */
        cvReleaseImage( &img );
        cvReleaseImage( &dst );
        cvDestroyWindow( "Source" );
        cvDestroyWindow( "Destination" );
     
        return 0;
    }
    Merci pour vos renseignements.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2011
    Messages : 147
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    Plus simple, plus rapide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cv::cvtColor(entree,sortie, CV_BGR2Lab);

Discussions similaires

  1. [WM18] Addition qui ne se fait pas correctement.
    Par vinoc dans le forum Windev Mobile
    Réponses: 1
    Dernier message: 06/03/2015, 19h23
  2. Réponses: 8
    Dernier message: 30/09/2009, 09h21
  3. [XL-2007] le tri ne se fait pas correctement en VBA
    Par beegees dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/04/2009, 10h59
  4. Conversion de l'espace RGB vers RGB normalisé
    Par hanane78 dans le forum Images
    Réponses: 5
    Dernier message: 16/08/2007, 13h38
  5. [IB71] mon Blob ne marche pas correctement
    Par BoeufBrocoli dans le forum InterBase
    Réponses: 2
    Dernier message: 17/09/2003, 14h03

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