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]
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.
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))
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.
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.
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 |
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 |
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 | |
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ů.
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!
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 |
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 |
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]
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 | |
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.
[MSDN:
YUV sampling] Popisuje většinu běžných metod YUV vzorkování.
[DV sampling]
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