# Vzorkování (Sampling)

## 1. Převody barevných formátů a chyba nadvzorkování barev (Chroma Upsampling Error)

Následující obrázky ukazují chyby, které jsou příklady chyby zvýšení počtu vzorků - nadvzorkování barev ( Chroma Upsampling Error), nazývaných takto protože video je nadvzorkováno nesprávně (prokládané YV12 převzorkované jako progresivní a naopak). Ve výsledku uvidíte mezery na horních nebo spodních okrajích barevných objektů a "duchy" - řádky plovoucí nad nebo pod objekty.

obrázek 1a: příklad prokládaného zdroje (YV12) , který byl nadvzorkován jako progresivní video (YUY2) (z http://zenaria.com/gfx/)

obrázek 1b: stejný obrázek s korekcí nadvzorkování barev (z http://zenaria.com/gfx/)

obrázek 2a: příklad progresivního zdroje (YV12) převzorkovaného jako prokládané video (YUY2)

obrázek 2b: stejný obrázek s korekcí převzorkování barev

V této kapitole, budou uvedeny příčiny, které tuto chybu způsobují a jak ji napravit. Nápravou se zde myslí snížení její viditelnosti, protože ji nelze úplně odstranit.

Odkazy:
[The Chroma Upsampling Error]
[The Chroma Upsampling Error - Television and Video Advice]

### 1.1 Chyba nadvzorkování barev (neboli CUE)

Jak už bylo řečeno, chyba nadvzorkování barev nastane při převodu z (opravdu) prokládaného YV12 do většiny jiných formátů kdy si převodník myslí, že video je progresivní. Nebo, jiný případ, je-li materiál progresivní (nebo prokládaný enkódován jako progresivní), a převzorkován jako prokládaný. Ale to není tak špatné jako v prvním případě.

Budete-li prohlížet vaše video ve VirtualDubu, budete ho potřebovat převést do RGB. Protože AviSynth dodá YV12, VirtualDub žádá kodek (například XviD nebo DivX) o převod z YV12 do RGB. Nicméně kodek VŽDY nadvzorkovává progresivně. Odtud obdržíte při prohlížení ve VirtualDubu artefakty v prokládaném YV12 materiálu. Ale ty se nenachází v YV12 videu (nebo ve výsledném zakódovaném materiálu). Aby jste si to ověřili proveďte v AviSynthu převod pomocí ConvertToRGB(interlaced= true) na konci vašeho skriptu.

### 1.2 Korekce videa s chybou převzorkování barev

Budete muset nějakým způsobem rozmazat barevnost (jas necháte netknutý).

Například (použití tomsmocomp.dll):

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

## 2. Teoretické aspekty

V této kapitole bude vysvětleno rozmístění barevnosti, jaký to má vztah ke snížení počtu vzorků - podvzorkování (subsampling) RGB -> YUY2 -> YV12 a jak je nadvzorkování prováděno v AviSynthu.

Také bude detailně vysvětleno proč nastávají chyby nadvzorkování CUE. Shrňme si poslední údaje, problém je v tom, že je rozdíl mezi progresivním YV12 a prokládaným YV12, protože barva je svisle sdílena sousedními pixely.
Viz také http://forum.doom9.org/showthread.php?s=&threadid=52151&highlight=upsampling.

### 2.1 Barevné formáty: RGB, YUY2 a YV12

Abychom mohli pochopit jak převzorkování YV12 <-> YUY2 pracuje a proč má význam, když je váš zdroj prokládaný nebo progresivní, budeme nejdříve diskutovat barevné formáty YV12/YUY2. Není zde důležité, jak se vám uchovají v paměti. Informace o tom naleznete zde: ColorSpaces.

#### Barevný formát YUV 4:4:4

Termín 4:4:4 znamená, že pro každé čtyři vzorky jasu (Y), jsou čtyři vzorky U a V. Takže každý pixel má jasovou hodnotu (Y), hodnotu U (vzorek modrého barevného rozdílu neboli Cb) a hodnotu V (vzorek červeného barevného rozdílu neboli Cr). Všimněte si, "C" je právě vzorek barevnosti (UV-vzorek).

Rozvržení 4:4:4 kódovaného obrazu vypadá následovně

snímek | řádek
YC YC YC YC | řádek 1
YC YC YC YC | řádek 2
YC YC YC YC | řádek 3
YC YC YC YC | řádek 4

#### Barevný formát YUY2

YUY2 (nebo YUYV) je formát 4:2:2 . Termín 4:2:2 znamená, že pro každé čtyři vzorky jasu (Y), jsou dva vzorky U a V, které dávají užší pásmo barev (bandwidth) v poměru k jasu. Takže pro každý pixel, je horizontálně sdílené UV (barevnost) se sousedním pixelem.

Rozvržení 4:2:2 kódovaného obrazu vypadá následovně

snímek | řádek
YC Y YC Y | řádek 1
YC Y YC Y | řádek 2
YC Y YC Y | řádek 3
YC Y YC Y | řádek 4

#### Barevný formát YV12

U barevného formátu YV12, je rozdíl mezi progresivním a prokládaným. Příčinou je, že barevné hodnoty jsou také sdílené svisle dvěma sousedními řádky.

YV12 je 4:2:0 formát. Termín 4:2:0 znamená, že pro každé čtyři vzorky (dva horizontální a dva vertikální) jasu (Y), je jeden vzorek pro U a V, který dává užší pásmo barev v poměru k jasu.

progresivní YV12

Každý pixel, sdílí v horizontálním směru UV (C) se sousedním pixelem a vertikálně sdílí UV se sousedním řádkem (tedy řádek 1 s řádkem 2, řádek 3 s řádkem 4, atd).

Rozvržení progresivního 4:2:0 kódovaného obrazu vypadá následovně (schema MPEG 2 - viz níže)

snímek | řádek
Y_Y_Y_Y | řádek 1
C___C__ |
Y_Y_Y_Y | řádek 2
Y_Y_Y_Y | řádek 3
C___C__ |
Y_Y_Y_Y | řádek 4

prokládané YV12

Každý pixel, horizontalně sdílí UV (barevnost neboli C) se sousedním pixelem a vertikálně sdílí UV s dalším sousedním řádkem (tedy řádek 1t s řádkem 3t, řádek 2b s řádkem 4b, atd). Písmeno t (top) zde značí horní pole, písmeno b (bottom) dolní pole.

Rozvržení prokládaného 4:2:0 zakódovaného obrazu vypadá následovně (schema MPEG 2 - viz níže)

snímek | řádek
Y_Y_Y_Y | řádek 1t
C___C__ |
Y_Y_Y_Y | řádek 2b
Y_Y_Y_Y | řádek 3t
C___C__ |
Y_Y_Y_Y | řádek 4b

nebo

pole 1 | pole 2 | řádek
Y_Y_Y_Y |  | řádek 1t
C___C__ |  |
| Y_Y_Y_Y | řádek 2b
Y_Y_Y_Y |  | řádek 3t
| C___C__ |
| Y_Y_Y_Y | řádek 4b

### 2.2 Snížení počtu vzorků - podvzorkování (Subsampling)

Podvzorkování se používá k redukci požadavků na ukládání a pásmo vysílání pro digitální video. Je to efektivní pro YCbCr signál, protože lidské oko je citlivější na změnu v černé a bílé než na změny v barvě. A i taková drastická redukce informací o barvě ukazuje velmi malý viditelný rozdíl. YUY2 a YV12 jsou příklady redukce barevných formátů.

#### převod RGB -> YUY2

Více o barevných převodech RGB -> YUV najdete zde: ColorConversions.
Připomeňme si rozvržení 4:4:4 kódovaného obrazu

snímek | řádek
YC1 YC2 YC3 YC4 | řádek 1
YC1 YC2 YC3 YC4 | řádek 2
YC1 YC2 YC3 YC4 | řádek 3
YC1 YC2 YC3 YC4 | řádek 4

V AviSynthu, je ve výchozím režimu použito jádro 1-2-1 pro interpolaci barvy, to je

C1x = (C1+C1+C1+C2)/4 (C1 je použito třikrát, protože je to okraj)
C3x = (C2+C3+C3+C4)/4
C5x = (C4+C5+C5+C6)/4

4:2:2 kódovaný obraz se skládá

snímek | řádek
Y1C1x Y2 Y3C3x Y4 | řádek 1
Y1C1x Y2 Y3C3x Y4 | řádek 2
Y1C1x Y2 Y3C3x Y4 | řádek 3
Y1C1x Y2 Y3C3x Y4 | řádek 4

Jiný režim ConvertBackToYUY2 použije barevnost z levého pixelu, tedy

snímek | řádek
Y1C1 Y2 Y3C3 Y4 | řádek 1
Y1C1 Y2 Y3C3 Y4 | řádek 2
Y1C1 Y2 Y3C3 Y4 | řádek 3
Y1C1 Y2 Y3C3 Y4 | řádek 4

Všimněte si (stejně tak v rozvržení jiných formátů) pozice barevných hodnot, představující VÁŽENÝ výsledek podvzorkování.

převod prokládaného YUY2 -> YV12

Připomeneme si rozvržení prokládaného 4:2:0 kódovaného obrazu, ale se zahrnutým váhovým faktorem:

snímek | řádek | vážení
Y_Y_Y_Y | řádek 1t |
C___C__ |  | barevnost YUY2_řádků (0.75)*1t + (0.25)*3t
Y_Y_Y_Y | řádek 2b |
Y_Y_Y_Y | řádek 3t |
C___C__ |  | barevnost YUY2_řádků (0.25)*2b + (0.75)*4b
Y_Y_Y_Y | řádek 4b |

nebo

pole 1 | pole 2 | řádek | vážení
Y_Y_Y_Y |  | řádek 1t |
C___C__ |  |  | barevnost YUY2_řádků (0.75)*1t + (0.25)*3t
| Y_Y_Y_Y | řádek 2b |
Y_Y_Y_Y |  | řádek 3t |
| C___C__ |  | barevnost YUY2_řádků (0.25)*2b + (0.75)*4b
| Y_Y_Y_Y | řádek 4b |

Všimněte si (stejně tak v rozvržení jiných formátů) pozice barevných hodnot, představuje VÁŽENÝ výsledek podvzorkování.

Tak je barevnost roztažena přes dva jasové řádky v jednom poli (půlsnímku)!

Převod progresivního YUY2 -> YV12

Připomeneme si rozvržení 4:2:0 kódovaného obrazu

snímek | řádek | vážení
Y_Y_Y_Y | řádek 1 |
C___C__ |  | barevnost YUY2_řádků (0.5)*1 + (0.5)*2
Y_Y_Y_Y | řádek 2 |
Y_Y_Y_Y | řádek 3 |
C___C__ |  | barevnost YUY2_řádků (0.5)*3 + (0.5)*4
Y_Y_Y_Y | řádek 4 |

Všimněte si (stejně tak v rozvržení jiných formátů) pozice barevných hodnot, představuje VÁŽENÝ výsledek snížení počtu vzorků.

Tak je barevnost roztažena přes dva jasové řádky v jednom snímku!

### 2.3 Zvýšení počtu vzorků - nadvzorkování (Upsampling)

#### Převod YUY2 -> RGB

Připomeneme si rozvržení 4:2:2 kódovaného obrazu

snímek | řádek
Y1C1 Y2 Y3C3 Y4 | řádek 1
Y1C1 Y2 Y3C3 Y4 | řádek 2
Y1C1 Y2 Y3C3 Y4 | řádek 3
Y1C1 Y2 Y3C3 Y4 | řádek 4

Pro převod 4:2:2 -> 4:4:4 jsou chybějící vzorky barevnosti interpolovány (s použitím jádra 1-1), což je

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

a existující vzorky barevnosti jsou prostě zkopírovány.

4:4:4 kódovaný obraz

snímek | řádek
Y1C1 Y2C2x Y3C3 Y4C4x | řádek 1
Y1C1 Y2C2x Y3C3 Y4C4x | řádek 2
Y1C1 Y2C2x Y3C3 Y4C4x | řádek 3
Y1C1 Y2C2x Y3C3 Y4C4x | řádek 4

#### Převod prokládaného YV12 -> YUY2

Chybějí vzorky barevnosti jsou v AviSynthu interpolovány následovně

snímek | řádek | vážení
Y_Y_Y_Y | řádek 1t | barevnost YV12_řádků 1t
C___C__ |  |
Y_Y_Y_Y | řádek 2b | barevnost YV12_řádků 4b
Y_Y_Y_Y | řádek 3t | barevnost YV12_řádků (0.75)*1t + (0.25)*5t
C___C__ |  |
Y_Y_Y_Y | řádek 4b | barevnost YV12_řádků (0.75)*4b + (0.25)*8b
Y_Y_Y_Y | řádek 5t | barevnost YV12_řádků (0.25)*1t + (0.75)*5t
C___C__ |  |
Y_Y_Y_Y | řádek 6b | barevnost YV12_řádků (0.25)*4b + (0.75)*8b
Y_Y_Y_Y | řádek 7t | barevnost YV12_řádků (0.75)*5t + (0.25)*9t
C___C__ |  |
Y_Y_Y_Y | řádek 8b | barevnost YV12_řádků (0.75)*8b + (0.25)*12b

nebo

pole 1 | pole 2 | řádek | vážení
Y_Y_Y_Y |  | řádek 1t | barevnost YV12_řádků 1t
C___C__ |  |  |
| Y_Y_Y_Y | řádek 2b | barevnost YV12_řádků 4b
Y_Y_Y_Y |  | řádek 3t | barevnost YV12_řádků (0.75)*1t + (0.25)*5t
| C___C__ |  |
| Y_Y_Y_Y | řádek 4b | barevnost YV12_řádků (0.75)*4b + (0.25)*8b
Y_Y_Y_Y |  | řádek 5t | barevnost YV12_řádků (0.25)*1t + (0.75)*5t
C___C__ |  |  |
| Y_Y_Y_Y | řádek 6b | barevnost YV12_řádků (0.25)*4b + (0.75)*8b
Y_Y_Y_Y |  | řádek 7t | barevnost YV12_řádků (0.75)*5t + (0.25)*9t
| C___C__ |  |
| Y_Y_Y_Y | řádek 8b | barevnost YV12_řádků (0.75)*8b + (0.25)*12b

AviSynth použije jinou interpolaci než je předpokládáno specifikací mpeg2 (snad kvůli problémům s rychlostí). Mpeg 2 je:

pole 1 | pole 2 | řádek | vážení
Y_Y_Y_Y |  | řádek 1t | barevnost YV12_řádků 1t
C___C__ |  |  |
| Y_Y_Y_Y | řádek 2b | barevnost YV12_řádků 4b
Y_Y_Y_Y |  | řádek 3t | barevnost YV12_řádků (5/8)*1t + (3/8)*5t
| C___C__ |  |
| Y_Y_Y_Y | řádek 4b | barevnost YV12_řádků (7/8)*4b + (1/8)*8b
Y_Y_Y_Y |  | řádek 5t | barevnost YV12_řádků (1/8)*1t + (7/8)*5t
C___C__ |  |  |
| Y_Y_Y_Y | řádek 6b | barevnost YV12_řádků (3/8)*4b + (5/8)*8b
Y_Y_Y_Y |  | řádek 7t | barevnost YV12_řádků (5/8)*5t + (3/8)*9t
| C___C__ |  |
| Y_Y_Y_Y | řádek 8b | barevnost YV12_řádků (7/8)*8b + (1/8)*12b

Převod progresivního YV12 -> YUY2

Chybějí vzorky barevnosti jsou interpolovány následovně

snímek | řádek | vážení
Y_Y_Y_Y | řádek 1 | barevnost YV12_řádků 1
C___C__ |  |
Y_Y_Y_Y | řádek 2 | barevnost YV12_řádků (0.75)*1 + (0.25)*3
Y_Y_Y_Y | řádek 3 | barevnost YV12_řádků (0.25)*1 + (0.75)*3
C___C__ |  |
Y_Y_Y_Y | řádek 4 | barevnost YV12_řádků (0.75)*3 + (0.25)*5
Y_Y_Y_Y | řádek 5 | barevnost YV12_řádků (0.25)*3 + (0.75)*5
C___C__ |  |
Y_Y_Y_Y | řádek 6 | barevnost YV12_řádků (0.75)*5 + (0.25)*7

### 2.4 Odkazy

Barevná prostředí
[4:4:4] vzorkování
[4:2:2] vzorkování
[4:2:0] vzorkování
[ Nadvzorkování barevnosti]
[Standardy podvorkování barevnosti]

### 3.1 Vzorkování MPEG-1 proti MPEG-2

Existují dva obecné způsoby 4:2:0 vzorkování. Jeden z nich je použit v MPEG-2 (a CCIR-601) videu, a druhý je použit v MPEG-1. MPEG-2 schema je způsob jakým AviSynth vzorkuje 4:2:0 video, protože plně umožňuje vyhnout se horizontálnímu převzorkování v převodech 4:2:0 <-> 4:2:2.

Rozvržení progresivního MPEG-1 4:2:0 kódovaného obrazu

snímek | řádek | vážení
Y_Y_Y_Y | řádek 1 |
_C__C_ |  | barevnost YUY2_řádků (0.5)*1 + (0.5)*2
Y_Y_Y_Y | řádek 2 |
Y_Y_Y_Y | řádek 3 |
_C__C_ |  | barevnost YUY2_řádků (0.5)*3 + (0.5)*4
Y_Y_Y_Y | řádek 4 |

Rozvržení MPEG-2 4:2:0 kódovaného obrazu

snímek | řádek | vážení
Y_Y_Y_Y | řádek 1 |
C___C__ |  | barevnost YUY2_řádků (0.5)*1 + (0.5)*2
Y_Y_Y_Y | line 2 |
Y_Y_Y_Y | řádek 3 |
C___C__ |  | barevnost YUY2_řádků (0.5)*3 + (0.5)*4
Y_Y_Y_Y | řádek 4 |

### 3.2 DV vzorkování

Pro úplnost, zmíníme DV vzorkování. DV je 4:2:0 (PAL) a 4:1:1 (NTSC). Všimněte si, že pozice vzorku prvního z nich je jiná než v 4:2:0 barevnosti u MPEG-1/MPEG-2!

Rozvržení 4:2:0 kódovaného obrazu (založeného na polích)

pole | řádek
YV Y YV Y YV Y YV Y | řádek 1
YU Y YU Y YU Y YU Y | řádek 2
YV Y YV Y YV Y YV Y | řádek 3
YU Y YU Y YU Y YU Y | řádek 4

Rozvržení 4:1:1 kódovaného obrazu (založeného na polích)

pole | řádek
YC Y Y Y YC Y Y Y | řádek 1
YC Y Y Y YC Y Y Y | řádek 2
YC Y Y Y YC Y Y Y | řádek 3
YC Y Y Y YC Y Y Y | řádek 4

Některé komentáře k těmto formátům:
- 4:1:1 je nativně podporován v AviSynthu v2.6.
- Všechny DV dekodéry produkují výstup YUY2 nebo RGB (s výjimkou ffdshow, pokud je zapnuto YV12).
- Při výstupu YUY2/RGB (NTSC), kodek MainConcept duplikuje barevné vzorky místo jejich interpolování. Pro korekci tohoto jevu může být použit [ReInterpolate411 plugin ] , vede to k lepšímu výsledku.

### 3.3 Odkazy

[MSDN: YUV sampling] Popisuje většinu běžných metod YUV vzorkování.
[DV sampling]

## 4. 4:2:0 Problém prokládané barevnosti (Interlaced Chroma Problem or ICP)

Obecně prokládaný obsah má i statické části. Pokud je správně zvětšován počet vzorků pomocí prokládaného převzorkování, přece zůstávají problémy barevnosti na diagonálních hranách jasně barevných objektů ve statických částech snímku. Důvodem je, že "Když se později složí dvě pole zpět dohromady odstraňovačem prokládání (nebo ve vašich očích a v mozku, když sledujete prokládaný obraz na TV), relativní postupné odstupňování barev a kontur každého pole se lomí mírně rozdílným souborem odstupňováním barev a kontur z druhého pole." (Citace z prvního odkazu). To se nazývá Problém prokládané barevnosti (the Interlaced Chroma Problem) . "Řešením" je pohybově adaptivní nadvzorkování, ale takový filtr v AviSynthu/VDubu, který by se to pokusil provést zatím není.

Odkazy:
[The 4:2:0 Interlaced Chroma Problem]
[The 4:2:0 Interlaced Chroma Problem - Television and Video Advice]

`$English Date: 2009/07/12 12:49:59 $`

`Český přeský překlad:18.9.2009`