2017-02-25 3 views
-1

De opencv documentation je trouve que le L un espace colorimétrique b * a une valeur limitée pour chaque variable comme suit:pixel lecture d'un L * a * b image de l'espace couleur

0 < L < 100 
-127 < a < 127 
-127 < b < 127 

j'ai écrit un code qui lire et convertir une image de type BGR en L a b * espace colorimétrique. Quand je montre la valeur de L, a et bi ont trouvé que les valeurs sont hors plage (toutes)

Par exemple dans un pixel (y, x) la valeur de b est 150 mais à partir de la documentation opencv 2.4.13 b doit être compris entre -127 et 127 le code est le suivant:

#include <opencv2/core/core.hpp> 
    #include <opencv2/highgui/highgui.hpp> 
    #include "opencv2/imgproc/imgproc.hpp" 
    #include <iostream> 

    using namespace cv; 
    using namespace std; 


    int main(int argc, char** argv){ 

    Mat input, Lab_img; 

    input = imread("E:\\Walid\\Images\\b2.jpg"); 


    cvtColor(input, Lab_img, CV_BGR2Lab); 
    namedWindow("ORIGINAL", WINDOW_AUTOSIZE); 
    namedWindow("Lab", WINDOW_AUTOSIZE); 



    for (int y = 0; y < Lab_img.rows; y++) 
    { 
     for (int x = 0; x < Lab_img.cols; x++) 
     { 
      Vec3b intensity = Lab_img.at<Vec3b>(y, x); 
      double L = intensity.val[0]; 
      double a = intensity.val[1]; 
      double b = intensity.val[2]; 
      cout << b << std::endl; 
     } 
    } 


    imshow("ORIGINAL", input); 
    imshow("Lab", Lab_img); 

    waitKey(0); 
    return 0; 
    } 
+0

Vous pouvez vérifier la source code. a et b sont compensés par 128. Et j'ai trouvé que j'avais oublié la plupart des détails. – BlueWanderer

+0

Ajout d'un lien vers la documentation pertinente que le PO a mal interprétée (ou pas assez lu). –

+0

@BarryMichaelDoyle S'il vous plaît arrêtez de laisser ce commentaire chaque fois que vous faites un montage. Vous n'avez pas besoin d'expliquer vos modifications via des commentaires. – meagar

Répondre

0

est ici référence pour cvtColor Dans la section RVB < -> CIE l * a * b * il est dit:

Cette sortie 0 < = L < = 100, -127 < = < = 127, -127 < = b < = 127. Les valeurs sont ensuite converties au type de données de destination: Pour 8 bits images L = L * 255/100, a = a + 128, b = b + 128.

+0

Thnx beaucoup donc si j'ai b = -50 je dois le convertir en b = 78 en ajoutant 128 à l'ancienne valeur. –

+0

Pourquoi ne pas simplement transformer le caractère 'unsigned char' en' signed char', avant qu'il ne soit (implicitement) transformé en 'double'? –