C++ 如何通过cimg获取rgb值? cimgsrc(“image.jpg”); int width=src.width(); int height=src.height(); 无符号字符*ptr=src.data(10,10);

C++ 如何通过cimg获取rgb值? cimgsrc(“image.jpg”); int width=src.width(); int height=src.height(); 无符号字符*ptr=src.data(10,10);,c++,image-processing,cimg,C++,Image Processing,Cimg,如何从ptr中获取rgb?从第34页的第6.13节和第120页的第8.1.4.16节——看起来数据方法可以使用四个参数:x、y、z和c: CImg<unsigned char> src("image.jpg"); int width = src.width(); int height = src.height(); unsigned char* ptr = src.data(10,10); …其中c表示颜色通道。我猜想,如果您的图像确实是RGB图像,那么对c使用0、1或2的值将在

如何从
ptr
中获取
rgb

从第34页的第6.13节和第120页的第8.1.4.16节——看起来
数据
方法可以使用四个参数:x、y、z和c:

CImg<unsigned char> src("image.jpg");
int width = src.width();
int height = src.height();
unsigned char* ptr = src.data(10,10); 
…其中
c
表示颜色通道。我猜想,如果您的图像确实是RGB图像,那么对
c
使用0、1或2的值将在给定的
x、y
位置显示红色、绿色和蓝色分量

例如:

T* data(const unsigned int x, const unsigned int y = 0, 
        const unsigned int z = 0, const unsigned int c = 0)
(但这只是一个猜测!)

编辑:

看起来CImg还有一个操作符()以类似的方式工作:

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);

在Ubuntu10.04上使用手工制作的3x3 RGB图像进行测试,图像保存为
test.png

unsigned char r = src(10, 10, 0, 0);
编译并运行:

#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_测试 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
它可以工作。

@wamp:我不知道CImg,但RGB中的灰度图像有:

R=G=B

在CMYK中:

C=M=Y=0

K=亮度


因此,您甚至不需要函数…

访问数据的最简单方法是使用
()
运算符:

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 您可能会感到困惑,因为CImg以非交错方式存储原始数据。i、 e.您的原始数据存储为
R1、R2、…、G1、G2、…、B1、B2、…
而不是
R1、G1、B1、R2、G2、B2、…
请参见:

.data()
只返回一个指针,因此要像上面那样直接访问数据,您需要执行以下操作:

unsigned char r = img(10,10,0,0);
unsigned char g = img(10,10,0,1);
unsigned char b = img(10,10,0,2);
cimgsrc(“image.jpg”);
int width=src.width();
int height=src.height();
无符号字符*ptr=src.data(10,10);
无符号字符r=ptr[0];
无符号字符g=ptr[0+宽度*高度];
无符号字符b=ptr[0+2*宽度*高度];

您是否尝试过运算符(),例如unsigned char r=src(10,10,0,0);这取决于你的图像,但是RG和b通道是分开的,所以读取一个通道会得到红色值(即,带有jpg图像的通道0),通道1会得到绿色,通道2会得到蓝色。。。在第8.1.4.9节的文档中有一个使用浮动图像的示例。。将浮点数更改为无符号字符,它应该可以工作。。。这里有一个示例无符号字符r=src.data(10,10,0,0);无符号字符g=src.data(10,10,0,1);无符号字符b=src.data(10,10,0,2)@wamp:我猜灰度图像每像素只有一个通道的数据,你可以用与访问RGB图像的“红色”部分完全相同的方式访问该值。例如,
charv=src(10,10,0,0)
如何使用cimg确定它是rgb还是灰度图像?@user198729:看起来
spectrum
方法返回颜色通道的数量。所以
int numChannels=src.spectrum()可能会将
numChannels
设置为3,而对于灰度图像,它可能会设置为1。@wamp:src(c,r,0,0)是灰度图像(r,c)像素的0-255值。显式(int)调用在我的应用程序中至关重要。谢谢你提供这个答案!将近11年后。。。不客气,@so860!:这不是真的。虽然您可以使用仅使用R=G=B的RGB格式保存图像,但您将使用3倍于存储图像所需的数据。这就是为什么图像有灰度格式,只保存一个通道。
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<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];