YUV - YUV

Příklad UV barevné roviny, hodnota Y '= 0,5, reprezentovaná v barevném gamutu RGB
Obrázek spolu s jeho komponentami Y ', U a V

YUV je systém kódování barev, který se obvykle používá jako součást kanálu barevných obrázků . Kóduje barevný obraz nebo video s ohledem na lidské vnímání , což umožňuje zmenšení šířky pásma pro složky chrominance , čímž typicky umožňuje, aby přenosové chyby nebo kompresní artefakty byly účinněji maskovány lidským vnímáním než pomocí „přímé“ RGB reprezentace. Jiná barevná kódování mají podobné vlastnosti a hlavním důvodem pro implementaci nebo zkoumání vlastností Y'UV by bylo propojení s analogovou nebo digitální televizí nebo fotografickým zařízením, které odpovídá určitým standardům Y'UV.

Model Y'UV definuje barevný prostor z hlediska jedné složky luma (Y ') a dvou složek chrominance , nazývaných U (modrá projekce) a V (červená projekce). Barevný model Y'UV se používá v PAL kompozitního barevného obrazu (s výjimkou PAL-N ) standardu. Předchozí černobílé systémy používaly pouze luma (Y ') informace. Informace o barvách (U a V) byla přidána samostatně prostřednictvím pomocné nosné, aby černobílý přijímač mohl stále přijímat a zobrazovat přenos barevného obrazu v nativním černobílém formátu přijímače .

Y ′ znamená složku luma (jas) a U a V jsou složky chrominance (barvy); jas je označen Y a luma Y '-hlavní symboly (') označují korekci gama , přičemž „ jas “ znamená fyzický jas lineárního prostoru, zatímco „ luma “ je (nelineární) percepční jas.

Rozsah termínů Y'UV, YUV, YCbCr , YPbPr atd. Je někdy nejednoznačný a překrývá se. Historicky byly termíny YUV a Y'UV použity pro specifické analogové kódování barevných informací v televizních systémech, zatímco YCbCr byl použit pro digitální kódování barevných informací vhodných pro kompresi a přenos videa a statických obrazů, jako je MPEG a JPEG . Termín YUV se dnes v počítačovém průmyslu běžně používá k popisu formátů souborů, které jsou kódovány pomocí YCbCr .

Barevný model YPbPr používaný v analogovém komponentním videu a jeho digitální verze YCbCr používaná v digitálním videu jsou z něj víceméně odvozeny a někdy se jim říká Y′UV. (C B /P B a C R /P R jsou odchylky od šedé na modro -žluté a červeno -azurové ose, zatímco U a V jsou rozdíly mezi modrou a svítivostí a červeně -jasovou barvou .) Barevný prostor Y'IQ použitý v s ním souvisí analogový systém televizního vysílání NTSC , i když složitějším způsobem. YDbDr barevný prostor, který se používá v analogové SECAM a PAL-N televizního vysílání systémů, se také týká.

Pokud jde o etymologii, Y, Y ', U a V nejsou zkratky. Použití písmene Y pro jas lze vysledovat až k výběru primárních skupin XYZ . To se přirozeně hodí k použití stejného písmene v luma (Y '), které aproximuje percepčně jednotný korelát jasu. Podobně byly U a V vybrány k odlišení os U a V od os v jiných prostorech, jako je prostor chromatičnosti x a y. Podívejte se na níže uvedené rovnice nebo porovnejte historický vývoj matematiky.

Dějiny

Y'UV byl vynalezen, když inženýři chtěli barevnou televizi v černobílé infrastruktuře. Potřebovali metodu přenosu signálu, která by byla kompatibilní s černobílou (černobílou) televizí a zároveň mohla přidávat barvy. Složka luma již existovala jako černobílý signál; přidali k tomu jako signál UV signál.

UV reprezentace chrominance byla zvolena před přímými signály R a B, protože U a V jsou signály barevného rozdílu. Jinými slovy, signály U a V říkají televizi, aby posunula barvu určitého bodu (CRT displeje nemají diskrétní pixely), aniž by se změnil jeho jas. Nebo signály U a V informují monitor, aby jednu barvu zesvětlil na úkor druhé a o kolik by měl být posunut. Čím jsou hodnoty U a V vyšší (nebo nižší, pokud jsou záporné), tím je bod sytější (barevnější). Čím blíže se hodnoty U a V blíží nule, tím méně mění barvu, což znamená, že červená, zelená a modrá světla budou stejně jasná a vytvoří šedivější bod. To je výhoda použití signálů rozdílu barev, tj. Místo toho, aby se řeklo, kolik barvy je červené, říká to o kolik je více červená než zelená nebo modrá. Na druhé straně to znamenalo, že když by signály U a V byly nulové nebo chyběly, zobrazoval by pouze obraz ve stupních šedi. Pokud by byly použity R a B, měly by tyto hodnoty nenulové hodnoty i v černobílé scéně, což vyžaduje všechny tři signály přenášející data. To bylo důležité v počátcích barevné televize, protože staré černobílé televizní signály neobsahovaly žádné signály U a V, což znamená, že barevná televize by je po vybalení zobrazovala pouze jako černobílou televizi. Kromě toho by černobílé přijímače mohly přijímat signál Y 'a ignorovat signály barev U a V, čímž by byla Y'UV zpětně kompatibilní se všemi stávajícími černobílými zařízeními, vstupy a výstupy. Pokud by standard barevné televize nepoužíval signály rozdílu barev, mohlo by to znamenat, že barevný televizor vytvoří z černobílého vysílání vtipné barvy nebo bude potřebovat další obvody k překladu černobílého signálu do barvy. Bylo nutné přiřadit chrominančnímu kanálu užší šířku pásma, protože nebyla k dispozici žádná další šířka pásma. Pokud by některé informace o jasu dorazily chrominančním kanálem (jak by tomu bylo v případě, kdyby byly namísto diferenciálních UV signálů použity signály RB), rozlišení černobílého tisku by bylo ohroženo.

Převod na/z RGB

SDTV s BT.470

Signály Y'UV jsou obvykle vytvářeny ze zdroje RGB ( červený , zelený a modrý ). Vážené hodnoty R, G a B jsou sečteny za vzniku Y ', míry celkového jasu nebo jasu. U a V jsou vypočítány jako zmenšené rozdíly mezi hodnotami Y 'a B a R.

Standardy PAL a NTSC (NTSC původně používaly YIQ ) definují následující konstanty, odvozené z primárních prvků BT.470 System M a bílého bodu (stejně jako později v BT.601 , i když používá 1/2 místo 0,436 a 0,615):

Y'UV se vypočítává z RGB (gama předem korigovaný R'G'B ', pouze SECAM IV používá lineární RGB) takto:

Výsledné rozsahy Y ', U a V jsou příslušně [0, 1], [ - U max , U max ] a [ - V max , V max ].

Invertováním výše uvedené transformace se převede Y'UV na RGB:

Ekvivalentně nahrazením hodnot za konstanty a jejich vyjádřením jako matice získáme pro BT.470 System M (PAL) tyto vzorce:

Všimněte si, že pro malé hodnoty Y 'je možné získat hodnoty R, G nebo B, které jsou záporné, takže v praxi výsledky RGB upneme do intervalu [0,1].

HDTV s BT.709

HDTV Rec. 709 (docela blízko SDTV Rec. 601) ve srovnání s UHDTV Rec. 2020

U HDTV se ATSC rozhodl změnit základní hodnoty pro W R a W B ve srovnání s dříve vybranými hodnotami v systému SDTV. Pro HDTV tyto hodnoty uvádí Rec. 709 . Toto rozhodnutí dále ovlivnilo matici pro převod Y'UV↔RGB, takže její členské hodnoty jsou také mírně odlišné. Výsledkem je, že u SDTV a HDTV existují obecně dvě odlišné reprezentace Y'UV pro jakýkoli trojitý RGB: SDTV-Y'UV a HDTV-Y'UV. To podrobně znamená, že při přímém převodu mezi SDTV a HDTV jsou informace o luma (Y ') zhruba stejné, ale reprezentace informací o kanálu chroma (U & V) vyžaduje převod. Stále v pokrytí barevného prostoru CIE 1931 Rec. Barevný prostor 709 je téměř identický s Rec. 601 a pokrývá 35,9%. Na rozdíl od této UHDTV s Rec. 2020 pokrývá mnohem větší oblast, a proto byla pro YCbCr odvozena jeho vlastní matice (žádný YUV/Y′UV, od vyřazení analogové televize z provozu).

BT.709 definuje tyto hodnoty hmotnosti:

Hodnoty a jsou shora.

Konverzní matice pro BT.709 jsou tyto:

Poznámky

  • Váhy použité pro výpočet Y '(horní řada matice) jsou totožné s váhami použitými v barevném prostoru Y'IQ .
  • Stejné hodnoty červené, zelené a modré (tj. Úrovně šedé) poskytují 0 pro U a V. Černá, RGB = (0, 0, 0), dává YUV = (0, 0, 0). Bílá, RGB = (1, 1, 1), dává YUV = (1, 0, 0).
  • Tyto vzorce se tradičně používají v analogových televizorech a zařízeních; digitální zařízení jako HDTV a digitální videokamery používají Y'CbCr.

Numerické aproximace

Před vývojem rychlých procesorů SIMD s pohyblivou řádovou čárkou používala většina digitálních implementací RGB → Y'UV celočíselnou matematiku, zejména aproximace s pevnou řádovou čárkou . Aproximace znamená, že přesnost použitých čísel (vstupních dat, výstupních dat a konstantních hodnot) je omezená, a proto ztrátu přesnosti obvykle kolem poslední binární číslice přijímá každý, kdo tuto možnost využije při kompromisu vylepšené výpočetní rychlosti.

V následujících příkladech, operátor „ “ označuje pravý posun o b binárních poloh. Pro vyjasnění proměnné používají dva znaky indexu: "u" se používá pro nepodepsanou konečnou reprezentaci a "t" se používá pro zmenšenou mezilehlou hodnotu. Níže uvedené příklady jsou uvedeny pouze pro BT.601. Stejný princip lze použít pro provádění funkčně ekvivalentních operací s použitím hodnot, které přijatelně odpovídají datům, která následují po BT.709 nebo jiném srovnatelném standardu.

Hodnoty Y 'jsou konvenčně posunuty a škálovány do rozsahu [16, 235] (označováno jako studiové švihy nebo "televizní úrovně"), nikoli pomocí celého rozsahu [0, 255] (označováno jako plné otáčky nebo "PC úrovně" "). Tato praxe byla standardizována v SMPTE-125M za účelem přizpůsobení překročení signálu („vyzvánění“) v důsledku filtrování. Hodnota 235 umožňuje maximální překročení černé na bílou 255-235 = 20 nebo 20 / (235-16) = 9,1%, což je o něco větší než teoretické maximální překročení ( Gibbsův jev ) asi 8,9% maximální krok. Špička je menší, což umožňuje pouze 16/219 = 7,3% překročení, což je méně než teoretické maximální překročení 8,9%. To je důvod, proč je 16 přidáno k Y 'a proč jsou koeficienty Y' v základním transformačním součtu na 220 místo 255. Hodnoty U a V, které mohou být kladné nebo záporné, jsou sečteny se 128, aby byly vždy kladné, což dává studiový rozsah 16–240 pro U a V. (Tyto rozsahy jsou důležité pro úpravu a produkci videa, protože použití nesprávného rozsahu bude mít za následek buď obraz s „oříznutými“ černými a bílými, nebo obraz s nízkým kontrastem.)

Studio houpačka pro BT.601

K získání tradiční 8bitové reprezentace Y'UV „studio-swing“ pro SDTV/BT.601 lze použít následující operace:

  1. Základní transformace z 8bitových RGB na 16bitové hodnoty (Y ': bez znaménka, U/V: se znaménkem, hodnoty matice byly zaokrouhleny tak, aby později požadovaný Y' rozsah [16..235] a rozsah U/V z [16..240] je dosaženo):
  2. Zmenšit (" >> 8") na 8 bitů se zaokrouhlením ("+128") (Y ′: bez znaménka, U/V: se znaménkem):
  3. Přidejte k hodnotám posun, abyste odstranili všechny záporné hodnoty (všechny výsledky jsou 8bitové bez znaménka):

Plná rychlost pro BT.601

K získání 8bitové reprezentace Y'UV pro SDTV/BT.601 „v plném proudu“ lze použít následující operace:

  1. Základní transformace z 8bitových RGB na 16bitové hodnoty (Y ': bez znaménka, U/V: se znaménkem, hodnoty matice byly zaokrouhleny tak, aby bylo dosaženo pozdějšího požadovaného rozsahu Y'UV každého [0..255], zatímco nemůže dojít k přetečení):
  2. Zmenšit (">> 8") na 8bitové hodnoty se zaokrouhlením ("+128") (Y ′: bez znaménka, U/V: se znaménkem):
  3. Přidejte k hodnotám posun, abyste odstranili všechny záporné hodnoty (všechny výsledky jsou 8bitové bez znaménka):

Systémy jas/chrominance obecně

Hlavní výhodou systémů luma/chroma, jako je Y'UV a jeho příbuzní Y'IQ a YDbDr , je to, že zůstávají kompatibilní s černobílou analogovou televizí (z velké části díky práci Georgese Valensiho ). Kanál Y 'ukládá všechna data zaznamenaná černobílými kamerami, takže produkuje signál vhodný pro příjem na starých monochromatických displejích. V tomto případě jsou U a V jednoduše vyřazeny. Při zobrazení barev jsou použity všechny tři kanály a lze dekódovat původní informace o RGB.

Další výhodou Y'UV je, že některé informace lze zahodit, aby se zmenšila šířka pásma . Lidské oko má poměrně malou prostorovou citlivost na barvu: přesnost informací o jasu jasového kanálu má mnohem větší dopad na rozlišené detaily obrazu než u ostatních dvou. Pochopení tohoto lidského nedostatku, standardy jako NTSC a PAL značně snižují šířku pásma chrominančních kanálů. (Šířka pásma je v časové oblasti, ale při skenování obrázku se to promítne do prostorové domény.)

Proto mohou být výsledné signály U a V v podstatě „komprimovány“. V systémech NTSC (Y'IQ) a PAL měly chrominanční signály výrazně užší šířku pásma než pro jas. Rané verze NTSC rychle střídaly jednotlivé barvy v identických oblastech obrazu, aby vypadaly, že se navzájem sčítají s lidským okem, zatímco všechny moderní analogové a dokonce i většina standardů digitálního videa používají podvzorkování chromu zaznamenáváním barevných informací obrázku se sníženým rozlišením. Je zachována pouze polovina horizontálního rozlišení ve srovnání s informacemi o jasu (označováno jako podvzorkování chroma 4: 2: 2) a často je také sníženo vertikální rozlišení na polovinu (dává 4: 2: 0). Standard 4: x: x byl přijat kvůli nejranějšímu standardu barev NTSC, který používal podvzorkování barev 4: 1: 1 (kde horizontální barevné rozlišení je čtvrtinové, zatímco vertikální je plné rozlišení), takže obraz nesl pouze čtvrtinové rozlišení barev oproti rozlišení jasu. Dnes pouze špičková zařízení zpracovávající nekomprimované signály používají podvzorkování barev 4: 4: 4 se stejným rozlišením pro informace o jasu i barvách.

Osy I a Q byly vybrány podle šířky pásma potřebné pro lidské vidění, přičemž jedna osa vyžadovala největší šířku pásma a druhá (náhodně při 90 stupních) minimum. Skutečná demodulace I a Q však byla relativně složitější a vyžadovala dvě analogové zpožďovací linky a přijímače NTSC ji používaly jen zřídka.

Tato konverze barevného prostoru je však ztrátová , což je zvláště patrné při přeslechu od lumy k chromosvodnému drátu a naopak v analogovém zařízení (včetně konektorů RCA pro přenos digitálního signálu, protože vše, co nesou, je analogové kompozitní video , které je buď YUV, YIQ, nebo dokonce CVBS ). Kromě toho NTSC a PAL kódují barevné signály způsobem, který způsobuje, že se signály chroma a luma s vysokou šířkou pásma vzájemně mísí ve snaze zachovat zpětnou kompatibilitu s černobílým televizním zařízením, což má za následek procházení bodů a křížové barevné artefakty. Když byl v padesátých letech vytvořen standard NTSC, nebyl to skutečný problém, protože kvalita obrazu byla omezena monitorovacím zařízením, nikoli přijímaným signálem s omezenou šířkou pásma. Dnešní moderní televize však dokáže zobrazit více informací, než je obsaženo v těchto ztrátových signálech. Aby udrželi krok se schopnostmi nových zobrazovacích technologií, byly od konce 70. let prováděny pokusy zachovat více signálu Y'UV při přenosu obrázků, jako jsou konektory SCART (1977) a S-Video (1987).

Místo Y'UV byl jako standardní formát (digitálních) běžných algoritmů komprese videa , jako je MPEG-2, použit Y'CbCr . Digitální televize a DVD zachovávají své komprimované video streamy ve formátu MPEG-2, který využívá plný barevný prostor Y'CbCr, ačkoliv zachovává zavedený proces podvzorkování chroma. Profesionální digitální video formát CCIR 601 také používá Y'CbCr při běžné vzorkovací frekvenci chroma 4: 2: 2, především kvůli kompatibilitě s předchozími standardy analogového videa. Tento stream lze snadno kombinovat do jakéhokoli požadovaného výstupního formátu.

Y'UV není absolutní barevný prostor . Je to způsob kódování informací RGB a skutečná zobrazená barva závisí na skutečných barvivech RGB použitých k zobrazení signálu. Proto je hodnota vyjádřená jako Y'UV předvídatelná pouze tehdy, jsou -li použita standardní barviva RGB (tj. Pevná sada primárních barevností nebo konkrétní sada červené, zelené a modré).

Kromě toho je rozsah barev a jasů (známý jako barevný gamut ) RGB (ať už to je BT.601 nebo Rec.709) mnohem menší než rozsah barev a jasů povolených Y'UV. To může být velmi důležité při převodu z Y'UV (nebo Y'CbCr) na RGB, protože výše uvedené vzorce mohou vytvářet "neplatné" hodnoty RGB - tj. Hodnoty pod 0% nebo velmi vysoko nad 100% rozsahu (např. mimo standardní rozsah 16–235 luma (a rozsah 16–240 chroma) pro televizory a obsah HD nebo mimo 0–255 pro standardní rozlišení na počítačích). Pokud nejsou tyto hodnoty zpracovány, budou obvykle "oříznuty" (tj. Omezeny) na platný rozsah ovlivněného kanálu. To mění odstín barvy, což je velmi nežádoucí, takže se proto často považuje za lepší desaturovat nevhodné barvy tak, aby spadaly do gamutu RGB. Podobně, když je RGB v dané bitové hloubce převedeno na YUV ve stejné bitové hloubce, několik barev RGB se může stát stejnou barvou Y'UV, což má za následek ztrátu informací.

Vztah s Y'CbCr

Y'UV se často používá jako termín pro YCbCr . Přestože jsou příbuzné, jsou to různé formáty s různými faktory měřítka. Ve PhotoYCC Photo CD je použita nezměněná matice. U a V jsou bipolární signály, které mohou být pozitivní nebo negativní, a jsou nula pro šedé, zatímco YCbCr obvykle váhy všech kanálů buď na 16-235 rozsahu nebo rozsahu 0-255, což Cb a kr bez znaménka veličin, které jsou 128 pro šediny.

Přesto je vztah mezi nimi ve standardním případě jednoduchý. Zejména Y 'kanály obou jsou navzájem lineárně příbuzné, jak Cb, tak U souvisejí lineárně s (BY), a oba Cr a V souvisejí lineárně s (RY).

Typy odběru vzorků

Chcete -li získat digitální signál, lze snímky Y′UV vzorkovat několika různými způsoby; viz podvzorkování chroma .

Převod mezi Y'UV a RGB

Soubory RGB jsou obvykle kódovány 8, 12, 16 nebo 24 bitů na pixel. V těchto příkladech budeme předpokládat 24 bitů na pixel, který je zapsán jako RGB888 . Standardní formát bajtu je:

r0, g0, b0, r1, g1, b1, ...

Soubory Y'UV mohou být kódovány 12, 16 nebo 24 bity na pixel. Běžné formáty jsou Y'UV444 (nebo YUV444), YUV411, Y'UV422 (nebo YUV422) a Y'UV420p (nebo YUV420). Apostrof po Y je často vynechán, stejně jako „p“ po YUV420p. Pokud jde o skutečné formáty souborů, YUV420 je nejběžnější, protože data jsou snadněji komprimována a přípona souboru je obvykle „.YUV“.

Vztah mezi datovou rychlostí a vzorkováním (A: B: C) je definován poměrem mezi Y a U a V kanálem.

Pro převod z RGB na YUV nebo zpět je nejjednodušší použít RGB888 a YUV444. U YUV411, YUV422 a YUV420 je třeba bajty nejprve převést na YUV444.

YUV444    3 bytes per pixel     (12 bytes per 4 pixels)
YUV422    4 bytes per 2 pixels   (8 bytes per 4 pixels)
YUV411    6 bytes per 4 pixels
YUV420p   6 bytes per 4 pixels, reordered

Převod Y'UV444 na RGB888

Funkce [R, G, B] = Y′UV444toRGB888 (Y ′, U, V) převádí formát Y′UV na jednoduchý formát RGB.

Vzorce převodu RGB používané pro formát Y'UV444 platí také pro standardní přenosový formát NTSC TV YUV420 (nebo YUV422). U YUV420, protože každý U nebo V vzorek je použit k reprezentaci 4 Y vzorků, které tvoří čtverec, může správná metoda vzorkování umožnit použití přesných převodních vzorců uvedených níže. Další podrobnosti najdete v ukázce formátu 4: 2: 0 ve spodní části tohoto článku.

Tyto vzorce jsou založeny na standardu NTSC:

U starších architektur , které nejsou SIMD , je aritmetika s pohyblivou řádovou čárkou mnohem pomalejší než pomocí aritmetiky s pevnou řádovou čárkou, takže alternativní formulace je:

Pro převod z Y'UV do RGB pomocí koeficientů c, d a e, a poznamenáváme, že to znamená upnutí hodnoty do 8bitového rozsahu 0 až 255, následující vzorce poskytují převod z Y'UV do RGB ( NTSC verze):

Poznámka: Výše ​​uvedené vzorce jsou ve skutečnosti implikovány pro YCbCr. Ačkoli je zde použit termín YUV, YUV a YCbCr nejsou striktně úplně stejné.

Verze vzorce ITU-R je odlišná, s , přičemž a výše:

Celočíselný provoz standardu ITU-R pro YCbCr (8 bitů na kanál) až RGB888:

Převod Y'UV422 na RGB888

Vstup: Přečtěte 4 bajty Y'UV (u, y1, v, y2)
Výstup: Zapíše 6 bajtů RGB (R, G, B, R, G, B)
u  = yuv[0];
y1 = yuv[1];
v  = yuv[2];
y2 = yuv[3];

Pomocí těchto informací by mohl být analyzován jako běžný formát Y'UV444 a získat informace o 2 pixelech RGB:

rgb1 = Y′UV444toRGB888(y1, u, v);
rgb2 = Y′UV444toRGB888(y2, u, v);
Yuv422 yuy2.svg

Y'UV422 lze také vyjádřit hodnotami v alternativním pořadí, např. Pro kód formátu FourCC YUY2.

Vstup: Přečtěte 4 bajty Y'UV (y1, u, y2, v), (y1, y2, u, v) nebo (u, v, y1, y2)

Převod Y'UV411 na RGB888

Vstup: Přečtěte 6 bajtů Y'UV
Výstup: Zapíše 12 bajtů RGB
// Extract YUV components
u  = yuv[0];
y1 = yuv[1];
y2 = yuv[2];
v  = yuv[3];
y3 = yuv[4];
y4 = yuv[5];
rgb1 = Y′UV444toRGB888(y1, u, v);
rgb2 = Y′UV444toRGB888(y2, u, v);
rgb3 = Y′UV444toRGB888(y3, u, v);
rgb4 = Y′UV444toRGB888(y4, u, v);

Výsledkem je, že získáváme hodnoty 4 pixelů RGB (4*3 bajty) ze 6 bajtů. To znamená zmenšení velikosti přenesených dat na polovinu se ztrátou kvality.

Převod Y'UV420p (a Y'V12 nebo YV12) na RGB888

Y'UV420p je planární formát, což znamená, že hodnoty Y ', U a V jsou seskupeny místo proloženy. Důvodem je to, že seskupením hodnot U a V se obraz stává mnohem stlačitelnějším. Když dostaneme pole obrázku ve formátu Y'UV420p, všechny hodnoty Y 'jsou na prvním místě, následují všechny hodnoty U a nakonec všechny hodnoty V.

Formát Y'V12 je v podstatě stejný jako Y'UV420p, ale má přepnutá data U a V: za hodnotami Y 'následují hodnoty V, přičemž hodnoty U jsou poslední. Dokud je věnována pozornost extrahování hodnot U a V ze správných umístění, lze Y'UV420p i Y′V12 zpracovávat pomocí stejného algoritmu.

Stejně jako u většiny formátů Y'UV existuje tolik hodnot Y 'jako pixelů. Kde X se rovná výšce vynásobené šířkou, první indexy X v poli jsou hodnoty Y ', které odpovídají každému jednotlivému pixelu. Existuje však pouze jedna čtvrtina hodnot U a V. Hodnoty U a V odpovídají každému bloku obrazu 2 na 2, což znamená, že každý záznam U a V platí pro čtyři pixely. Po hodnotách Y 'jsou dalšími indexy X/4 hodnoty U pro každý blok 2 x 2 a další indexy X/4 poté hodnoty V, které platí také pro každý blok 2 x 2.

Yuv420.svg

Jak je znázorněno na výše uvedeném obrázku, komponenty Y ', U a V v Y'UV420 jsou kódovány samostatně v sekvenčních blocích. Hodnota AY 'je uložena pro každý pixel, následuje hodnota U pro každý 2 × 2 čtvercový blok pixelů a nakonec hodnota V pro každý blok 2 × 2. Odpovídající hodnoty Y ', U a V jsou zobrazeny pomocí stejné barvy ve výše uvedeném diagramu. Číst řádek po řádku jako bajtový proud ze zařízení, blok Y 'by byl nalezen v poloze 0, blok U v poloze x × y (6 × 4 = 24 v tomto případě) a V blok v poloze x × y + (x × y)/4 (zde 6 × 4 + (6 × 4)/4 = 30).

Převod Y'UV420sp (NV21) na RGB (Android)

Tento formát (NV21) je standardním formátem obrazu v náhledu fotoaparátu Android . YUV 4: 2: 0 planární obraz, s 8 bitovými vzorky Y, následovaný prokládanou V/U rovinou s 8bitovými 2x2 podvzorkovanými vzorky chroma.

Kód C ++ používaný v systému Android k převodu pixelů YUVImage:

void YUVImage::yuv2rgb(uint8_t yValue, uint8_t uValue, uint8_t vValue,
        uint8_t *r, uint8_t *g, uint8_t *b) const {
    int rTmp = yValue + (1.370705 * (vValue-128)); 
    // or fast integer computing with a small approximation
    // rTmp = yValue + (351*(vValue-128))>>8;
    int gTmp = yValue - (0.698001 * (vValue-128)) - (0.337633 * (uValue-128)); 
    // gTmp = yValue - (179*(vValue-128) + 86*(uValue-128))>>8;
    int bTmp = yValue + (1.732446 * (uValue-128));
    // bTmp = yValue + (443*(uValue-128))>>8;
    *r = clamp(rTmp, 0, 255);
    *g = clamp(gTmp, 0, 255);
    *b = clamp(bTmp, 0, 255);
}

Reference

externí odkazy