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





"Справочная таблица" или 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, справочная таблица, поиск, отрицание, инверсия, пороговое значение