【问题标题】:Color output in the CIELab spaceCIELab 空间中的颜色输出
【发布时间】:2012-02-16 16:39:22
【问题描述】:

为了可视化某些数据,我应该使用颜色。也就是说,我处理的 C++ 代码是使用 cairo-graphics 输出的,该函数是基于 RGB 空间的。另一方面,我使用的数据应该利用 CIELab 颜色空间的“特定切片”。

问题是:用 C++ 最合适的方法是什么?也许某些转换可能仍然依赖于 cairo 提供的 RGB 函数(尽管我怀疑这种替代方法,因为 RGB 依赖于设备)?

【问题讨论】:

    标签: c++ colors rgb


    【解决方案1】:

    OpenCV 有一些内置的颜色转换。您可以使用它们,或者将它们用作您自己的颜色转换程序的灵感。 见the doc about color conversion in OpenCV (cv::cvtColor)

    一种可能的使用方式是:

    #include <cv.h>
    #include <highgui.h>
    int main()
    {
        cv::Mat imgRgb = cv::imread("file.bmp");
        cv::Mat imgLab;
        cv::cvtColor(imgRgb, imgLab, Cv::CV_BGR2Lab);
    
        //access Lab values
        int y = 50;
        int x = 20;
        double L = imgLab.at<double>(y,x)[0]; //beware the order : openCV treats images as matrixes, thus the y param come first
        double a = imgLab.at<double>(y,x)[1];
        double b = imgLab.at<double>(y,x)[2];   
    }
    

    注意:我没有测试或编译这段代码,这只是一个草稿。

    【讨论】:

    • 谢谢。鉴于我处理的代码是基于生成彩色 pdf 文件的 cairo-graphics 函数,我想有一种方法可以使用您提出的库输出 CIELab 彩色 pdf 输出?如果不是这样,我们将不胜感激有关允许这样做的库的建议。
    • 好吧,pdf 不是一种图像格式。它是一种可以包含图像、文本、字体(不胜枚举)的格式。不,opencv 不处理 pdf 文件。我建议你看看 cimg 库:它比 opencv 更容易使用,而且它还可以进行 RGBtoLab 转换(参见 cimg.sourceforge.net/reference/structcimg__library_1_1CImg.html)。它可以输出为 pdf,前提是您安装了 imagemagick(imagemagick 处理 pdf 文件):见 cimg.sourceforge.net/reference/group__cimg__files__io.html
    【解决方案2】:

    我已经编译了上面的测试。为了将来参考,这里有一个将 RGB 转换为 CIELAB 的函数

    #include <cv.h>
    #include <highgui.h>
    Mat BGR2CIELab(Mat const &rgb_src)
    {
        Mat imgLab;
        cvtColor(rgb_src, imgLab, CV_BGR2Lab);
    
        //access Lab values
        int y = 50;
        int x = 20;
        Vec3d pix_bgr = imgLab.ptr<Vec3d>(y)[x]; //beware the order : openCV treats images as matrixes, thus the y param come first
        double L = pix_bgr.val[0];
        double a = pix_bgr.val[1];
        double b = pix_bgr.val[2];
    
        return imgLab;
    }
    

    【讨论】:

    • 你的sn-p运行成功,但是L,a,b的值不遵循约束:0
    • 我现在无法检查,但它们是双精度值,因此 openCV 将它们转换为另一种格式是可能的;例如 0.0
    • 我使用 OpenCV 2.4.8。这是我运行代码i1275.photobucket.com/albums/y442/lbkhanhvu/… 后的结果。可以看看是对是错吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2019-07-24
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2018-12-05
    相关资源
    最近更新 更多