Следующие рисунки показывают ошибки, которые являются примерами ошибок повышения разрешения цветности (the Chroma Upsampling Error), называемые так потому что разрешение отсчетов (дискретизация) видео повышено (пересчитано, интерполировано, upsampled) (от сокращенного к более полному) некорректно (чересстрочное YV12 как прогрессивное и наоборот). В результате Вы будете видеть промежутки на верхних и нижних краях окрашенных объектов и строки-"призраки", плавающие выше или ниже объектов.
figure 1a: пример чересстрочного источника (YV12), пересчитанного с повышением разрешения как прогрессивное видео (в YUY2) (from http://zenaria.com/gfx/) |
figure 1b: то же изображение с корректным пересчетом разрешения цветности (from http://zenaria.com/gfx/) |
figure 2a: пример прогрессивного источника (YV12) пересчитанного с повышением разрешения как чересстрочное видео (в YUY2) |
figure 2b: то же изображение с корректным пересчетом цветности |
В данном разделе будет показаны причины, вызывающие эту ошибку, и как ее исправить. Здесь под исправлением подразумевается снижение ее заметности, так как невозможно скорректировать ее полностью.
Ссылки:
[The Chroma Upsampling Error]
[The Chroma Upsampling Error - Television and Video Advice]
Как ранее утверждалось, ошибка повышения разрешения цветности случается, когда Вы преобразуете видео из (настоящего) чересстрочного YV12 в почти любой другой формат, но при этом преобразователь думает, что видео является прогрессивным. Или, другой случай, если материал прогрессивный (или чересстрочный закодированный как прогрессивный), а пересчитан (с повышением разрешения цветности) как чересстрочный (это однако не так плохо как первый случай).
При просмотре (preview) Вашего видео в VirtualDub, он будет вынужден преобразовать его в RGB. Так как AviSynth поставляет YV12, VirtualDub просит кодек (например XviD или DivX) преобразовать YV12 в RGB. Кодек однако ВСЕГДА пересчитывает прогрессивно. Отсюда Вы получите артефакты при в просмотре VirtualDub чересстрочного материала. Это однако не присутствует в YV12 видео (или в результирующем закодированном материале). Чтобы подтвердить это, сделайте преобразование с помощью AviSynth путем добавления ConvertToRGB(interlaced=true) в конец вашего скрипта.
Вы должны будете размазать (blur) цветность каким либо способом (оставляя яркостный канал нетронутым).
Например (используя tomsmocomp.dll):
AviSource(...)
MergeChroma(TomsMoComp(-1,5,0))
В данном разделе будет объяснено размещение цветности, как это относится к понижению разрешения отсчетов (субдискретизация, подвыборка, прореживание, subsampling) (RGB -> YUY2 -> YV12) и как производится пересчет к большему разрешению (upsampling) в AviSynth.
Также будет объяснено в деталях, помечу происходит ошибка повышения разрешения цветности. Резюмируя последнее, проблема в том, что существует разница между прогрессивным YV12 и чересстрочным YV12, поскольку цветность разделяется (совместно используется, shared) вертикально между соседними пикселами.
Смотри также http://forum.doom9.org/showthread.php?s=&threadid=52151&highlight=upsampling.
Чтобы разобраться, как работает пересчет YV12 <-> YUY2 и почему имеет значение, является ли источник чересстрочным или прогрессивным, сначала будут обсуждены цветовые форматы YV12/YUY2. Здесь важно, как они хранятся в памяти. Информация об этом может быть найдена здесь: ColorSpaces.
Термин 4:4:4 обозначает, что для каждых четырех отсчетов яркости (luminance (Y)), имеется по четыре отсчета U и V. Таким образом, каждый пиксел имеет величину яркости (Y), величину U (отсчет синей цветоразности (blue difference sample) или Cb) и величину V (отсчет красной цветоразности (red difference sample) или Cr). Отметьте, что, "C" это просто отсчет цветности (chroma) (UV-отсчет).
Раскладка 4:4:4 кодированного изображения выглядит следующим образом
frame | line |
YC YC YC YC | line 1 |
YC YC YC YC | line 2 |
YC YC YC YC | line 3 |
YC YC YC YC | line 4 |
YUY2 (или YUYV) есть формат 4:2:2. Термин 4:2:2 обозначает, что для каждых четырех отсчетов яркости (luminance (Y)), имеются по два отсчета U и V, давая меньшую полосу(bandwidth) цветности по отношению к яркости. Так, для каждого пиксела, имеется горизонтально разделяемая (общая) UV (цветность) с соседним пикселом.
Раскладка 4:2:2 кодированного изображения выглядит следующим образом
frame | line |
YC Y YC Y | line 1 |
YC Y YC Y | line 2 |
YC Y YC Y | line 3 |
YC Y YC Y | line 4 |
Для цветового формата YV12, существуют различи между прогрессивным и чересстрочным. Причиной является то, что величины цветности разделяются вертикально между двумя соседними строками.
YV12 есть формат 4:2:0. Термин 4:2:0 обозначает, что для каждых четырех отсчетов (двух горизонтальных и двух вертикальных) яркости (Y), имеются по одному отсчету U и V, давая меньшую полосу (bandwidth) цветности по сравнению с яркостью.
Прогрессивный YV12
Для каждого пиксела, горизонтально разделяется UV (цветность, chroma или C) с соседним пикселом и вертикально разделяется UV с соседней строкой (строка 1 со строкой 2, строка 3 со строкой 4, и т.д.).
Раскладка прогрессивного 4:2:0 закодированного изображения выглядит следующим образом (схему MPEG 2 - смотри ниже)
frame | line |
Y_Y_Y_Y | line 1 |
C___C__ | |
Y_Y_Y_Y | line 2 |
Y_Y_Y_Y | line 3 |
C___C__ | |
Y_Y_Y_Y | line 4 |
Чересстрочный YV12
Для каждого пиксела, горизонтально разделяется UV (цветность, chroma или C) с соседним пикселом и вертикально разделяется UV со строкой через одну (строка 1t со строкой 3t, строка 2b со строкой 4b, и т.д.) Здесь t обозначает верхнее (top) поле, b - нижнее (bottom) поле.
Раскладка чересстрочного 4:2:0 закодированного изображения выглядит следующим образом (схему MPEG 2 - смотри ниже)
frame | line |
Y_Y_Y_Y | line 1t |
C___C__ | |
Y_Y_Y_Y | line 2b |
Y_Y_Y_Y | line 3t |
C___C__ | |
Y_Y_Y_Y | line 4b |
или
field 1 | field 2 | line |
Y_Y_Y_Y | line 1t | |
C___C__ | ||
Y_Y_Y_Y | line 2b | |
Y_Y_Y_Y | line 3t | |
C___C__ | ||
Y_Y_Y_Y | line 4b | |
Понижение разрешения отсчетов (подвыборка, прореживание, Subsampling) используется, чтобы снизить требования по объему хранения и полосе трансляции для цифрового видео. Это эффективно для сигнала YCbCr (яркость/синяя цветоразность/красная цветоразность), так как человеческий глаз более чувствителен к изменениям черного и белого, чем к изменению цвета. Так, радикальное сокращение цветовой информации показывает очень небольшую видимую разницу. YUY2 и YV12 являются примерами таких сокращенных (прореженных) цветовых форматов.
Больше информации о преобразованиях RGB -> YUV может быть найдено здесь: ColorConversions.
Повторим раскладку 4:4:4 закодированного изображения
frame | line |
YC1 YC2 YC3 YC4 | line 1 |
YC1 YC2 YC3 YC4 | line 2 |
YC1 YC2 YC3 YC4 | line 3 |
YC1 YC2 YC3 YC4 | line 4 |
В AviSynth, режим по умолчанию использует ядро (матрицу, kernel) 1-2-1 для интерполяции цветности, то есть
C1x = (C1+C1+C1+C2)/4 (C1 используется три раза, так как является границей)
C3x = (C2+C3+C3+C4)/4
C5x = (C4+C5+C5+C6)/4
4:2:2 закодированное изображение становится
frame | line |
Y1C1x Y2 Y3C3x Y4 | line 1 |
Y1C1x Y2 Y3C3x Y4 | line 2 |
Y1C1x Y2 Y3C3x Y4 | line 3 |
Y1C1x Y2 Y3C3x Y4 | line 4 |
Другой режим ConvertBackToYUY2 использует цветность от левого пиксела, таким образом
frame | line |
Y1C1 Y2 Y3C3 Y4 | line 1 |
Y1C1 Y2 Y3C3 Y4 | line 2 |
Y1C1 Y2 Y3C3 Y4 | line 3 |
Y1C1 Y2 Y3C3 Y4 | line 4 |
Отметьте (как и с раскладками других форматов) позицию величин цветности, представляющюю ВЗВЕШЕННЫЙ результат подвыборки.
Преобразование чересстрочного YUY2 -> YV12
Повторим раскладку чересстрочного 4:2:0 закодированного изображения, но с включенными весовыми факторами (weight):
frame | line | weights |
Y_Y_Y_Y | line 1t | |
C___C__ | chroma of YUY2_lines (0.75)*1t + (0.25)*3t | |
Y_Y_Y_Y | line 2b | |
Y_Y_Y_Y | line 3t | |
C___C__ | chroma of YUY2_lines (0.25)*2b + (0.75)*4b | |
Y_Y_Y_Y | line 4b | |
или
field 1 | field 2 | line | weights |
Y_Y_Y_Y | line 1t | ||
C___C__ | chroma of YUY2_lines (0.75)*1t + (0.25)*3t | ||
Y_Y_Y_Y | line 2b | ||
Y_Y_Y_Y | line 3t | ||
C___C__ | chroma of YUY2_lines (0.25)*2b + (0.75)*4b | ||
Y_Y_Y_Y | line 4b | ||
Отметьте (как и с раскладками других форматов) позицию величин цветности, представляющую ВЗВЕШЕННЫЙ результат подвыборки.
Таким образом, цветность (chroma) растянута через две строки яркости в том же поле (полукадре)!
Преобразование прогрессивного YUY2 -> YV12
Повторим раскладку 4:2:0 закодированного изображения
frame | line | weights |
Y_Y_Y_Y | line 1 | |
C___C__ | chroma of YUY2_lines (0.5)*1 + (0.5)*2 | |
Y_Y_Y_Y | line 2 | |
Y_Y_Y_Y | line 3 | |
C___C__ | chroma of YUY2_lines (0.5)*3 + (0.5)*4 | |
Y_Y_Y_Y | line 4 | |
Отметьте (как и с раскладками других форматов) позицию величин цветности, представляющюю ВЗВЕШЕННЫЙ результат подвыборки.
Таким образом, цветность (chroma) растянута через две строки в том же (полном) кадре!
Повторим раскладку 4:2:2 закодированного изображения
frame | line |
Y1C1 Y2 Y3C3 Y4 | line 1 |
Y1C1 Y2 Y3C3 Y4 | line 2 |
Y1C1 Y2 Y3C3 Y4 | line 3 |
Y1C1 Y2 Y3C3 Y4 | line 4 |
Для преобразования 4:2:2 -> 4:4:4, пропущенные (недостающие) отсчеты цветности интерполируются (используя ядро 1-1), то есть
C2x = (C1+C3)/2
C4x = (C3+C5)/2
а существующие отсчеты цветности просто копируются.
4:4:4 закодированное изображение становится
frame | line |
Y1C1 Y2C2x Y3C3 Y4C4x | line 1 |
Y1C1 Y2C2x Y3C3 Y4C4x | line 2 |
Y1C1 Y2C2x Y3C3 Y4C4x | line 3 |
Y1C1 Y2C2x Y3C3 Y4C4x | line 4 |
В AviSynth, пропущенные (недостающие) отсчеты цветности интерполируются следующим образом
frame | line | weights |
Y_Y_Y_Y | line 1t | chroma of YV12_lines 1t |
C___C__ | ||
Y_Y_Y_Y | line 2b | chroma of YV12_lines 4b |
Y_Y_Y_Y | line 3t | chroma of YV12_lines (0.75)*1t + (0.25)*5t |
C___C__ | ||
Y_Y_Y_Y | line 4b | chroma of YV12_lines (0.75)*4b + (0.25)*8b |
Y_Y_Y_Y | line 5t | chroma of YV12_lines (0.25)*1t + (0.75)*5t |
C___C__ | ||
Y_Y_Y_Y | line 6b | chroma of YV12_lines (0.25)*4b + (0.75)*8b |
Y_Y_Y_Y | line 7t | chroma of YV12_lines (0.75)*5t + (0.25)*9t |
C___C__ | ||
Y_Y_Y_Y | line 8b | chroma of YV12_lines (0.75)*8b + (0.25)*12b |
или
field 1 | field 2 | line | weights |
Y_Y_Y_Y | line 1t | chroma of YV12_lines 1t | |
C___C__ | |||
Y_Y_Y_Y | line 2b | chroma of YV12_lines 4b | |
Y_Y_Y_Y | line 3t | chroma of YV12_lines (0.75)*1t + (0.25)*5t | |
C___C__ | |||
Y_Y_Y_Y | line 4b | chroma of YV12_lines (0.75)*4b + (0.25)*8b | |
Y_Y_Y_Y | line 5t | chroma of YV12_lines (0.25)*1t + (0.75)*5t | |
C___C__ | |||
Y_Y_Y_Y | line 6b | chroma of YV12_lines (0.25)*4b + (0.75)*8b | |
Y_Y_Y_Y | line 7t | chroma of YV12_lines (0.75)*5t + (0.25)*9t | |
C___C__ | |||
Y_Y_Y_Y | line 8b | chroma of YV12_lines (0.75)*8b + (0.25)*12b | |
AviSynth использует иную интерполяцию, чем предложеную спецификацией mpeg2 (возможно из-за проблем скорости). Последняя (MPEG2) есть
field 1 | field 2 | line | weights |
Y_Y_Y_Y | line 1t | chroma of YV12_lines 1t | |
C___C__ | |||
Y_Y_Y_Y | line 2b | chroma of YV12_lines 4b | |
Y_Y_Y_Y | line 3t | chroma of YV12_lines (5/8)*1t + (3/8)*5t | |
C___C__ | |||
Y_Y_Y_Y | line 4b | chroma of YV12_lines (7/8)*4b + (1/8)*8b | |
Y_Y_Y_Y | line 5t | chroma of YV12_lines (1/8)*1t + (7/8)*5t | |
C___C__ | |||
Y_Y_Y_Y | line 6b | chroma of YV12_lines (3/8)*4b + (5/8)*8b | |
Y_Y_Y_Y | line 7t | chroma of YV12_lines (5/8)*5t + (3/8)*9t | |
C___C__ | |||
Y_Y_Y_Y | line 8b | chroma of YV12_lines (7/8)*8b + (1/8)*12b | |
Преобразование прогрессивного YV12 -> YUY2
Пропущеные (недостаюшие) отсчеты цветности интерполируются следующим образом
frame | line | weights |
Y_Y_Y_Y | line 1 | chroma of YV12_lines 1 |
C___C__ | ||
Y_Y_Y_Y | line 2 | chroma of YV12_lines (0.75)*1 + (0.25)*3 |
Y_Y_Y_Y | line 3 | chroma of YV12_lines (0.25)*1 + (0.75)*3 |
C___C__ | ||
Y_Y_Y_Y | line 4 | chroma of YV12_lines (0.75)*3 + (0.25)*5 |
Y_Y_Y_Y | line 5 | chroma of YV12_lines (0.25)*3 + (0.75)*5 |
C___C__ | ||
Y_Y_Y_Y | line 6 | chroma of YV12_lines (0.75)*5 + (0.25)*7 |
ColorSpaces
[4:4:4] sampling
[4:2:2] sampling
[4:2:0] sampling
[Chroma Upsampling]
[Chroma Subsampling Standards]
Существуют два общих варианта 4:2:0 дискретизации (sampling). Один и них используется в MPEG-2 видео (и стандарте CCIR-601), а другой используется в MPEG-1. Схема MPEG-2 это как раз то, как AviSynth дискретизирует 4:2:0 видео, так как она полностью позволяет избежать горизонтального пересчета (передискретизации, resampling) в преобразованиях 4:2:0 <-> 4:2:2.
Раскладка прогрессивного MPEG-1 4:2:0 закодированного изображения
frame | line | weights |
Y_Y_Y_Y | line 1 | |
_C__C_ | chroma of YUY2_lines (0.5)*1 + (0.5)*2 | |
Y_Y_Y_Y | line 2 | |
Y_Y_Y_Y | line 3 | |
_C__C_ | chroma of YUY2_lines (0.5)*3 + (0.5)*4 | |
Y_Y_Y_Y | line 4 | |
Раскладка MPEG-2 4:2:0 закодированного изображения
frame | line | weights |
Y_Y_Y_Y | line 1 | |
C___C__ | chroma of YUY2_lines (0.5)*1 + (0.5)*2 | |
Y_Y_Y_Y | line 2 | |
Y_Y_Y_Y | line 3 | |
C___C__ | chroma of YUY2_lines (0.5)*3 + (0.5)*4 | |
Y_Y_Y_Y | line 4 | |
Для полноты, мы упомянем дискретизацию DV. DV является 4:2:0 (PAL) и 4:1:1 (NTSC). Заметьте, что позиции отсчетов (sample positioning) первого отличаются от позиций 4:2:0 цветности в MPEG-1/MPEG-2!
Раскладка 4:2:0 закодированного изображения (основанное на полях, полукадрах, field-based)
field | line |
YV Y YV Y YV Y YV Y | line 1 |
YU Y YU Y YU Y YU Y | line 2 |
YV Y YV Y YV Y YV Y | line 3 |
YU Y YU Y YU Y YU Y | line 4 |
Раскладка 4:1:1 закодированного изображения (основанное на полях, полукадрах, field-based)
field | line |
YC Y Y Y YC Y Y Y | line 1 |
YC Y Y Y YC Y Y Y | line 2 |
YC Y Y Y YC Y Y Y | line 3 |
YC Y Y Y YC Y Y Y | line 4 |
Некоторые комментарии об этих форматах:
- 4:1:1 прямо (врожденно, natively) поддерживается в AviSynth только с версии 2.6.
- Все DV декодеры выводят YUY2 или RGB (за исключением ffdshow если разрешено YV12).
- При выводе YUY2/RGB (NTSC), кодек MainConcept дублирует цветовые отсчеты вместо их интерполяции. Плагин [ReInterpolate411 plugin] может быть использован, чтобы скорректировать это, приводя к лучшему качеству.
[MSDN: YUV sampling] Описывает большинство общих методов YUV дискретизации.
[DV sampling]
Вообще, чересстрочный контент (содержимое) имеет и статические части. Если они пересчитаны к высокому разрешению (upsampled) корректно, используя чересстрочный пересчет, они все же имеют проблемы цветности на диагональных краях ярко-окрашенных объектов в статических частях кадра. Причиной является то, что "Когда два поля потом складываются деинтерлейсом (или Вашим глазом и мозгом, если вы смотрите это на чересстрочном телевизоре), то относительно плавные градации и контуры каждого поля ломаются (разбиваются, broken up) слегка отличающимся набором градаций и контуров от другого поля." (цитировано из первой ссылки). Это называется Проблемой чересстрочной цветности (the Interlaced Chroma Problem). "Решением" является адаптивный к движению пересчет разрешения, но фильтра AviSynth/VDub, который пытался бы сделать это, пока не существует.
Ссылки:
[ The 4:2:0 Interlaced Chroma Problem]
[The 4:2:0 Interlaced Chroma Problem - Television and Video Advice]
$English Date: 2007/08/22 20:51:38 $
Русский перевод 28.05.2005-26.08.2007 Fizick http://bag.hotmail.ru