Вывод цвета в пространстве CIELab - PullRequest
2 голосов
/ 23 января 2012

Для визуализации определенных данных я должен использовать раскраски.А именно, код C ++, который я имею в распоряжении, выводится с использованием cairo-graphics, а функция основана на RGB-пространстве.Данные, с которыми я работаю, должны, с другой стороны, использовать «определенный срез» цветового пространства CIELab.

Вопрос заключается в следующем: каков наиболее подходящий способ сделать это с C ++?Возможно, какое-то преобразование, которое все еще может полагаться на функцию RGB, предоставляемую cairo (хотя я сомневаюсь в этой альтернативе, поскольку RGB зависит от устройства)?

Ответы [ 2 ]

4 голосов
/ 31 января 2013

Я собрал проверенное выше.Для дальнейшего использования здесь есть функция для преобразования 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;
}
4 голосов
/ 23 января 2012

OpenCV имеет несколько встроенных преобразований цвета.Вы можете использовать их или использовать их как источник вдохновения для своей собственной процедуры преобразования цветов.См. документ о преобразовании цветов в 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];   
}

Осторожно: я не тестировалили скомпилируйте этот код, это всего лишь черновик.

...