вторник, 1 января 2013 г.

Цветовое зрение

Меня давно интересовал вопрос, почему в большинстве видеороликов, сжатых всякими-разными кодеками типа H.264, и на картинках, сжатых JPEG-ом, красный цвет всегда получается с жёсткими артефактами, пикселяцией, и вообще, выглядит идиотски.

И почему, когда я иногда гляжу на экран работающего ЖК-телевизора (я не смотрю телевизор), то чисто красные, чисто синие, и подобные, объекты выглядят на нём просто ужасно.

Попробовал сегодня погуглить немного на эту тему.




Как я и предполагал, в инете не нашлось объяснения такого очевидного вопроса.
Попробуем собрать отрывки комментариев на эту тему со множества разных форумов.

Человеческое зрение устроено так, что изменение "яркости" глаз воспринимает гораздо сильнее, чем изменение цвета.
Поэтому в науке о человеческом зрении всё цветовое пространство разделяют на три оси: "яркость" и две цветовых оси.
Причём ось яркости и цветовые оси не являются независимыми: цвет влияет на "яркость" и "яркость" влияет на цвет.



Ещё, в результате опытов, открыли, что природа настроила зрение человека таким образом, что некоторые цвета он воспринимает гораздо сильнее других.




Основываясь на этой кривой, можно заключить, что для создания чёрно-белого изображения (= карты яркости) больше всех следует учитывать зелёную середину.
Потом идёт правый красный хвост, и уже потом, меньше всех, учитывается левый синий хвост.

То есть, если бы мы писали формулу для вычисления яркости изображения, то мы бы написали её как-нибудь так:

Яркость пикселя = 60 % зелёности пикселя + 30 % красноты пикселя + 10 % синевы пикселя

Теперь про телевидение.


Изначально телевидение было чёрно-белым.
И оно передавалось от телебашен в виде сигнала.
Сигнал был чёрно-белым, и представлял собой, очевидно, яркость.


Затем изобрели цветной телевизор (и цветную видеокамеру).
Встал вопрос "апгрейда".
Причём его нужно было провести так, чтобы цветной телевизор показывал цветную картинку, а рядом стоящий старый чёрно-белый - чёрно-белую картинку (с того же самого сигнала).

И тут пригодилось ранее придуманное разложение изображения на "яркость" и две цветовые компоненты — их стали вычислять по формулам:




Эту схему кодирования цветного изображения назвали "YPrPb".


Поскольку телевизор, даже "аналоговый", показывает изображение по точкам, с заданным "разрешением", то в любом случае картинка дискретизуется.
А, значит, её можно сжать, сэкономив тем самым, например, ширину канала телеэфира, упростив микросхемы записи и обработки видео, сэкономив в несколько раз место на дисках для хранения видеоархивов, и т.п.


Для этого придумали схему сжатия изображения, названную "цветовой субдискретизацией".

Вкратце, суть её состояла в том, что сигнал яркости снимался с видеокамеры (и передавался по телеэфиру) с частотой, скажем, в два раза большей частоты цветовых сигналов.
Частоты всех трёх составляющих в данном случае относятся друг к другу в пропорции 4 к 2 к 2 — 4 на яркость и по 2 на "красный" и "синий" цветовые сигналы.

Если ввести понятие "макропикселя" - прямоугольника, размерами 4 на 2 пикселя, то можно ввести обозначение "цветовой субдискретизации" в виде пропорции вида 4:2:2, где первое число - частота яркости = количеству пикселей в строке, второе - частота смены цвета в первой строке макропикселя, третье - частота смены цвета во второй строке макропикселя.




Такую маркировку можно встретить на любой полупрофессиональной видеокамере, и именно на неё в первую очередь обращают внимание при выборе видеокамеры, так как от неё в первую очередь зависит "богатство цвета" снятого изображения.

Теперь, зная всё это (а это сложная тема), попробуем предположить, почему красный цвет смотрится так убого при таком цифровом сжатии.


Допустим есть границы объектов разных цветов:




Мы знаем, что эти цвета различаются по яркости.
Теперь сожмём данные этого изображения способом "цветовой субдискретизации":




Откуда возникли артефакты на границах объектов?


В соответствии с "цветовой субдискретизацией", сначала строится чёрно-белое изображение, несущее только данные о яркости.
Этот шаг не вносит никаких искажений.

Затем, изображение раскрашивается.
Но раскрашен будет не каждый пиксель, как бывает в случае с дорогой техникой 4:4:4, а, например, в случае бюджетной видео/фото техники 4:1:1, изображение будет раскрашено блоками (одного цвета) по 4 пикселя в ширину и 1 пиксель в высоту.

Цвет блока тоже как-то определяется.
Возможно, берётся что-то среднее между всеми цветами, присутствовавшими в изначальном изображении на месте этого блока

Перепады яркости получились честными на чёрно-белом изображении, но если их теперь раскрасить такими блоками, то появятся "глюки", что видно на второй картинке.
Например, блок на границе фиолетового и красного прямоугольников был раскрашен в какой-то средний цвет, который получился более светлым, чем фиолетовый, но менее тёмным, чем красный, и из-за этого вылез явный артефакт на границе.


Это то, как я понял их объяснения.

В оригинале это звучит так:

The chroma can influence the luma specifically at the pixels where the subsampling put no chroma. Interpolation may then put chroma values there which are incompatible with the luma value there, and further post-processing of that Y'CbCr into R'G'B' for that pixel is what ultimately produces false luminance upon display.

Артефакты цветового сжатия в первую очередь заметны на стыках "кричащих" цветов (красный, синий, зелёный), потому что у кричащих цветов яркость больше, чем у всех остальных цветов, и поэтому наложение цвета "от балды" на карту яркости будет будет давать гораздо более заметные артефакты.

Комментариев нет:

Отправить комментарий