Дискретизация (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 кодированного изображения выглядит следующим образом

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

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, существуют различи между прогрессивным и чересстрочным. Причиной является то, что величины цветности разделяются вертикально между двумя соседними строками.

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
     

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

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

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

Больше информации о преобразованиях 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) растянута через две строки в том же (полном) кадре!

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

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

Повторим раскладку 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

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

В 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
     

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 закодированного изображения

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  
     

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)

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

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