Дискретизация (Sampling)

1. Преобразование цветовых форматов и ошибка повышения разрешения цветности (Chroma Upsampling Error)

Следующие рисунки показывают ошибки, которые являются примерами ошибок повышения разрешения цветности (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]

1.1 Ошибка повышения разрешения цветности (Chroma Upsampling Error or CUE)

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

При просмотре (preview) Вашего видео в VirtualDub, он будет вынужден преобразовать его в RGB. Так как AviSynth поставляет YV12, VirtualDub просит кодек (например XviD или DivX) преобразовать YV12 в RGB. Кодек однако ВСЕГДА пересчитывает  прогрессивно. Отсюда Вы получите артефакты при в просмотре VirtualDub чересстрочного материала. Это однако не присутствует в  YV12 видео (или в результирующем закодированном материале). Чтобы подтвердить это,  сделайте преобразование с помощью AviSynth путем добавления ConvertToRGB(interlaced=true) в конец вашего скрипта.

1.2 Коррекция видео имеющего ошибку повышения разрешения цветности

Вы должны будете размазать (blur) цветность каким либо способом (оставляя яркостный канал нетронутым).

Например (используя tomsmocomp.dll):

AviSource(...)
MergeChroma(TomsMoComp(-1,5,0))

2. Теоретические аспекты

В данном разделе будет объяснено размещение цветности, как это относится к понижению разрешения отсчетов (субдискретизация, подвыборка, прореживание, subsampling) (RGB -> YUY2 -> YV12) и как производится пересчет к большему разрешению (upsampling) в AviSynth.

Также будет объяснено в деталях, помечу происходит ошибка повышения разрешения цветности. Резюмируя последнее, проблема в том, что существует разница между прогрессивным YV12 и чересстрочным YV12, поскольку цветность разделяется (совместно используется, shared) вертикально между соседними пикселами.

Смотри также http://forum.doom9.org/showthread.php?s=&threadid=52151&highlight=upsampling.

2.1 Цветовые форматы: RGB, YUY2 и YV12

Чтобы разобраться, как работает пересчет YV12 <-> YUY2 и почему имеет значение, является ли источник чересстрочным или прогрессивным, сначала будут обсуждены цветовые форматы YV12/YUY2. Здесь важно, как они хранятся в памяти. Информация об этом может быть найдена здесь: ColorSpaces.

Цветовой формат YUV 4:4:4

Термин 4:4:4 обозначает, что для каждых четырех отсчетов яркости (luminance (Y)), имеется по четыре отсчета  U и V. Таким образом, каждый пиксел имеет величину яркости (Y), величину U (отсчет синей цветоразности (blue difference sample) или Cb) и величину V  (отсчет красной цветоразности (red difference sample) или Cr). Отметьте, что, "C" это просто отсчет цветности (chroma) (UV-отсчет).

Раскладка 4:4:4 кодированного изображения выглядит следующим образом

frameline
YC YC YC YCline 1
YC YC YC YCline 2
YC YC YC YCline 3
YC YC YC YCline 4

Цветовой формат YUY2

YUY2 (или YUYV) есть формат 4:2:2. Термин 4:2:2 обозначает, что для каждых четырех отсчетов яркости (luminance (Y)), имеются по два отсчета  U и V, давая меньшую полосу(bandwidth) цветности по отношению к яркости. Так, для каждого пиксела, имеется горизонтально разделяемая (общая) UV (цветность) с соседним пикселом. 

Раскладка 4:2:2 кодированного изображения выглядит следующим образом

frameline
YC Y YC Yline 1
YC Y YC Yline 2
YC Y YC Yline 3
YC Y YC Yline 4

Цветовой формат YV12

Для цветового формата 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 - смотри ниже)

frameline
Y_Y_Y_Yline 1
C___C__ 
Y_Y_Y_Yline 2
  
Y_Y_Y_Yline 3
C___C__ 
Y_Y_Y_Yline 4
  

Чересстрочный YV12

Для каждого пиксела, горизонтально разделяется UV (цветность, chroma или C) с соседним пикселом и вертикально разделяется UV со строкой через одну (строка 1t со строкой 3t, строка 2b со строкой 4b, и т.д.) Здесь t обозначает верхнее (top) поле, b - нижнее (bottom) поле.

Раскладка чересстрочного 4:2:0 закодированного изображения выглядит следующим образом (схему MPEG 2 - смотри ниже)

frameline
Y_Y_Y_Yline 1t
C___C__ 
Y_Y_Y_Yline 2b
  
Y_Y_Y_Yline 3t
C___C__ 
Y_Y_Y_Yline 4b
  

или

field 1field 2line
Y_Y_Y_Y line 1t
C___C__  
 Y_Y_Y_Yline 2b
   
Y_Y_Y_Y line 3t
 C___C__ 
 Y_Y_Y_Yline 4b
   

2.2 Понижение разрешения (Subsampling)

Понижение разрешения отсчетов (подвыборка, прореживание, Subsampling) используется, чтобы снизить требования по объему хранения и полосе трансляции для цифрового видео. Это эффективно для сигнала YCbCr (яркость/синяя цветоразность/красная цветоразность), так как человеческий глаз более чувствителен к изменениям черного и белого, чем к изменению цвета. Так,  радикальное сокращение цветовой информации показывает очень небольшую видимую разницу. YUY2 и YV12 являются примерами таких  сокращенных (прореженных) цветовых форматов.

Преобразование RGB -> YUY2

Больше информации о преобразованиях RGB -> YUV может быть найдено здесь: ColorConversions.
Повторим раскладку 4:4:4 закодированного изображения

frameline
YC1 YC2 YC3 YC4line 1
YC1 YC2 YC3 YC4line 2
YC1 YC2 YC3 YC4line 3
YC1 YC2 YC3 YC4line 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 закодированное изображение становится

frameline
Y1C1x Y2 Y3C3x Y4line 1
Y1C1x Y2 Y3C3x Y4line 2
Y1C1x Y2 Y3C3x Y4line 3
Y1C1x Y2 Y3C3x Y4line 4

Другой режим ConvertBackToYUY2 использует цветность от левого пиксела, таким образом

frameline
Y1C1 Y2 Y3C3 Y4line 1
Y1C1 Y2 Y3C3 Y4line 2
Y1C1 Y2 Y3C3 Y4line 3
Y1C1 Y2 Y3C3 Y4line 4

Отметьте (как и с раскладками других форматов) позицию величин цветности, представляющюю ВЗВЕШЕННЫЙ результат подвыборки.

Преобразование чересстрочного YUY2 -> YV12 

Повторим раскладку чересстрочного 4:2:0 закодированного изображения, но с включенными весовыми факторами (weight):

framelineweights
Y_Y_Y_Yline 1t 
C___C__ chroma of YUY2_lines
(0.75)*1t + (0.25)*3t
Y_Y_Y_Yline 2b 
   
Y_Y_Y_Yline 3t 
C___C__ chroma of YUY2_lines
(0.25)*2b + (0.75)*4b
Y_Y_Y_Yline 4b 
   

или

field 1field 2lineweights
Y_Y_Y_Y line 1t 
C___C__  chroma of YUY2_lines
(0.75)*1t + (0.25)*3t
 Y_Y_Y_Yline 2b 
    
Y_Y_Y_Y line 3t 
 C___C__ chroma of YUY2_lines
(0.25)*2b + (0.75)*4b
 Y_Y_Y_Yline 4b 
    

Отметьте (как и с раскладками других форматов) позицию величин цветности, представляющую ВЗВЕШЕННЫЙ результат подвыборки.

Таким образом, цветность (chroma) растянута через две строки яркости в том же поле (полукадре)!

Преобразование прогрессивного YUY2 -> YV12 

Повторим раскладку 4:2:0 закодированного изображения

framelineweights
Y_Y_Y_Yline 1 
C___C__ chroma of YUY2_lines
(0.5)*1 + (0.5)*2
Y_Y_Y_Yline 2 
   
Y_Y_Y_Yline 3 
C___C__ chroma of YUY2_lines
(0.5)*3 + (0.5)*4
Y_Y_Y_Yline 4 
   

Отметьте (как и с раскладками других форматов) позицию величин цветности, представляющюю ВЗВЕШЕННЫЙ результат подвыборки.

Таким образом, цветность (chroma) растянута через две строки в том же (полном) кадре!

2.3 Повышение разрешения (Upsampling)

Преобразование YUY2 -> RGB

Повторим раскладку 4:2:2 закодированного изображения

frameline
Y1C1 Y2 Y3C3 Y4line 1
Y1C1 Y2 Y3C3 Y4line 2
Y1C1 Y2 Y3C3 Y4line 3
Y1C1 Y2 Y3C3 Y4line 4

Для преобразования 4:2:2 -> 4:4:4, пропущенные (недостающие) отсчеты цветности интерполируются (используя ядро 1-1), то есть

C2x = (C1+C3)/2
C4x = (C3+C5)/2

а существующие отсчеты цветности просто копируются.

4:4:4 закодированное изображение становится

frameline
Y1C1 Y2C2x Y3C3 Y4C4xline 1
Y1C1 Y2C2x Y3C3 Y4C4xline 2
Y1C1 Y2C2x Y3C3 Y4C4xline 3
Y1C1 Y2C2x Y3C3 Y4C4xline 4

Преобразование чересстрочного YV12  -> YUY2

В AviSynth, пропущенные (недостающие) отсчеты цветности интерполируются следующим образом

framelineweights
Y_Y_Y_Yline 1tchroma of YV12_lines
1t
C___C__  
Y_Y_Y_Yline 2bchroma of YV12_lines
4b
   
Y_Y_Y_Yline 3tchroma of YV12_lines
(0.75)*1t + (0.25)*5t
C___C__  
Y_Y_Y_Yline 4bchroma of YV12_lines
(0.75)*4b + (0.25)*8b
   
Y_Y_Y_Yline 5tchroma of YV12_lines
(0.25)*1t + (0.75)*5t
C___C__  
Y_Y_Y_Yline 6bchroma of YV12_lines
(0.25)*4b + (0.75)*8b
   
Y_Y_Y_Yline 7tchroma of YV12_lines
(0.75)*5t + (0.25)*9t
C___C__  
Y_Y_Y_Yline 8bchroma of YV12_lines
(0.75)*8b + (0.25)*12b
   

или

field 1field 2lineweights
Y_Y_Y_Y line 1tchroma of YV12_lines
1t
C___C__   
 Y_Y_Y_Yline 2bchroma of YV12_lines
4b
    
Y_Y_Y_Y line 3tchroma of YV12_lines
(0.75)*1t + (0.25)*5t
 C___C__  
 Y_Y_Y_Yline 4bchroma of YV12_lines
(0.75)*4b + (0.25)*8b
    
Y_Y_Y_Y line 5tchroma of YV12_lines
(0.25)*1t + (0.75)*5t
C___C__   
 Y_Y_Y_Yline 6bchroma of YV12_lines
(0.25)*4b + (0.75)*8b
    
Y_Y_Y_Y line 7tchroma of YV12_lines
(0.75)*5t + (0.25)*9t
 C___C__  
 Y_Y_Y_Yline 8bchroma of YV12_lines
(0.75)*8b + (0.25)*12b
    

AviSynth использует иную интерполяцию, чем предложеную спецификацией mpeg2 (возможно из-за проблем скорости). Последняя (MPEG2) есть

field 1field 2lineweights
Y_Y_Y_Y line 1tchroma of YV12_lines
1t
C___C__   
 Y_Y_Y_Yline 2bchroma of YV12_lines
4b
    
Y_Y_Y_Y line 3tchroma of YV12_lines
(5/8)*1t + (3/8)*5t
 C___C__  
 Y_Y_Y_Yline 4bchroma of YV12_lines
(7/8)*4b + (1/8)*8b
    
Y_Y_Y_Y line 5tchroma of YV12_lines
(1/8)*1t + (7/8)*5t
C___C__   
 Y_Y_Y_Yline 6bchroma of YV12_lines
(3/8)*4b + (5/8)*8b
    
Y_Y_Y_Y line 7tchroma of YV12_lines
(5/8)*5t + (3/8)*9t
 C___C__  
 Y_Y_Y_Yline 8bchroma of YV12_lines
(7/8)*8b + (1/8)*12b
    

Преобразование прогрессивного YV12  -> YUY2

Пропущеные (недостаюшие) отсчеты цветности интерполируются следующим образом

framelineweights
Y_Y_Y_Yline 1chroma of YV12_lines
1
C___C__  
Y_Y_Y_Yline 2chroma of YV12_lines
(0.75)*1 + (0.25)*3
   
Y_Y_Y_Yline 3chroma of YV12_lines
(0.25)*1 + (0.75)*3
C___C__  
Y_Y_Y_Yline 4chroma of YV12_lines
(0.75)*3 + (0.25)*5
   
Y_Y_Y_Yline 5chroma of YV12_lines
(0.25)*3 + (0.75)*5
C___C__  
Y_Y_Y_Yline 6chroma of YV12_lines
(0.75)*5 + (0.25)*7
   

2.4 Ссылки

ColorSpaces
[4:4:4] sampling
[4:2:2] sampling
[4:2:0] sampling
[Chroma Upsampling]
[Chroma Subsampling Standards]

3.1 Дискретизация MPEG-1 против MPEG-2

Существуют два общих варианта 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 закодированного изображения

framelineweights
Y_Y_Y_Yline 1 
_C__C_ chroma of YUY2_lines
(0.5)*1 + (0.5)*2
Y_Y_Y_Yline 2 
   
Y_Y_Y_Yline 3 
_C__C_ chroma of YUY2_lines
(0.5)*3 + (0.5)*4
Y_Y_Y_Yline 4 
   

Раскладка MPEG-2 4:2:0 закодированного изображения

framelineweights
Y_Y_Y_Yline 1 
C___C__ chroma of YUY2_lines
(0.5)*1 + (0.5)*2
Y_Y_Y_Yline 2 
   
Y_Y_Y_Yline 3 
C___C__ chroma of YUY2_lines
(0.5)*3 + (0.5)*4
Y_Y_Y_Yline 4 
   

3.2 Дискретизация DV

Для полноты, мы упомянем дискретизацию DV. DV является 4:2:0 (PAL) и 4:1:1 (NTSC). Заметьте, что позиции отсчетов (sample positioning) первого отличаются от позиций 4:2:0 цветности в MPEG-1/MPEG-2!

Раскладка 4:2:0 закодированного изображения (основанное на полях, полукадрах, field-based)

fieldline
YV Y YV Y YV Y YV Yline 1
YU Y YU Y YU Y YU Yline 2
YV Y YV Y YV Y YV Yline 3
YU Y YU Y YU Y YU Yline 4

Раскладка 4:1:1 закодированного изображения (основанное на полях, полукадрах, field-based)

fieldline
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] может быть использован, чтобы скорректировать это, приводя к лучшему качеству.

3.3 Ссылки

[MSDN: YUV sampling] Описывает большинство общих методов YUV дискретизации.
[DV sampling]

4. Проблема 4:2:0 чересстрочной цветности (Interlaced Chroma Problem or ICP)

Вообще, чересстрочный контент (содержимое)  имеет и статические части. Если они пересчитаны к высокому разрешению (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