【问题标题】:How to get rgb value by cimg?如何通过 cimg 获取 rgb 值?
【发布时间】:2010-07-20 15:58:26
【问题描述】:
CImg<unsigned char> src("image.jpg");
int width = src.width();
int height = src.height();
unsigned char* ptr = src.data(10,10); 

如何从ptr 获得rgb

【问题讨论】:

    标签: c++ image-processing cimg


    【解决方案1】:

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

    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

    有效。

    【讨论】:

    • @wamp: src(c,r,0,0) 是您的灰度图像 (​​r,c) 像素的 0-255 值。
    • 显式 (int) 调用在我的应用程序中至关重要。感谢您提供这个答案!
    • 将近 11 年后……不客气,@so860! :D
    【解决方案2】:

    来自the CImg documentation——第 34 页的第 6.13 节和第 120 页的第 8.1.4.16 节——看起来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 图像,那么使用 c 的值 0、1 或 2 将在给定的 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);
    

    (但这只是猜测!)

    编辑:

    看起来 CImg 也有一个 operator() 以类似的方式工作:

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

    【讨论】:

    • 你试过 operator(),例如无符号字符 r = src(10,10,0,0);
    • 真的取决于你的图片,但是 r g 和 b 通道是分开的,所以读取一个通道会得到红色值(即通道 0 带有 jpg 图像),通道 1 会得到绿色值, 和通道 2 会让你变蓝...在第 8.1.4.9 节的文档中有一个使用浮点图像的示例.. 将浮点数更改为无符号字符,它应该可以工作......这是一个示例 unsigned char r = src.data(10,10,0,0);无符号字符 g = src.data(10,10,0,1); unsigned char b = src.data(10,10,0,2);
    • @wamp:我猜灰度图像的每个像素只有一个数据通道,并且您可以以与访问“ RGB 图像的红色”分量。例如。 char v = src(10, 10, 0, 0);
    • 如何用cimg判断是rgb还是灰度图?
    • @user198729:看起来spectrum 方法返回了颜色通道的数量。所以int numChannels = src.spectrum(); 可能将numChannels 设置为 3 用于 RGB 图像,而它可能设置为 1 用于灰度图像。
    【解决方案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 以非交错方式存储原始数据。即您的原始数据存储在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];
    

    【讨论】:

      【解决方案4】:

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

      R = G = B

      在 CMYK 中:

      C = M = Y = 0

      K = 亮度

      所以你甚至不需要一个函数......

      【讨论】:

      • 这不是真的。虽然您可以将图像保存为仅使用 R=G=B 的 RGB 格式,但您将使用 3 倍的数据来存储图像。这就是为什么只有一个通道的图像灰度格式。
      猜你喜欢
      • 2014-07-20
      • 2018-04-25
      • 1970-01-01
      • 2010-10-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 2011-12-10
      相关资源
      最近更新 更多