#image-processing #view #widget #screen
#обработка изображений #Вид #виджет #экран
Вопрос:
Я просматриваю некоторые строительные коды вида (экрана) для рисования графических интерфейсов, например, преобразование искаженного вида объектива в плоский вид. В этом я наткнулся на термины прямой LUT и обратный LUT, и я не понимаю, что это такое и почему оно используется? Может кто-нибудь, пожалуйста, объяснить мне или дать несколько указаний, где я могу узнать о них?
Ответ №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, Таблица поиска, подстановка, отрицание, инверсия, пороговое значение