2012-01-23 2 views
2

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

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

ответ

4

В 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]; 
} 

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

+0

Спасибо. Учитывая, что код, который я имею в распоряжении, основан на функциях cairo-graphics, генерирующих цветной pdf-файл, я предполагаю, что существует способ вывода цветного PDF-вывода CIELab с предлагаемой вами библиотекой? Если это не так, то будет предложено предложение по библиотеке, которое позволяет это. – user506901

+0

Ну, pdf - это * не * формат изображения. Это формат, который может включать в себя изображения, тексты, шрифты (и список). И нет, opencv не обрабатывает pdf-файлы. Я предлагаю вам взглянуть на библиотеку cimg: ее проще использовать, чем opencv, а также конверсии RGBtoLab (см. Http://cimg.sourceforge.net/reference/structcimg__library_1_1CImg.html). Это может быть сделано в формате pdf при условии, что вы устанавливаете imagemagick (imagemagick обрабатывает файл pdf): см. Http://cimg.sourceforge.net/reference/group__cimg__files__io.html –

4

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

Ваш фрагмент работает успешно, но значение L, a, b делает не следует ограничениям: 0 <= L <= 100, -127 <= a <= 127, -127 <= b <= 127. –

+0

Я не могу проверить это прямо сейчас, но они являются двойными значениями, поэтому возможно, что openCV помещает их в другой формат; например 0.0

+0

Я использую OpenCV 2.4.8. Вот мой результат после запуска вашего кода http://i1275.photobucket.com/albums/y442/lbkhanhvu/return_zps2062d06f.jpg. Можете ли вы взглянуть, правильно это или нет? –

Смежные вопросы