7
votes

Comment obtenir la valeur RVB par CIMG?

CImg<unsigned char> src("image.jpg");
int width = src.width();
int height = src.height();
unsigned char* ptr = src.data(10,10); 
How can I get rgb from ptr?

0 commentaires

4 Réponses :


4
votes

de La documentation CIMG - Section 6.13 à la page 34, et section 8.1.4.16 À la page 120 - On dirait que la méthode DATA CODE> peut prendre quatre arguments forts>: x, y, z et c: xxx pré>

... où c code> fait référence au canal de couleur. Je suppose que si votre image est en effet une image RGB, utilisez des valeurs de 0, 1 ou 2 pour C code> vous donnera les composants rouge, vert et bleu à un donné x, y code> emplacement. p>

par exemple: p> xxx pré>

(mais ceci est juste une supposition!) P>

edit: strong> p>

On dirait qu'il y a aussi un opérateur () pour CIMG qui fonctionne de la même manière: P>

unsigned char r = src(10, 10, 0, 0);


5 commentaires

Avez-vous essayé opérateur (), par ex. non signé Char r = src (10,10,0,0);


Dépend vraiment de votre image, mais les canaux RG et B sont fractionnés, la lecture d'un canal vous permettra de vous procurera la valeur rouge (c.-à-d. Canal 0 avec une image JPG), le canal 1 vous permettra de vous verrade et du canal 2 vous obtiendra le bleu. ... Theres un exemple qui le fait avec une image de flotteur dans la documentation à la section 8.1.4.9 , 0,0); non signé Char g = src.data (10,10,0,1); non signé CHAR B = SRC.DATA (10,10,0,2);


@wamp: J'imagine que les images en niveaux de gris ont une seule chaîne de données par pixel et que vous pourrez accéder à cette valeur exactement de la même manière que vous accéderiez au composant "rouge" d'une image RVB. Par exemple. Char V = SRC (10, 10, 0, 0);


Comment déterminer s'il s'agit d'une image RVB ou en niveaux de gris avec CIMG?


@ user198729: On dirait que la méthode Spectrum renvoie le nombre de canaux de couleur. Donc, int numchannelels = src.spectrum (); peut définir numcannels sur 3 pour une image RVB, alors qu'il pourrait être 1 pour une image en niveaux de gris.



7
votes

Testé sur Ubuntu 10.04 avec une image RGB à la main 3x3 enregistrée comme test.png : xxx

fichier source cimg_test.cpp : xxx

compiler et exécuter: xxx

ÇA fonctionne.


3 commentaires

@wamp: SRC (C, R, 0,0) est la valeur 0-255 de votre pixel d'image gris (R, C).


L'appel explicite (int) était critique dans ma demande. Merci d'avoir fourni cette réponse!


Après presque 11 ans ... vous êtes les bienvenus, @ SO860! :RÉ



-1
votes

@wamp: Je ne sais pas sur CIMG mais les images en niveaux de gris dans RVB ont:

r = g = b

et en CMJN:

c = m = y = 0

k = luminance

Donc, vous n'avez même pas besoin d'une fonction pour cela ...


1 commentaires

Ce n'est pas vrai. Bien que vous puissiez avoir une image enregistrée au format RVB qui utilise uniquement R = G = B, vous utiliserez 3 fois autant de données que nécessaire pour stocker l'image. C'est pourquoi il y a un format de niveaux de gris pour les images qui ne sauve qu'un seul canal.



2
votes

Le moyen le plus simple d'accéder aux données est avec l'opérateur () code>: xxx pré>

Vous frappez probablement la confusion car la CIMG stocke les données brutes non entrelacées. Par exemple, vos données brutes sont stockées R1, R2, ..., G1, G2, ..., B1, B2, ... Code> Au lieu de R1, G1, B1, R2, G2 , B2, ... Code> Voir: http://cimg.eu/reference/group__cimg__storage.html p>

.Data () code> vient de retourner un pointeur, afin d'accéder directement aux données directement comme ci-dessus que vous feriez: P>

CImg<unsigned char> src("image.jpg");
int width = src.width();
int height = src.height();
unsigned char* ptr = src.data(10,10);
unsigned char r = ptr[0];
unsigned char g = ptr[0+width*height];
unsigned char b = ptr[0+2*width*height];


0 commentaires