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

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

0 голосов
/ 15 октября 2018

Я пытаюсь загрузить изображение CIE L a b *, используя 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
[]
[]
[]

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

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

Вы можете создать 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 пиксель:

enter image description here

Затем вы можете сбросить пиксели, чтобы увидеть их значения и, надеюсь, выяснить, что делает 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%
  • a = 31,37% от 256, т. Е. 80,3
  • b =26,27% от 256, т.е. 67,2
0 голосов
/ 16 октября 2018

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

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

L * 255/100 a как + 128 b как b + 128

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

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

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

0 голосов
/ 15 октября 2018

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

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

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

...