Как получить значение RGB по CIMG? - PullRequest
5 голосов
/ 20 июля 2010
CImg<unsigned char> src("image.jpg");
int width = src.width();
int height = src.height();
unsigned char* ptr = src.data(10,10); 

Как я могу получить rgb от ptr?

Ответы [ 4 ]

6 голосов
/ 21 июля 2010

Протестировано в Ubuntu 10.04 с RGB-изображением ручной работы 3x3, сохраненным как test.png:

sudo apt-get install cimg-dev

Исходный файл cimg_test.cpp:

#include <iostream>
using namespace std;

#include <CImg.h>
using namespace cimg_library;

int main()
{
    CImg<unsigned char> src("test.png");
    int width = src.width();
    int height = src.height();
    cout << width << "x" << height << endl;
    for (int r = 0; r < height; r++)
        for (int c = 0; c < width; c++)
            cout << "(" << r << "," << c << ") ="
                 << " R" << (int)src(c,r,0,0)
                 << " G" << (int)src(c,r,0,1)
                 << " B" << (int)src(c,r,0,2) << endl;
    return 0;
}

Скомпилируйте и запустите:

g++ cimg_test.cpp -lX11 -lpthread -o cimg_test

./cimg_test 
3x3
(0,0) = R0 G0 B0
(0,1) = R255 G0 B0
(0,2) = R0 G255 B0
(1,0) = R0 G0 B255
(1,1) = R128 G128 B128
(1,2) = R0 G0 B128
(2,0) = R128 G0 B0
(2,1) = R0 G128 B0
(2,2) = R255 G255 B255

Работает.

3 голосов
/ 20 июля 2010

Из документации CImg - раздел 6.13 на странице 34 и раздел 8.1.4.16 на странице 120 - похоже, что метод data может принимать четыре аргумента :x, y, z и c:

T* data(const unsigned int x, const unsigned int y = 0, 
        const unsigned int z = 0, const unsigned int c = 0)

... где c относится к цветному каналу.Я предполагаю, что если ваше изображение действительно является изображением RGB, то использование значений 0, 1 или 2 для c даст вам красный, зеленый и синий компоненты в данном x, y местоположении.

Например:

unsigned char *r = src.data(10, 10, 0, 0);
unsigned char *g = src.data(10, 10, 0, 1);
unsigned char *b = src.data(10, 10, 0, 2);

(Но это всего лишь предположение!)

Редактировать:

Похоже, что есть такжеoperator () для CImg, который работает аналогичным образом:

unsigned char r = src(10, 10, 0, 0);
1 голос
/ 23 сентября 2016

Самый простой способ получить доступ к данным с помощью оператора ():

unsigned char r = img(10,10,0,0);
unsigned char g = img(10,10,0,1);
unsigned char b = img(10,10,0,2);

Вероятно, вы попадаете в замешательство, поскольку CImg хранит необработанные данные без чередования. т.е. ваши необработанные данные хранятся R1, R2, ..., G1, G2, ..., B1, B2, ... вместо R1, G1, B1, R2, G2, B2, ... см .: http://cimg.eu/reference/group__cimg__storage.html

.data() просто возвращает указатель, поэтому для прямого доступа к данным вы должны сделать:

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 голосов
/ 23 июля 2010

@ wamp: я не знаю о CImg, но изображения в градациях серого в RGB имеют:

R = G = B

и в CMYK:

C = M= Y = 0

K = яркость

Так что вам даже не нужна функция для этого ...

...