Conversion RVB vers et depuis YUV
Bonjour,
J'aimerai effectuer la conversion d'une image RGB vers une image YUV, en utilisant la librairie openCV.
Je possède l'image suivante : http://www.hannibalcsd.org/teacherwe...mples/lena.jpg
Et je lui applique le code suivant :
Code:
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
|
IplImage *img2=cvLoadImage("lena.jpg");
IplImage *img3=cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
// boucle de conversion rgb vers yuv
int i;
for (i = 2; i < img2->imageSize; i+=3)
img3->imageData[i-2] = (0.299*img2->imageData[i-2] + 0.587*img2->imageData[i-1] + 0.114*img2->imageData[i]);
img3->imageData[i-1] = -0.147*img2->imageData[i-2] - 0.289*img2->imageData[i-1] + 0.436*img2->imageData[i];
img3->imageData[i] = 0.615*img2->imageData[i-2] - 0.515*img2->imageData[i-1] - 0.100*img2->imageData[i];
*/
// a visualization window is created with title 'image'
cvNamedWindow("image RGB",1);
cvNamedWindow("image YUV",1);
// img is shown in 'image' window
cvShowImage ("image RGB", img2);
cvShowImage ("image YUV",img3);
//wait for a keyboard event
cvWaitKey(0)
return(0); |
Le problème, c'est que ça ne marche pas, quand j'affiche l'image convertie en YUV, j'imagine qu'elle devrait ressembler à l'originale, mais elle est devenue très bleue, comme si j'avais forcé sur le bleu...
J'ai lu ensuite que openCV chargait les images au format BGR, j'ai testé en modifiant mon algorithme en conséquence, cette fois ci, image très rouge...
j'ai vérifié l'algorithme sur wikipédia, et c'est le bon. Le problème est plus fondamentale, y'a des trucs de bases qui doivent m'échapper :(
Déjà : ma photo de base est elle réellement en RGB ? y'a t'il une différrence entre espace des couleurs (yuv, rgb etc.) et format du fichier (jpg,png etc.)
Est ce qu'un jpeg est forcément en rgb ? ou alors un jpeg peut être en ce qu'il veut.
Et quand openCV affiche une image avec cvImageShow, comment il sait qu'elle espace de couleur j'ai utilisé ? Il y a un champ dans IplImage pour le préciser ? Moi j'ai pas trouvé!
Bref, pour être sur que mon algorithme n'est pas en cause, j'ai essayé ça aussi :
Code:
1 2
|
cvCvtColor(img2, img3, CV_BGR2Luv); |
Et c'est toujours aussi dégueulasse !
Pourtant, cvCvtColor convertit correctement lui !
En même temps c'est vrai que je sais pas à quoi est censé ressemblé du Luv, mais ça avait l'air proche du Yuv de ce que j'ai compris.
Voilà, si quelqu'un pouvait m'aider à comprendre toutes ces questions pour que je puisse convertir du RGB en YUV et inversement, je lui en serait très reconnaissant !
Merci de m'avoir lu.