2012-02-21 3 views
4

Я пытаюсь преобразовать значения Lab в соответствующие значения RGB. Я не хочу преобразовывать изображение Lab в RGB-изображение, но некоторые значения L a и b. Функция cvCvtColor only работает для изображений. Может кто-нибудь скажет мне, как это сделать.Преобразование значений Lab в значения RGB в opencv

Thanks;

Код:

CvMat* rgb = cvCreateMat(centres->rows,centres->cols,centres->type); 
cvCvtColor(centres,rgb,CV_Lab2BGR); 

ответ

9

Я не знаю, как это сделать в OpenCV, но если что-то еще в порядке, у меня есть implemented it in C. См. Функцию color_Lab_to_LinearRGB и color_LinearRGB_to_RGB.

Вот код:

double L, a, b; 
double X, Y, Z; 
double R, G, B; 

// Lab -> normalized XYZ (X,Y,Z are all in 0...1) 

Y = L * (1.0/116.0) + 16.0/116.0; 
X = a * (1.0/500.0) + Y; 
Z = b * (-1.0/200.0) + Y; 

X = X > 6.0/29.0 ? X * X * X : X * (108.0/841.0) - 432.0/24389.0; 
Y = L > 8.0 ? Y * Y * Y : L * (27.0/24389.0); 
Z = Z > 6.0/29.0 ? Z * Z * Z : Z * (108.0/841.0) - 432.0/24389.0; 

// normalized XYZ -> linear sRGB (in 0...1) 

R = X * (1219569.0/395920.0)  + Y * (-608687.0/395920.0) + Z * (-107481.0/197960.0); 
G = X * (-80960619.0/87888100.0) + Y * (82435961.0/43944050.0) + Z * (3976797.0/87888100.0); 
B = X * (93813.0/1774030.0)  + Y * (-180961.0/887015.0) + Z * (107481.0/93370.0); 

// linear sRGB -> gamma-compressed sRGB (in 0...1) 

R = R > 0.0031308 ? pow(R, 1.0/2.4) * 1.055 - 0.055 : R * 12.92; 
G = G > 0.0031308 ? pow(G, 1.0/2.4) * 1.055 - 0.055 : G * 12.92; 
B = B > 0.0031308 ? pow(B, 1.0/2.4) * 1.055 - 0.055 : B * 12.92; 
+0

Спасибо.Попробуйте это. – ATG

+0

Я пробовал это, но значения RGB не находятся в диапазоне. – ATG

+0

RGB находятся в диапазоне 0 ... 1. Думаю, тебе нужно было 0 ... 255? Просто умножьте каждый компонент на 255. –

0

Я думаю, что единственный способ сделать то, что вы хотите:

  • посмотреть на исходный код OpenCV или documentation for cvCvtColor и реализации уравнений себя (все они явно приведенный на этой странице)
  • создайте фиктивное изображение с несколькими значениями Lab, которые вы хотите конвертировать (скажем, 1 на n на 3, где n - количество значений, которые вы хотите конвертировать) и используйте cvCvtColor вокруг этого.
+0

Спасибо за ваш reply..Can вы объяснить this.Because я использовал эту функцию cvtColor, но он дает мне error.I я добавить код, который я использовал. – ATG