Быстрый приближенный алгоритм преобразования RGB/LAB?

Я работаю над инструментом визуализации данных с использованием OpenGL, и цветовое пространство LAB является наиболее понятным цветовым пространством для визуализации данных, с которыми я имею дело (3 оси данных отображаются на 3 оси цветового пространства). Существует ли быстрый (например, без нецелочисленного возведения в степень, подходящий для выполнения в шейдере) алгоритм приблизительного преобразования значений LAB в значения RGB и обратно?


person Justin Olbrantz    schedule 20.03.2015    source источник
comment
Я надеюсь, что есть, но сомневаюсь, что он существует. Часть кубического корня будет трудно смоделировать. Может быть, используя линейную интерполяцию между небольшим количеством эквивалентных точек?   -  person Mark Ransom    schedule 20.03.2015
comment
Ну, вот подвопрос: являются ли значения, указанные, например, в. OpenGL, чтобы значения RGB были линейными (гамма применялась автоматически) или нет (явная гамма-компенсация)? Если они линейные, это будет означать, что шаг XYZ->RGB требует только матричного умножения, верно?   -  person Justin Olbrantz    schedule 20.03.2015


Ответы (1)


Если выполнение фактического вычисления преобразования в шейдере слишком сложно/дорого, вы всегда можете использовать таблицу поиска. Поскольку оба цветовых пространства имеют 3 компонента, вы можете использовать трехмерную текстуру RGB для представления таблицы поиска.

Использование 3D-текстуры может показаться слишком накладным. Поскольку для представления цветов в OpenGL часто используется 8 бит/компонент, вам потребуется 3D-текстура размером 256x256x256. При 4 байтах на тексель это 64-мегабайтная текстура, что не так уж возмутительно, но очень существенно.

Однако, в зависимости от того, насколько сглажены значения в таблице перевода, вы можете обойтись более низким разрешением. Имейте в виду, что выборка текстуры использует линейную интерполяцию. Если кусочно-линейная интерполяция достаточно хороша при определенном базовом разрешении интерполяционной таблицы, вы можете значительно уменьшить ее размер.

Если вы идете в этом направлении и не можете позволить себе использовать 64 МБ для LUT, вам придется поиграть с размером LUT и сделать возможный компромисс между размером/производительностью и качеством.

person Reto Koradi    schedule 21.03.2015
comment
Я не уверен, что понимаю вашу математику. Если у вас есть 8 бит на компонент, разве ваша таблица не должна быть 256x256x256? - person Mark Ransom; 21.03.2015
comment
@MarkRansom Аргх, да, знаю. Это звучало слишком хорошо, чтобы быть правдой. - person Reto Koradi; 21.03.2015
comment
@MarkRansom Хорошо, обновлено. Сейчас это может выглядеть немного менее привлекательно, но, по крайней мере, я надеюсь, что это правильно. Спасибо за указание на это. - person Reto Koradi; 21.03.2015