Загрузка OpenCV CIE L * a * b * image

Я пытаюсь загрузить CIE Lb * изображение с использованием openCV в C ++.
В Интернете я могу найти только примеры, которые загружают RGB-изображение и преобразуют его в LAB-изображение, но у меня уже есть LAB-изображение, так как я могу загрузить его и чем получить доступ к значениям L, a и b?

Единственный способ найти это — загрузить изображение LAB, считая его изображением RGB, и преобразовать его в изображение Lab, используя:

cvtColor(source, destination, CV_BGR2Lab);

Но я думаю, что это не очень хороший способ решить проблему, потому что если я сделаю это, преобразованное изображение будет сильно отличаться от оригинала.

С тестовым изображением и следующим кодом:

    originalImage = imread(originalImagePath, CV_LOAD_IMAGE_UNCHANGED);
cout << originalImage.type() << endl;
Mat originalImageSplitted[3];
split(originalImage, originalImageSplitted);
cout << originalImageSplitted[0] << endl;
cout << originalImageSplitted[1] << endl;
cout << originalImageSplitted[2] << endl;

Я получаю результат:

0
[]
[]
[]

0

Решение

Не совсем ответ, но слишком много для комментария.

Вы можете создать TIF-файл Lab colourspace для такого тестирования: ImageMagick из Терминала в Linux, macOS или Windows:

convert -depth 8 xc:black xc:white xc:red xc:lime xc:blue +append -colorspace Lab result.tif

Это будет выглядеть так, если я увеличу его масштаб, так как в настоящее время он имеет ширину всего 5 пикселей и высоту 1 пиксель:

введите описание изображения здесь

Затем вы можете сбросить пиксели, чтобы увидеть их значения и, надеюсь, решить, что OpenCV делается:

convert result.tif txt:

Пример вывода

# ImageMagick pixel enumeration: 5,1,65535,cielab
0,0: (0,-0.5,-0.5)  #000000  cielab(0%,-0.000762951%,-0.000762951%)          <--- black pixel
1,0: (65535,-0.5,-0.5)  #FF0000  cielab(100%,-0.000762951%,-0.000762951%)    <--- white pixel
2,0: (34952,20559.5,17218.5)  #885043  cielab(53.3333%,31.3718%,26.2737%)    <--- red pixel
3,0: (57568,-22102.5,21330.5)  #E00053  cielab(87.8431%,-33.7263%,32.5483%)  <--- green pixel
4,0: (21074,20302.5,-27756.5)  #524F00  cielab(32.1569%,30.9796%,-42.3537%)  <--- blue pixel

Глядя на красный пиксель, вы получаете:

  • L = 53,33%
  • а = 31,37% от 256, то есть 80,3
  • b = 26,27% от 256, то есть 67,2
2

Другие решения

Чтобы сохранить изображение без изменений, вы должны прочитать его в изображение Mat аналогично:

Mat image;
image = imread(<path_of_image>, CV_LOAD_IMAGE_UNCHANGED)

В этом случае второй аргумент должен сохранить цветовые каналы вашего изображения как есть.

1

С помощью @ DanMašek с использованием изображения @MarkSetchell мы решили проблему.

Используя функцию imread, изображение автоматически преобразуется в изображение RGB, поэтому необходимо снова преобразовать его в изображение Lab.
Еще одна проблема связана с 8-битными изображениями. Полученное изображение изменило значения L, a и b, следуя этому правилу:

L * 255/100
А как + 128
б как б + 128

Поэтому я решил сделать следующее:

    originalImage = imread(originalImagePath, CV_LOAD_IMAGE_UNCHANGED);
Mat originalImageLab;
cvtColor(originalImage, originalImageLab, COLOR_RGB2Lab);
Mat originalImageSplitted[3];
split(originalImageLab, originalImageSplitted);

Спасибо вам всем!

1
По вопросам рекламы [email protected]