Conversion d'une image 8 bits OpenCV BGR en CIE L * a * b *
Je suis en train de convertir une donnée Mat
représentant un RVB image avec 8 bits de profondeur de Laboratoire à l'aide de la fonction fournie dans la documentation:
cvtColor(source, destination, <conversion code>);
J'ai essayé de conversion des codes:
CV_RGB2Lab
CV_BGR2Lab
CV_LBGR2Lab
J'ai reçu bizarre résultats à chaque fois, avec un "L" valeur de plus de 100 pour certains échantillons, littéralement <107, 125, 130>.
Je suis aussi à l'aide de Photoshop pour vérifier les résultats - mais étant donné que la 107 est au-delà de la plage 0 ≤ L ≤ 100, je ne peux pas comprendre ce que mon erreur est.
Mise à jour:
Je vais poster mes résultats globaux ici:
Donné une image (Mat) représenté par 8-bit BGR, l'image peut être converti par le texte suivant:
cvtColor(source, destination, CV_BGR2Lab);
Les valeurs des pixels sont accessibles de la manière suivante:
int step = destination.step;
int channels = destination.channels();
for (int i = 0; i < destination.rows(); i++) {
for (int j = 0; j < destination.cols(); j++) {
Point3_<uchar> pixelData;
//L*: 0-255 (elsewhere is represented by 0 to 100)
pixelData.x = destination.data[step*i + channels*j + 0];
//a*: 0-255 (elsewhere is represented by -127 to 127)
pixelData.y = destination.data[step*i + channels*j + 1];
//b*: 0-255 (elsewhere is represented by -127 to 127)
pixelData.z = destination.data[step*i + channels*j + 2];
}
}
source d'informationauteur JT Cho
Vous devez vous connecter pour publier un commentaire.
C'est parce que L valeur est dans la gamme [0..255] dans OpenCV. Vous pouvez simplement adapter cette valeur à besoin d'intervalle ([0..100] dans votre cas).
Si quelqu'un est intéressé, dans la gamme des autres variables
a
etb
j'ai fait un petit programme pour tester leur gamme.Si vous convertissez toutes les couleurs sont représentées avec RVB pour le CieLab utilisé dans OpenCV, les plages sont de:
Et si vous êtes en utilisant les valeurs RVB de la mode flottant au lieu de uint8 les plages sont:
P. S. Si vous voulez voir comment les distinguer (concernant la perception de l'homme) est un LABORATOIRE de la valeur à partir d'un autre LABORATOIRE de la valeur, vous devez utiliser la virgule flottante. L'échelle utilisée pour garder les valeurs de laboratoire dans le uint8 plages salit avec leur distance euclidienne.
C'est le code que j'ai utilisé (python):
Je ne suis pas sûr de João Abrantes à A et B.
La opencv documentation a clairement mentionné le
CIE L*a*b*
gamme.8 bits images
Conduisant ainsi à une gamme de
Dans le cas où tout le monde court dans la même question:
Veuillez noter que dans OpenCV (2.4.13), vous pouvez pas convertir CV_32FC3 BGR images dans l'espace couleur Lab. C'est-à-dire:
sera pas travail
alors que
fonctionne comme un charme.
Je n'ai pas traquer la cause de cette conduite; cependant, il semble hors de moi, parce que cette, en effet, place des limites sur l'image est de qualité.