Jakýkoli rastr obraz mohou být zastoupeny ve formě dvourozměrná matice. Pokud jde o barvy, nápad lze rozvinout pohledem na obrázek jako trojrozměrná matice, ve kterém se pro uložení dat pro každou z barev používají další dimenze.
Uvažujeme-li výslednou barvu jako kombinaci tzv. primární barvy (červená, zelená a modrá), v naší trojrozměrné matici definujeme tři roviny: první pro červenou, druhou pro zelenou a poslední pro modrou.
Každý bod v této matici budeme nazývat pixel (prvek obrázku). Každý pixel obsahuje informaci o intenzitě (obvykle jako číselnou hodnotu) každé barvy. Například, červený pixel znamená, že obsahuje 0 zelené, 0 modré a maximálně červené. Růžový pixel lze vytvořit pomocí kombinace tří barev. Pomocí číselného rozsahu od 0 do 255 je růžový pixel definován jako Červená = 255, Zelená = 192 и Modrá = 203.
Existuje mnoho dalších modelů pro znázornění barev, které tvoří obrázek. Můžete například použít indexovanou paletu, která vyžaduje pouze jeden bajt k reprezentaci každého pixelu, namísto tří požadovaných při použití modelu RGB. V takovém modelu je možné použít 2D matici místo 3D matice k reprezentaci každé barvy. To šetří paměť, ale poskytuje menší barevný gamut.
RGB
Podívejte se například na tento obrázek níže. První obličej je kompletně namalovaný. Ostatní jsou červená, zelená a modrá rovina (intenzity odpovídajících barev jsou zobrazeny ve stupních šedi).
Vidíme, že odstíny červené v originále budou na stejných místech, kde jsou pozorovány nejjasnější části druhé tváře. Zatímco přínos modré je vidět hlavně v Mariových očích (poslední tvář) a prvcích jeho oblečení. Všimněte si, kde všechny tři barevné roviny přispívají nejméně (nejtmavší části obrázků) – Mariův knír.
Pro uložení intenzity každé barvy je potřeba určitý počet bitů – tato veličina se nazývá bitová hloubka. Řekněme, že se spotřebuje 8 bitů (na základě hodnoty od 0 do 255) na barevnou rovinu. Pak máme barevnou hloubku 24 bitů (8 bitů * 3 R/G/B roviny).
Další vlastností obrázku je povolení, což je počet pixelů v jednom rozměru. Často se označuje jako šířka × výška, jako na níže uvedeném příkladu obrázku 4 x 4.
Další vlastností, kterou se zabýváme při práci s obrázky/videi, je poměr stran, popisující normální proporcionální vztah mezi šířkou a výškou obrázku nebo pixelu.
Když říkají, že určitý film nebo obrázek má velikost 16 x 9, obvykle to myslí poměr stran displeje (VUT v Brně - z Zobrazit poměr stran). Někdy však mohou být různé tvary jednotlivých pixelů – v tomto případě mluvíme o poměr pixelů (PAR - z Poměr stran pixelů).
Poznámka pro hostitelku: DVD odpovídá DAR 4 až 3
Přestože skutečné rozlišení DVD je 704x480, stále si zachovává poměr stran 4:3, protože PAR je 10:11 (704x10 / 480x11).
A nakonec můžeme určit видео jako sekvence n rámečků za období času, což lze považovat za další rozměr. A n pak je snímková frekvence nebo počet snímků za sekundu (FPS - z Snímků za sekundu).
Počet bitů za sekundu potřebný k zobrazení videa je jeho přenosová rychlost - datový tok.
bitrate = šířka * výška * bitová hloubka * snímky za sekundu
Například video 30 fps, 24 bps, 480 x 240 by vyžadovalo 82,944,000 82,944 30 bps nebo 480 240 Mbps (24 x XNUMX x XNUMX x XNUMX) – ale to v případě, že není použita žádná kompresní metoda.
Pokud je přenosová rychlost почти постоянна, pak se to nazývá konstantní přenosová rychlost (CBR - z konstantní bitová rychlost). Může se ale také lišit, v tomto případě je to tzv variabilní přenosová rychlost (VBR - z variabilní přenosová rychlost).
Tento graf ukazuje omezený VBR, kde se v případě zcela tmavého snímku nepromarní příliš mnoho bitů.
Inženýři původně vyvinuli metodu zdvojnásobení vnímané snímkové frekvence zobrazení videa bez použití další šířky pásma. Tato metoda je známá jako prokládané video; V podstatě posílá polovinu obrazovky v prvním „rámci“ a druhou polovinu v dalším „rámci“.
V současné době se scény většinou vykreslují pomocí progresivní skenovací technologie. Je to způsob zobrazování, ukládání nebo přenosu pohyblivých obrázků, ve kterém jsou všechny řádky každého snímku vykresleny postupně.
Studna! Nyní jsme si vědomi toho, jak je obraz reprezentován digitálně, jak jsou uspořádány jeho barvy, kolik bitů za sekundu spotřebujeme na zobrazení videa, zda je přenosová rychlost konstantní (CBR) nebo proměnná (VBR). Víme o daném rozlišení pomocí dané snímkové frekvence, známe mnoho dalších pojmů, jako je prokládané video, PAR a některé další.
Odstranění redundance
Je známo, že video bez komprese nelze běžně používat. Hodinové video v rozlišení 720p a 30 snímcích za sekundu by zabralo 278 GB. K této hodnotě se dostaneme vynásobením 1280 x 720 x 24 x 30 x 3600 (šířka, výška, bity na pixel, FPS a čas v sekundách).
Použití bezeztrátové kompresní algoritmy, jako DEFLATE (používá se v PKZIP, Gzip a PNG), nesníží dostatečně požadovanou šířku pásma. Musíme hledat jiné způsoby komprimace videa.
K tomu můžete využít funkce naší vize. Jsme lepší v rozlišení jasu než barvy. Video je série sekvenčních snímků, které se v průběhu času opakují. Mezi sousedními snímky stejné scény jsou malé rozdíly. Každý snímek navíc obsahuje mnoho oblastí používajících stejnou (nebo podobnou) barvu.
Barva, jas a naše oči
Naše oči jsou citlivější na jas než na barvu. Můžete se o tom přesvědčit sami, když se podíváte na tento obrázek.
Pokud v levé polovině obrázku nevidíte barvy čtverců A и B jsou vlastně stejné, pak je to normální. Náš mozek nás nutí věnovat více pozornosti světlu a stínu než barvám. Na pravé straně mezi určenými políčky je propojka stejné barvy - takže my (tedy náš mozek) snadno určíme, že jsou ve skutečnosti stejné barvy.
Podívejme se (zjednodušeně) na to, jak fungují naše oči. Oko je složitý orgán skládající se z mnoha částí. Nás však nejvíce zajímají šišky a pruty. Oko obsahuje asi 120 milionů tyčinek a 6 milionů čípků.
Vnímání barvy a jasu považujme za samostatné funkce určitých částí oka (ve skutečnosti je vše poněkud složitější, ale zjednodušíme si to). Tyčinkové buňky jsou zodpovědné hlavně za jas, zatímco čípkové buňky jsou zodpovědné za barvu. Čípky se dělí na tři typy v závislosti na pigmentu, který obsahují: S-čípky (modré), M-čípky (zelené) a L-čípky (červené).
Protože máme mnohem více tyčinek (jas) než čípků (barva), můžeme usoudit, že jsme schopni rozlišovat přechody mezi tmavou a světlou barvou než barvy.
Funkce kontrastní citlivosti
Výzkumníci v experimentální psychologii a mnoha dalších oblastech vyvinuli mnoho teorií lidského vidění. A jeden z nich se jmenuje funkce kontrastní citlivosti. Souvisí s prostorovým a časovým osvětlením. Stručně řečeno, jde o to, kolik změn je potřeba, než si jich pozorovatel všimne. Všimněte si množného čísla slova „funkce“. Je to dáno tím, že funkce kontrastní citlivosti můžeme měřit nejen u černobílých snímků, ale i u barevných. Výsledky těchto experimentů ukazují, že ve většině případů jsou naše oči citlivější na jas než na barvu.
Jelikož víme, že jsme citlivější na jas obrazu, můžeme se pokusit této skutečnosti využít.
Barevný model
Trochu jsme přišli na to, jak pracovat s barevnými obrázky pomocí RGB schématu. Existují i jiné modely. Existuje model, který odděluje jas od sytosti a je známý jako YCbCr. Mimochodem, existují i jiné modely, které dělají podobné rozdělení, ale my budeme uvažovat pouze o tomto.
V tomto barevném modelu Y je reprezentace jasu a také používá dva barevné kanály: Cb (sytě modrá) a Cr (sytě červená). YCbCr lze odvodit z RGB a je možná i zpětná konverze. Pomocí tohoto modelu můžeme vytvořit plnobarevné obrázky, jak vidíme níže:
Převod mezi YCbCr a RGB
Někdo namítne: jak je možné získat všechny barvy, když se nepoužívá zelená?
Abychom na tuto otázku odpověděli, převedeme RGB na YCbCr. Použijme koeficienty přijaté v normě BT.601, který byl jednotkou doporučen ITU-R. Tato divize stanovuje standardy pro digitální video. Například: co je 4K? Jaká by měla být snímková frekvence, rozlišení, barevný model?
Nejprve spočítejme jas. Použijme konstanty navržené ITU a nahraďme hodnoty RGB.
Y = 0.299R + 0.587G + 0.114B
Poté, co máme jas, oddělíme modrou a červenou barvu:
Cb = 0.564(B - Y)
Cr = 0.713(R - Y)
A můžeme také převést zpět a dokonce získat zelenou pomocí YCbCr:
R = Y + 1.402Cr
B = Y + 1.772Cb
G = Y - 0.344Cb - 0.714Cr
Displeje (monitory, televizory, obrazovky atd.) obvykle používají pouze model RGB. Tento model však může být organizován různými způsoby:
Podvzorkování barev
S obrazem reprezentovaným jako kombinace jasu a chrominance můžeme selektivním odstraňováním informací využít větší citlivost lidského zrakového systému na jas než na chrominanci. Chroma subsampling je metoda kódování obrázků s použitím menšího rozlišení pro sytost než pro jas.
Jak moc je přípustné snížit barevné rozlišení?! Ukázalo se, že již existují nějaké diagramy, které popisují, jak zacházet s rozlišením a slučováním (Výsledná barva = Y + Cb + Cr).
Tato schémata jsou známá jako downsampling systémy и выражаются в виде 3-кратного соотношения — a:x:y, který určuje počet vzorků jasových a barevných rozdílových signálů.
a — horizontální standard odběru vzorků (obvykle rovný 4) x — počet vzorků barevnosti v první řadě pixelů (horizontální rozlišení vzhledem k a) y — počet změn ve vzorcích barevnosti mezi první a druhou řadou pixelů.
Výjimkou je 4:1:0, poskytující jeden vzorek chroma v každém bloku rozlišení jasu 4x4.
Obvyklá schémata používaná v moderních kodecích:
4:4:4 (žádné převzorkování)
4:2:2
4:1:1
4:2:0
4:1:0
3:1:1
YCbCr 4:2:0 - příklad fúze
Zde je sloučený obrázek pomocí YCbCr 4:2:0. Všimněte si, že utrácíme pouze 12 bitů na pixel.
Takto vypadá stejný obrázek zakódovaný s hlavními typy podvzorkování barev. První řádek je finální YCbCr, spodní řádek ukazuje barevné rozlišení. Velmi slušné výsledky, s ohledem na mírnou ztrátu kvality.
Pamatujete si, když jsme počítali s 278 GB úložného prostoru pro uložení hodinového video souboru v rozlišení 720p a 30 snímcích za sekundu? Pokud použijeme YCbCr 4:2:0, tak se tato velikost zmenší na polovinu – 139 GB. Zatím má k přijatelnému výsledku ještě daleko.
Histogram YCbCr můžete získat sami pomocí FFmpeg. Na tomto snímku dominuje modrá nad červenou, což je dobře vidět na samotném histogramu.
Barva, jas, barevný gamut - videorecenze
Doporučujeme zhlédnout toto skvělé video. Vysvětluje, co je jas, a obecně jsou všechny tečky tečkované ё o jasu a barvě.
Typy rámů
Pokračujme. Pokusme se eliminovat časovou nadbytečnost. Nejprve si ale vymezme základní terminologii. Řekněme, že máme film s 30 snímky za sekundu, zde jsou jeho první 4 snímky:
V rámcích můžeme vidět hodně opakování: například modré pozadí, které se nemění snímek od snímku. Abychom tento problém vyřešili, můžeme je abstraktně rozdělit do tří typů rámců.
I-snímek (Intro Frame)
I-rám (referenční rám, klíčový rám, vnitřní rám) je samostatný. Bez ohledu na to, co chcete vizualizovat, I-snímek je v podstatě statická fotografie. První snímek je obvykle I-snímek, ale I-snímky budeme pravidelně pozorovat i mezi ne prvními snímky.
P-rám (Predikovaný snímek)
P-кадр (прогнозируемый кадр) использует преимущество того факта, что почти всегда текущее изображение может быть воспроизведено с использованием предыдущего кадра. Например, во втором кадре единственным изменением является движущийся вперёд мяч. Мы можем получить кадр 2 просто немного видоизменив кадр 1, только используя разницу между этими кадрами. Для построения кадра 2 ссылаемся на предшествующий ему кадр 1.
←
B-snímek (Bi-predictive Frame)
A co odkazy nejen na minulé, ale i na budoucí snímky, aby byla zajištěna ještě lepší komprese?! Toto je v podstatě B-snímek (obousměrný snímek).
← →
Mezitímní výběr
Tyto typy rámů se používají k zajištění nejlepší možné komprese. Jak k tomu dojde, se podíváme v další části. Prozatím poznamenejme, že „nejdražší“ z hlediska spotřebované paměti je I-snímek, P-snímek je znatelně levnější, ale nejziskovější možností pro video je B-snímek.
Časová redundance (mezirámcová predikce)
Podívejme se, jaké máme možnosti, abychom minimalizovali opakování v průběhu času. Tento typ redundance můžeme řešit pomocí metod křížové predikce.
Pokusíme se strávit co nejméně bitů na zakódování sekvence snímků 0 a 1.
Můžeme vyrábět odčítání, jednoduše odečteme snímek 1 od snímku 0. Dostaneme snímek 1, použijeme pouze rozdíl mezi ním a předchozím snímkem, ve skutečnosti pouze zakódujeme výsledný zbytek.
Ale co kdybych vám řekl, že existuje ještě lepší metoda, která používá ještě méně bitů?! Nejprve rozdělme snímek 0 na čistou mřížku skládající se z bloků. A pak se pokusíme porovnat bloky ze snímku 0 se snímkem 1. Jinými slovy, odhadneme pohyb mezi snímky.
Z Wikipedie - kompenzace pohybu bloku
Kompenzace pohybu bloku rozděluje aktuální snímek na nepřekrývající se bloky a vektor kompenzace pohybu hlásí původ bloků (běžná mylná představa je, že předchozí snímek je rozdělen na nepřekrývající se bloky a vektory kompenzace pohybu říkají, kam tyto bloky jdou. Ale ve skutečnosti je to naopak - neanalyzuje se předchozí snímek, ale následující; není jasné, kde se bloky pohybují, ale odkud přišly). Zdrojové bloky se ve zdrojovém rámci obvykle překrývají. Některé algoritmy pro kompresi videa sestavují aktuální snímek z částí ani ne jednoho, ale několika dříve přenesených snímků.
Během procesu hodnocení vidíme, že se míček pohnul z (x= 0, y=25) až (x= 6, y=26), hodnoty x и y určit vektor pohybu. Dalším krokem, který můžeme udělat pro zachování bitů, je zakódovat pouze rozdíl pohybových vektorů mezi poslední polohou bloku a předpovězenou pozicí, takže konečný pohybový vektor bude (x=6-0=6, y=26-25=1 ).
V reálné situaci by se tento míček rozdělil na n bloky, ale to na podstatě věci nic nemění.
Объекты в кадре перемещаются в трёх измерениях, поэтому при движении шарика он может стать визуально меньше (или больше, если движется в сторону зрителя). Это нормально, что не будет идеального соответствия между блоками. Вот совмещенный вид нашей оценки и реальной картины.
Ale vidíme, že když použijeme odhad pohybu, je pro kódování znatelně méně dat, než když použijeme jednodušší metodu výpočtu delty mezi snímky.
Jak by vypadala skutečná kompenzace pohybu
Tato technika se aplikuje na všechny bloky najednou. Často bude naše podmíněná pohyblivá koule rozdělena do několika bloků najednou.
Pomocí těchto pojmů si můžete sami vyzkoušet jupyter.
Chcete-li vidět vektory pohybu, můžete vytvořit externí predikční video pomocí ffmpeg.
Můžete také použít Intel Video Pro Analyzer (je to placené, ale existuje bezplatná zkušební verze, která je omezena pouze na prvních deset snímků).
Prostorová redundance (interní předpověď)
Pokud analyzujeme každý snímek ve videu, najdeme mnoho vzájemně propojených oblastí.
Pojďme si projít tento příklad. Tato scéna se skládá převážně z modré a bílé barvy.
Toto je I-rám. Nemůžeme vzít předchozí snímky pro predikci, ale můžeme je komprimovat. Pojďme zakódovat výběr červeného bloku. Když se podíváme k jeho sousedům, všimneme si, že kolem něj panují nějaké barevné trendy.
Předpokládáme, že barvy se v rámu šíří vertikálně. Což znamená, že barva neznámých pixelů bude obsahovat hodnoty svých sousedů.
Такой прогноз может оказаться и неверным. Именно по этой причине нужно применить этот метод ( внутренний прогноз), а затем ещё вычесть реальные значения. Это даст нам остаточный блок, что приведёт к гораздо более сжатой матрице по сравнению с оригиналом.
Pokud si chcete procvičit interní predikce, můžete si vytvořit video makrobloků a jejich predikcí pomocí ffmpeg. Abyste pochopili význam každé barvy bloku, budete si muset přečíst dokumentaci ffmpeg.
Nebo můžete použít Intel Video Pro Analyzer (jak jsem uvedl výše, zkušební verze zdarma je omezena na prvních 10 snímků, ale to vám bude zpočátku stačit).