Таблица прямого просмотра (LUT) и обратная LUT, что это такое? и почему он используется?

Я смотрю на некоторые строительные коды просмотра (экрана) для рисования графических интерфейсов, например, преобразование искаженного вида объектива в плоский вид. В том, что я наткнулся на термины прямой LUT и обратный LUT, и я не понимаю, что это такое и почему оно используется? Может кто-нибудь объяснить мне или дать несколько указателей, где я могу узнать о них?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
121
1

Ответы 1

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

Вместо того, чтобы выполнять множество математических операций или операторов if для каждого из 12 миллионов пикселей изображения, вы просто используете текущее 8-битное значение каждого пикселя в качестве индекса в справочной таблице, чтобы найти новое значение для этого пикселя. Обычно это намного быстрее, чем остановка процессора при выполнении операторов if, поскольку это просто операция индексации в таблице. Это также очень просто реализовать аппаратно на высокой скорости.

Вы можете использовать его для порога изображения, или для изменения контраста изображения, или для экономии места. В этом последнем методе вы в основном создаете изображение с палитрой из 256 цветов, затем вместо хранения 3 байтов для каждого пикселя (то есть R, G и B) вы просто сохраняете 1 байт и используете этот байт для "Погляди" цвета - и как по волшебству ваше изображение на 1/3 меньше.

Вот небольшой пример: я создаю LUT со всеми элементами ниже 64 черными, а всеми элементами выше — белыми, а затем применяю его к изображению в оттенках серого. Позже я добавил красную рамку, чтобы вы могли видеть размер изображения на белом фоне Stack Overflow:

#!/usr/local/bin/python3
import numpy as np
from PIL import Image

# Open the input image as numpy array, convert to greyscale
npImage=np.array(Image.open("grey.png").convert("L"))

# Make a LUT (Look-Up Table) to translate image values
LUT=np.zeros(256,dtype=np.uint8)
for idx in range(64,255):
    # All pixels > 64 become white
    LUT[idx]=255

# Apply LUT
npImage = LUT[npImage]

# Apply LUT and save resulting image
Image.fromarray(npImage).save('result.png')

Начальное изображение:

Изображение результата:


Вот еще один пример, когда я заставляю LUT работать в обратном направлении, поэтому он инвертирует изображение.

#!/usr/local/bin/python3
import numpy as np
from PIL import Image

# Open the input image as numpy array, convert to greyscale
npImage=np.array(Image.open("grey.png").convert("L"))

# Make a LUT (Look-Up Table) to translate image values to their inverse/negative
# i.e. 0 input maps to 255 output
#      1 input maps to 254 output
LUT = np.arange(255,-1,-1,dtype=np.uint8)

# Apply LUT
npImage = LUT[npImage]

# Apply LUT and save resulting image
Image.fromarray(npImage).save('result.png')

Ключевые слова: Python, Numpy, изображение, обработка изображений, LUT, справочная таблица, поиск, отрицание, инверсия, пороговое значение

Другие вопросы по теме