bonjour,
je veux récupérer l'histogramme d'une image couleur RGB
j'ai un petit problème dans la lecture de la valeur du pixel de l'image ( de type QImage ) dans les 3 plans R,G et B,
je ne sais pas comment ça se fait !!
quelqu'un peut m'aider
bonjour,
je veux récupérer l'histogramme d'une image couleur RGB
j'ai un petit problème dans la lecture de la valeur du pixel de l'image ( de type QImage ) dans les 3 plans R,G et B,
je ne sais pas comment ça se fait !!
quelqu'un peut m'aider
Bonjour,
Le plus simple est d'utiliser la classe QColor. Dans la classe QImage, tu as la méthode pixel(int x, int y) qui retourne un QRgb. C'est un typedef sous la forme d'un unsigned int contenant un quadruplet avec les 3 composantes + le canal alpha.
Voici la fonction que j'ai testé sur une image, mais le fichier texte resultant ne contient que des zeros !!!!
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 float fenprincipale::extractGlobalSignature(QString img ) { QImage image(img); QRgb pix; vector<vector<vector<double> > > array3D; array3D.resize(256); for (int i = 0; i < 256; ++i) { array3D[i].resize(256); for (int j = 0; j < 256; ++j) array3D[i][j].resize(256); } QFile file("sig.txt"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return 0; QTextStream flux(&file); flux.setCodec("UTF-8"); unsigned int idx = 0; unsigned int bin = 8; for (unsigned int x = 0; x < image.width(); x++) { for (unsigned int y = 0; y < image.height(); y++) { // idx = 0; pix = image.pixel(x, y); //cout << endl << qBlue(pix) << " " << qGreen(pix) << " " << qRed(pix)<<" "<<pix; int r =qRed(pix)+1; int g=qGreen(pix)+1; int b=qBlue(pix)+1; // idx = bin * idx + int(floor(image.pixel(x, y, channel) * bin)); array3D[r][g][b]++; // flux<<array3D[r][g][b] ; // flux<< array3D[qBlue(pix)][qGreen(pix)][qRed(pix)]<<endl ; } } for (int i=0;i<256;i++) { for(int j=0;j<256;j++) { for (int k=0;k<256;k++) flux << array3D[i][j][k] ; } } return 1; }
Commences par faire un affichage de tes valeurs r, g et b quand tu les crées.
Ensuite, quand tu fais :, réfléchis à ce que tu fais et à quelle position tu veux lire... Attention à la conversion int<>double au passage.
Code : Sélectionner tout - Visualiser dans une fenêtre à part array3D[r][g][b]++;
Je pense que tu veux plutot un tableau 3D, avec deux dimensions pour les positions de pixels : une pour x, une pour y, puis, une dimension pour la valeur qRGB...
Partager