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

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