Инвертировать LUT (справочную таблицу) - PullRequest
3 голосов
/ 09 февраля 2011

Я пишу некоторый код управления цветом и имею дело с LUT (посмотрите таблицы).

Я могу прочитать цветовой профиль LUT и преобразовать свои значения ... но как я могу выполнить обратную операцию? может быть, есть хороший алгоритм для генерации «инверсии» LUT?

Ответы [ 2 ]

1 голос
/ 09 февраля 2011

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

Однако это может привести к «постеризованному» изображению, поскольку сглаженные области на вашем изображении будут резко смещаться от одной записи к другой. Вы можете избежать этого, беря ваши пиксели в (квази) случайном порядке, выбирая наилучшее соответствие из вашей LUT и перенося разницу между значением пикселя и выбранной записью на соседние пиксели, которые еще не были выбраны.

Существует множество способов сделать это в последнюю очередь, но все они приводят к эффекту сглаживания, который, как правило, лучше использует (для целей формирования изображения) доступных записей LUT, чем простая операция на пиксель.

0 голосов
/ 09 февраля 2011

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

Если вы знаете, что каждое значение уникально, вы можете построить таблицу обратного просмотра следующим образом. Сначала создайте структуру данных для хранения сопоставления значений и ключей - возможно, хеш-таблицы, сбалансированного двоичного дерева или необработанного массива, если значения представляют собой маленькие целые числа. Затем выполните итерацию по каждой паре ключ / значение из таблицы поиска, затем вставьте значение отображения & rarr; ключ в новую таблицу поиска. Это можно сделать за линейное время плюс время, необходимое для вставки значений в новый контейнер.

...