# Дискретизация (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`