Я пытаюсь загрузить 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
[]
[]
[]
Не совсем ответ, но слишком много для комментария.
Вы можете создать 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
Глядя на красный пиксель, вы получаете:
Чтобы сохранить изображение без изменений, вы должны прочитать его в изображение Mat аналогично:
Mat image;
image = imread(<path_of_image>, CV_LOAD_IMAGE_UNCHANGED)
В этом случае второй аргумент должен сохранить цветовые каналы вашего изображения как есть.
С помощью @ 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);
Спасибо вам всем!