Del tvÄ:
Vilket raster som helst bild kan representeras som tvÄdimensionell matrisNÀr det gÀller fÀrger kan idén utvecklas vidare genom att betrakta bilden som tredimensionell matris, dÀr ytterligare dimensioner anvÀnds för att lagra data för var och en av fÀrgerna.
Om vi ââbetraktar den slutliga fĂ€rgen som en kombination av de sĂ„ kallade primĂ€rfĂ€rgerna (röd, grön och blĂ„), definierar vi i vĂ„r tredimensionella matris tre plan: det första för rött, det andra för grönt och det sista för blĂ„tt.
Vi kommer att kalla varje punkt i denna matris för en pixel (bildelement). Varje pixel innehÄller information om intensiteten (vanligtvis som ett numeriskt vÀrde) för varje fÀrg. Till exempel, röd pixel betyder att den har 0 grönt, 0 blÄtt och maximalt rött. Pixelrosa kan bildas av en kombination av tre fÀrger. Med ett numeriskt intervall frÄn 0 till 255 definieras en rosa pixel som Röd = 255, Grön = 192 О BlÄ = 203.
Artikeln publicerades med stöd av EDISON.Vi utvecklar , och Àven vi Àr förlovade .
Alternativa metoder för att koda en fÀrgbild
Det finns mÄnga andra modeller för att representera fÀrgerna som utgör en bild. Till exempel kan du anvÀnda en indexerad palett, som bara krÀver en byte för att representera varje pixel, istÀllet för de tre som krÀvs av RGB-modellen. Denna modell kan anvÀnda en 2D-matris istÀllet för en 3D-matris för att representera varje fÀrg. Detta sparar minne, men producerar ett mindre fÀrgomfÄng.

RGB
Titta till exempel pÄ bilden nedan. Den första ytan Àr helt fÀrgad. De andra Àr röda, gröna och blÄ plan (intensiteten hos motsvarande fÀrger visas i grÄskala).

Vi ser att de röda tonerna i originalet kommer att finnas pÄ samma stÀllen dÀr de ljusaste delarna av det andra ansiktet observeras. Medan bidraget frÄn blÄtt huvudsakligen bara kan ses i Marios ögon (det sista ansiktet) och delar av hans klÀder. Observera var alla tre fÀrgplan bidrar minst (de mörkaste delarna av bilderna) - detta Àr Marios mustasch.
Att lagra intensiteten för varje fÀrg krÀver ett visst antal bitar - detta vÀrde kallas bitdjupLÄt oss sÀga att 8 bitar anvÀnds (baserat pÄ vÀrdet frÄn 0 till 255) pÄ ett fÀrgplan. DÄ har vi ett fÀrgdjup pÄ 24 bitar (8 bitar * 3 R/G/B-plan).
En annan egenskap hos bilden Àr att tillstÄnd, vilket Àr antalet pixlar i en dimension. Ofta betecknad som bredd x höjd, som nedan i exempelbilden 4 gÄnger 4.

En annan egenskap vi hanterar nÀr vi arbetar med bilder/videor Àr bildförhÄllande, som beskriver det normala proportionella förhÄllandet mellan bredden och höjden pÄ en bild eller pixel.
NĂ€r folk sĂ€ger att en viss film eller bild Ă€r 16 gĂ„nger 9, menar de vanligtvis bildförhĂ„llande (DAR - frĂ„n BildförhĂ„llande). Ibland kan det dock finnas olika former pĂ„ enskilda pixlar â i det hĂ€r fallet talar vi om pixelförhĂ„llande (PAR - frĂ„n PixelbildförhĂ„llande).


Meddelande till vÀrdinnan: dvd motsvarar DAR 4 till 3
Ăven om den faktiska upplösningen för DVD Ă€r 704Ă480, bibehĂ„ller den fortfarande ett bildförhĂ„llande pĂ„ 4:3 eftersom PAR Ă€r 10:11 (704Ă10 / 480Ă11).
NÄ, Àntligen kan vi avgöra video som en sekvens av n ramar för perioden tid, vilket kan betraktas som en ytterligare dimension. A n dÄ Àr det bildfrekvensen eller antalet bildrutor per sekund (FPS - frÄn Bildrutor per sekund).

Antalet bitar per sekund som krÀvs för att visa en video Àr dess överföringshastighet - bithastighet.
bitrate = bredd * höjd * bitdjup * bildrutor per sekund
Till exempel skulle en video med 30 fps, 24 bitar per pixel och 480x240 krĂ€va 82,944,000 82,944 30 bitar per sekund eller 480 Mbps (240x24xXNUMXxXNUMX) â men det Ă€r om ingen komprimeringsmetod anvĂ€nds.
Om överföringshastigheten nÀstan konstant, dÄ kallas det konstant bithastighet (CBR - frÄn konstant bithastighet). Men det kan ocksÄ variera, i vilket fall det kallas variabel bithastighet (VBR - frÄn variabel bithastighet).
Denna graf visar begrÀnsad VBR dÀr inte alltför mÄnga bitar gÄr till spillo vid en helt mörk bildruta.

Ingenjörer utvecklade ursprungligen en metod för att fördubbla den upplevda bildfrekvensen för en videoskÀrm utan att anvÀnda ytterligare bandbredd. Denna metod Àr kÀnd som sammanflÀtad video; i princip skickar den halva skÀrmen i den första "bildrutan" och den andra hÀlften i nÀsta "bildruta".
Numera görs scenrendering huvudsakligen med hjÀlp av progressiva skanningsteknikerDet Àr en metod för att visa, lagra eller överföra rörliga bilder dÀr alla linjer i varje bildruta ritas sekventiellt.

NÄvÀl! Nu vet vi hur en bild representeras digitalt, hur dess fÀrger Àr arrangerade, hur mÄnga bitar per sekund vi behöver för att visa en video om överföringshastigheten Àr konstant (CBR) eller variabel (VBR). Vi kÀnner till en given upplösning med en given bildhastighet, vi har bekantat oss med mÄnga andra termer, sÄsom sammanflÀtad video, PAR och nÄgra andra.
Ta bort redundans
Det Àr kÀnt att okomprimerad video inte kan anvÀndas normalt. En timmeslÄng video med en upplösning pÄ 720p och en frekvens pÄ 30 bildrutor per sekund skulle ta upp 278 GB. Vi kommer fram till detta vÀrde genom att multiplicera 1280 x 720 x 24 x 30 x 3600 (bredd, höjd, bitar per pixel, FPS och tid i sekunder).
AnvÀnd förlustfria komprimeringsalgoritmer, liksom DEFLATE (anvÀnds i PKZIP, Gzip och PNG), kommer inte att minska den erforderliga bandbredden tillrÀckligt. Du mÄste leta efter andra sÀtt att komprimera video.
För att göra detta kan vi anvÀnda vÄra synfunktioner. Vi Àr bÀttre pÄ att skilja ljusstyrka Àn fÀrger. Video Àr en uppsÀttning bilder som upprepas över tid. Mellan intilliggande bildrutor i samma scen Àr skillnaderna smÄ. Dessutom innehÄller varje bildruta mÄnga omrÄden som anvÀnder samma (eller liknande) fÀrg.
FÀrg, ljusstyrka och vÄra ögon
VÄra ögon Àr mer kÀnsliga för ljusstyrka Àn för fÀrg. Du kan se detta sjÀlv genom att titta pÄ den hÀr bilden.

Om du inte ser att den vÀnstra halvan av bilden har samma fÀrg som rutorna A О B faktiskt Àr desamma, sÄ Àr detta normalt. VÄr hjÀrna fÄr oss att vara mer uppmÀrksamma pÄ ljus och skugga, inte fÀrg. PÄ höger sida mellan de angivna rutorna finns en bygel i samma fÀrg - sÄ vi (dvs. vÄr hjÀrna) kan enkelt avgöra att det faktiskt finns samma fÀrg.
LĂ„t oss ta en (förenklad) titt pĂ„ hur vĂ„ra ögon fungerar. Ăgat Ă€r ett komplext organ som bestĂ„r av mĂ„nga delar. De delar vi Ă€r mest intresserade av Ă€r dock stavarna och tapparna. Ăgat innehĂ„ller cirka 120 miljoner stavar och 6 miljoner tappar.
LÄt oss titta pÄ uppfattningen av fÀrg och ljusstyrka som separata funktioner hos specifika delar av ögat (i verkligheten Àr det lite mer komplicerat Àn sÄ, men vi ska förenkla). Stavceller Àr frÀmst ansvariga för ljusstyrka, medan tappar Àr ansvariga för fÀrg. Tappar delas in i tre typer, beroende pÄ vilket pigment de innehÄller: S-koner (blÄ), M-koner (gröna) och L-koner (röda).
Eftersom vi har mÄnga fler stavar (ljusstyrka) Àn koner (fÀrg) följer det att vi bÀttre kan skilja övergÄngar mellan mörkt och ljust Àn mellan fÀrger.
Funktioner för kontrastkÀnslighet
Forskare inom experimentell psykologi och mÄnga andra omrÄden har utvecklat mÄnga teorier om mÀnsklig syn. En av dem kallas kontrastkÀnslighetsfunktionerDe Àr relaterade till rumslig och tidsmÀssig belysning. Kort sagt handlar det om hur mycket förÀndring som krÀvs innan observatören mÀrker den. Observera pluralformen av ordet "funktion". Detta beror pÄ att vi kan mÀta kontrastkÀnslighetsfunktioner inte bara för svartvita bilder, utan Àven för fÀrgbilder. Resultaten av dessa experiment visar att vÄra ögon i de flesta fall Àr mer kÀnsliga för ljusstyrka Àn för fÀrg.
Eftersom det Àr kÀnt att vi Àr mer kÀnsliga för en bilds ljusstyrka kan vi försöka anvÀnda oss av detta faktum.
FĂ€rgmodell
Vi har gÄtt igenom lite hur man arbetar med fÀrgbilder med hjÀlp av RGB-schemat. Det finns Àven andra modeller. Det finns en modell som skiljer ljusstyrka frÄn fÀrg, och den kallas YCbCrFörresten, det finns andra modeller som gör en liknande uppdelning, men vi kommer bara att betrakta denna.
I denna fĂ€rgmodell Y â Ă€r en representation av ljusstyrka, och tvĂ„ fĂ€rgkanaler anvĂ€nds: Cb (rik blĂ„) och Cr (rikt rött). YCbCr kan hĂ€rledas frĂ„n RGB, och omvĂ€nd transformation Ă€r ocksĂ„ möjlig. Med hjĂ€lp av denna modell kan vi skapa bilder i fullfĂ€rg, som vi ser nedan:

Konvertering mellan YCbCr och RGB
NÄgon kommer att invÀnda: hur Àr det möjligt att fÄ alla fÀrger om grönt inte anvÀnds?
För att besvara denna frÄga kommer vi att omvandla RGB till YCbCr. Vi kommer att anvÀnda koefficienterna som antagits i standarden. BT.601, vilket rekommenderades av enheten ITU-RDenna indelning definierar standarder för digital video. Till exempel: vad Àr 4K? Vilken bildfrekvens, upplösning och fÀrgmodell bör vara?
LÄt oss först berÀkna ljusstyrkan. Vi anvÀnder konstanterna som föreslagits av ITU och ersÀtter RGB-vÀrdena.
Y = 0.299R + 0.587G + 0.114B
NÀr vi har ljusstyrkan separerar vi de blÄ och röda fÀrgerna:
Cb = 0.564(B - Y)
Cr = 0.713(R - Y)
Och vi kan ocksÄ konvertera tillbaka och till och med bli gröna med hjÀlp av YCbCr:
R = Y + 1.402Cr
B = Y + 1.772Cb
G = Y - 0.344Cb - 0.714Cr
Vanligtvis anvÀnder skÀrmar (monitorer, TV-apparater, skÀrmar etc.) endast RGB-modellen. Men den hÀr modellen kan organiseras pÄ olika sÀtt:

Kromasubsampling
Med en bild representerad som en kombination av luminans och krominans kan vi utnyttja det mÀnskliga visuella systemets större kÀnslighet för luminans Àn för krominans genom att selektivt ta bort information. Kromasubsampling Àr en metod för att koda bilder med lÀgre upplösning för krominans Àn för luminans.

Hur mycket Àr det acceptabelt att minska fÀrgupplösningen?! Det visar sig att det redan finns nÄgra scheman som beskriver hur man hanterar upplösningen och sammanfogningen (Slutlig fÀrg = Y + Cb + Cr).
Dessa system Àr kÀnda som delprovtagningssystem och uttrycks som ett 3-faldigt förhÄllande - a:x:y, vilket bestÀmmer antalet sampel av luminans- och fÀrgskillnadssignaler.
a â horisontell provtagningsstandard (vanligtvis lika med 4)
x â antalet fĂ€rgprover i den första raden med pixlar (horisontell upplösning i förhĂ„llande till a)
y â antalet Ă€ndringar i fĂ€rgprover mellan den första och andra raden med pixlar.
Undantaget Àr 4:1:0, vilket ger ett fÀrgprov i varje 4 x 4 luma-upplösningsblock.
Vanliga scheman som anvÀnds i moderna codecs:
- 4:4:4 (utan delprovtagning)
- 4:2:2
- 4:1:1
- 4:2:0
- 4:1:0
- 3:1:1
YCbCr 4:2:0 - exempel pÄ sammanslagning
HÀr Àr ett sammanfogat bildfragment med YCbCr 4:2:0. Observera att vi bara anvÀnder 12 bitar per pixel.
SÄ hÀr ser samma bild ut kodad med de viktigaste typerna av kroma-subsampling. Den första raden Àr den slutliga YCbCr, den nedre raden visar kroma-upplösningen. Ganska hyfsade resultat, med tanke pÄ den lilla kvalitetsförlusten.

Kommer du ihĂ„g hur vi berĂ€knade 278 GB diskutrymme för att lagra en timslĂ„ng videofil med en upplösning pĂ„ 720p och 30 bildrutor per sekund? Om vi ââanvĂ€nder YCbCr 4:2:0 kommer denna storlek att minskas med hĂ€lften - 139 GB. Hittills Ă€r det fortfarande lĂ„ngt ifrĂ„n ett acceptabelt resultat.
Du kan sjÀlv fÄ YCbCr-histogrammet med hjÀlp av FFmpeg. I den hÀr bilden Àr blÄtt mer dominant Àn rött, vilket syns tydligt i sjÀlva histogrammet.

FÀrg, ljusstyrka, fÀrgskala - videorecension
Jag rekommenderar att du tittar pĂ„ den hĂ€r grymma videon. Den förklarar vad ljusstyrka Ă€r och sĂ€tter punkterna i alla I:n och korsar alla T:n. Ń om ljusstyrka och fĂ€rg.
Ramtyper
LÄt oss gÄ vidare. LÄt oss försöka eliminera tidsredundans. Men först, lÄt oss definiera lite grundlÀggande terminologi. LÄt oss sÀga att vi har en film med 30 bildrutor per sekund, hÀr Àr dess första 4 bildrutor:

Vi kan se mycket upprepning i bildrutorna: till exempel Àndras inte den blÄ bakgrunden frÄn bildruta till bildruta. För att lösa detta problem kan vi abstrakt klassificera dem i tre typer av bildrutor.
I-ram (Intro-ram)
En I-bildruta (referensbildruta, nyckelbildruta, innerbildruta) Àr fristÄende. Oavsett vad som behöver visualiseras Àr en I-bildruta i huvudsak ett statiskt fotografi. Den första bilden Àr vanligtvis en I-bildruta, men vi ser regelbundet I-bildrutor bland bildrutor som Àr lÄngt ifrÄn den första.

P-ram (P(förvrÀngd ram)
P-bildruta (prediktiv bildruta) utnyttjar det faktum att nÀstan alltid den aktuella bilden kan reproduceras med hjÀlp av den föregÄende bildrutan. Till exempel, i bildruta 2 Àr den enda förÀndringen att bollen rör sig framÄt. Vi kan fÄ bildruta 1 genom att helt enkelt modifiera bildruta 2 nÄgot, och endast anvÀnda skillnaden mellan de tvÄ bildrutorna. För att konstruera bildruta 1 hÀnvisar vi till den föregÄende bildrutan XNUMX.
â 
B-ram (Bi-prediktiv ram)
Vad sÀgs om att referera inte bara till tidigare bildrutor, utan Àven till framtida bildrutor, för att ge Ànnu bÀttre komprimering?! Detta Àr i grunden en B-bildruta (dubbelriktad bildruta).
â
â 
Mellanslutsats
Dessa bildrutetyper anvÀnds för att ge bÀsta möjliga komprimering. Vi ska titta pÄ hur detta sker i nÀsta avsnitt. Observera för tillfÀllet att den "dyraste" minnesmÀssigt Àr I-bildrutan, P-bildrutan Àr betydligt billigare och det mest lönsamma alternativet för video Àr B-bildrutan.

Temporal redundans (interframe-prediktion)
LÄt oss övervÀga vilka möjligheter vi har att minimera upprepningar över tid. Vi kommer att lösa denna typ av redundans med hjÀlp av ömsesidiga prognosmetoder.
LÄt oss försöka anvÀnda sÄ fÄ bitar som möjligt för att koda en sekvens av bildrutorna 0 och 1.

Vi kan producera subtraktion, subtraherar vi helt enkelt bildruta 1 frÄn bildruta 0. Vi fÄr bildruta 1, men vi anvÀnder bara skillnaden mellan den och föregÄende bildruta, och i sjÀlva verket kodar vi bara den resulterande resten.

Men tÀnk om jag sa att det fanns en Ànnu bÀttre metod som anvÀnder Ànnu fÀrre bitar?! LÄt oss först dela upp bildruta 0 i ett snyggt rutnÀt av block. Sedan försöker vi matcha blocken frÄn bildruta 0 till bildruta 1. Med andra ord, lÄt oss uppskatta rörelsen mellan bildrutorna.
FrÄn Wikipedia - blockrörelsekompensation
Blockrörelsekompensation delar upp den aktuella bildrutan i icke-överlappande block och rörelsekompensationsvektorn anger var blocken kommer ifrÄn (en vanlig missuppfattning Àr att föregÄende Bildrutan Àr uppdelad i block som inte skÀr varandra, och rörelsekompensationsvektorerna visar var dessa block rör sig. Faktum Àr att det motsatta Àr sant - inte den föregÄende bildrutan analyseras, utan nÀsta, det tas reda pÄ inte var blocken rör sig, utan var de kom ifrÄn. Vanligtvis överlappar de ursprungliga blocken den ursprungliga bildrutan. Vissa videokomprimeringsalgoritmer sÀtter ihop den aktuella bildrutan frÄn delar av inte ens en, utan flera tidigare överförda bildrutor samtidigt.

Under utvÀrderingsprocessen ser vi att bollen har rört sig frÄn (x= 0, y=25) pÄ (x= 6, y=26), vÀrden x О y definiera rörelsevektorn. Ett annat steg vi kan ta för att spara bitar Àr att endast koda rörelsevektorskillnaden mellan den sista blockpositionen och den förutspÄdda, sÄ den slutliga rörelsevektorn blir (x=6-0=6, y=26-25=1).
I en verklig situation skulle denna boll delas in i n block, men detta förÀndrar inte sakens kÀrna.
Objekt i bilden rör sig i tre dimensioner, sÄ nÀr bollen rör sig kan den verka mindre (eller större om den rör sig mot betraktaren). Det Àr normalt att det inte blir en perfekt matchning mellan blocken. HÀr Àr en sammansatt vy av vÄr uppskattning och den verkliga varan.

Men vi ser att nÀr vi anvÀnder rörelseestimering finns det betydligt mindre data för kodning Àn nÀr vi anvÀnder en enklare metod för att berÀkna deltat mellan bildrutor.

Hur kommer verklig rörelsekompensation att se ut?
Denna teknik tillÀmpas pÄ alla block samtidigt. Ofta delas vÄr villkorliga rörliga boll upp i flera block samtidigt.

Du kan sjÀlv uppleva dessa koncept med hjÀlp av .
För att se rörelsevektorerna kan du skapa en video med extern prediktion med hjÀlp av .

Du kan ocksÄ anvÀnda (det Àr betalt, men det finns en gratis provversion som Àr begrÀnsad till endast de första tio bildrutorna).

Spatial redundans (intern prediktion)
Om vi ââanalyserar varje bildruta i videon hittar vi mĂ„nga sammankopplade omrĂ„den.

LÄt oss gÄ igenom det hÀr exemplet. Den hÀr scenen Àr mestadels blÄ och vit.

Detta Ă€r en I-frame. Vi kan inte anvĂ€nda tidigare frames för prediktion, men vi kan komprimera den. LĂ„t oss koda markeringen av det röda blocket. Om vi ââtittar pĂ„ dess grannar mĂ€rker vi att det finns vissa fĂ€rgtrender runt det.

Vi antar att bildrutans fÀrger Àr vertikalt fördelade. Vilket innebÀr att fÀrgen pÄ okÀnda pixlar kommer att innehÄlla vÀrdena för dess grannar.

Denna förutsÀgelse kan ocksÄ vara felaktig. Det Àr dÀrför vi behöver tillÀmpa denna metod (intern förutsÀgelse) och sedan subtrahera de verkliga vÀrdena. Detta ger oss ett residualblock, vilket resulterar i en mycket mer komprimerad matris jÀmfört med originalet.

Om du vill öva med intraprediktioner kan du skapa en video med makroblock och deras prediktioner med hjÀlp av ffmpeg. För att förstÄ betydelsen av varje blockfÀrg mÄste du lÀsa ffmpeg-dokumentationen.

Eller sÄ kan du anvÀnda Intel Video Pro Analyzer (som jag nÀmnde ovan Àr den kostnadsfria testversionen begrÀnsad till de första 10 bildrutorna, men det borde rÀcka för dig till en början).

Del tvÄ:
KĂ€lla: will.com



