Инвертировать LUT (таблицу поиска)

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

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


person Javier Loureiro    schedule 09.02.2011    source источник


Ответы (2)


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

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

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

person comingstorm    schedule 09.02.2011

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

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

person templatetypedef    schedule 09.02.2011
comment
входная LUT - это много к одному, поэтому я знаю, что есть много решений для одного и того же выходного значения. Но, может быть, я смогу избавиться от них, предварительно отфильтровав их. - person Javier Loureiro; 09.02.2011