【发布时间】:2012-02-16 16:39:22
【问题描述】:
为了可视化某些数据,我应该使用颜色。也就是说,我处理的 C++ 代码是使用 cairo-graphics 输出的,该函数是基于 RGB 空间的。另一方面,我使用的数据应该利用 CIELab 颜色空间的“特定切片”。
问题是:用 C++ 最合适的方法是什么?也许某些转换可能仍然依赖于 cairo 提供的 RGB 函数(尽管我怀疑这种替代方法,因为 RGB 依赖于设备)?
【问题讨论】:
为了可视化某些数据,我应该使用颜色。也就是说,我处理的 C++ 代码是使用 cairo-graphics 输出的,该函数是基于 RGB 空间的。另一方面,我使用的数据应该利用 CIELab 颜色空间的“特定切片”。
问题是:用 C++ 最合适的方法是什么?也许某些转换可能仍然依赖于 cairo 提供的 RGB 函数(尽管我怀疑这种替代方法,因为 RGB 依赖于设备)?
【问题讨论】:
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];
}
注意:我没有测试或编译这段代码,这只是一个草稿。
【讨论】:
我已经编译了上面的测试。为了将来参考,这里有一个将 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;
}
【讨论】: