Anaglyph

Генерация анаглифа

Ана́глиф (от греч. anáglyphos — рельефный) — метод получения стереоэффекта для стереопары обычных изображений при помощи цветового кодирования изображений, предназначенных для левого и правого глаза.

Такое определение дает википедия. Простой способ, но для просмотра требуются очки с светофильтрами. Техническая реализация не сложная. Анаглиф строится комбинированием двух изображений, причем каждый глаз видит только одно из них: красное (для левого глаза, правый не видит это изображения из-за светофильтра) и циановое (для правого глаза, левый не видит из-за светофильтра). Настоящий анаглиф создается из стереопары изображений. Но возможно также создание псевдоанаглифа вручную создав параллакс. Для создания анаглифа можно использовать несколько вариантов цветовых схем:

  1. Настоящий анаглиф Без цветопередачи; изображение в фиолетовых тонах; низкий уровень раздвоения изображения;
  2. Оттенки серого Без цветопередачи; большее раздвоение изображения;
  3. Цветной анаглиф Частичная цветопередача; "конкуренция сетчатки" (высокая контрастность близлежащих пикселей)
  4. Полу-цветной анаглиф Аналогично предыдущему пункту, но хуже цветопередача, зато меньше конкуренция.
  5. Примерно так это может выглядеть на Python (hardcode с матрицами конечно некрасив, но формул для их выведения у меня нет)
Image.open('path/to/img.jpg')
method = "color_anaglyph"
parallax = 10

if method == "true_anaglyph":
    magic1 = [[0.299, 0.587, 0.114],
             [0, 0 ,0],
             [0, 0, 0]]

    magic2 = [[0, 0 ,0],
             [0, 0, 0],
             [0.299, 0.587, 0.114]]
elif method == "gray_anaglyph":
    magic1 = [[0.299, 0.587, 0.114],
             [0, 0 ,0],
             [0, 0, 0]]

    magic2 = [[0, 0 ,0],
             [0.299, 0.587, 0.114],
             [0.299, 0.587, 0.114]]
elif method == "color_anaglyph":
    magic1 = [[1, 0 ,0],
             [0, 0 ,0],
             [0, 0, 0]]

    magic2 = [[0, 0 ,0],
             [0, 1, 0],
             [0, 0 ,1]]
elif method == "half-color_anaglyph":
    magic1 = [[0.299, 0.587, 0.114],
             [0, 0 ,0],
             [0, 0, 0]]

    magic2 = [[0, 0 ,0],
             [0, 1, 0],
             [0, 0 ,1]]
else:
    magic1 = [[0, 0.7 ,0.3],
             [0, 0 ,0],
             [0, 0, 0]]

    magic2 = [[0, 0 ,0],
             [0, 1, 0],
             [0, 0 ,1]]

magic1 = numpy.array(magic1)
magic2 = numpy.array(magic2)

matrix = numpy.asarray(img)

left = right = matrix
rs = right.shape

right = numpy.concatenate((numpy.zeros((rs[0], parallax, 3)), right), axis=1)
right = right[:, :-parallax, :]

left =  numpy.dot(left, magic1.transpose())
right =  numpy.dot(right, magic2.transpose())

res = left + right
res = res[:, parallax:, :]

res = numpy.uint8(res)

Image.fromarray(res).save("output.jpg")
{{ </highlight> }}

Comments