Igasugune raster pilt saab esitada kujul kahemõõtmeline maatriks. Mis puutub värvidesse, siis saab ideed arendada, vaadates pilti kui kolmemõõtmeline maatriks, milles kasutatakse iga värvi kohta andmete salvestamiseks lisamõõtmeid.
Kui käsitleda lõplikku värvi kombinatsioonina nn. põhivärvid (punane, roheline ja sinine), defineerime oma kolmemõõtmelises maatriksis kolm tasapinda: esimene punase jaoks, teine roheline ja viimane sinise jaoks.
Nimetame selle maatriksi iga punkti piksliks (pildielemendiks). Iga piksel sisaldab teavet iga värvi intensiivsuse kohta (tavaliselt arvväärtusena). Näiteks, punane piksel tähendab, et see sisaldab 0 rohelist, 0 sinist ja maksimaalselt punast. Roosa piksel saab moodustada kolme värvi kombinatsiooni abil. Kasutades numbrivahemikku 0 kuni 255, on roosa piksel määratletud kui Punane = 255, Roheline = 192 и Sinine = 203.
Alternatiivsed viisid värvilise pildi kodeerimiseks
Pildi moodustavate värvide esitamiseks on palju muid mudeleid. Näiteks võite kasutada indekseeritud paletti, mis nõuab iga piksli esitamiseks ainult ühte baiti, mitte kolme, mida RGB-mudeli kasutamisel nõutakse. Sellises mudelis on võimalik iga värvi kujutamiseks kasutada 2D-maatriksi asemel 3D-maatriksit. See säästab mälu, kuid annab väiksema värvigamma.
RGB
Näiteks vaadake seda pilti allpool. Esimene nägu on täielikult maalitud. Teised on punased, rohelised ja sinised tasapinnad (vastavate värvide intensiivsused on näidatud halltoonides).
Näeme, et originaalis on punased toonid samades kohtades, kus on täheldatud teise näo heledamaid kohti. Kui sinise panust on peamiselt näha vaid Mario silmades (viimane nägu) ja tema riietuse elementides. Pange tähele, kus kõik kolm värvitasandit annavad kõige vähem panuse (piltide tumedaimad osad) – Mario vuntsid.
Iga värvi intensiivsuse salvestamiseks on vaja teatud arvu bitte - seda kogust nimetatakse biti sügavus. Oletame, et värvitasandi kohta kulutatakse 8 bitti (väärtuse 0 kuni 255 alusel). Siis on meil värvisügavus 24 bitti (8 bitti * 3 R/G/B tasapinda).
Pildi teine omadus on luba, mis on pikslite arv ühes mõõtmes. Sageli tähistatakse kui laius × kõrgus, nagu alloleval 4x4 näidispildil.
Teine omadus, millega me piltide/videotega töötades tegeleme, on kuvasuhe, mis kirjeldab normaalset proportsionaalset suhet pildi või piksli laiuse ja kõrguse vahel.
Kui nad ütlevad, et teatud filmi või pildi suurus on 16 x 9, siis nad tavaliselt mõtlevad ekraani kuvasuhe (KUID - alates Ekraani kuvasuhe). Kuid mõnikord võib üksikute pikslite kuju olla erinev - antud juhul räägime sellest pikslite suhe (PAR - alates Pikslite kuvasuhe).
Märkus perenaisele: DVD vastab DAR 4 kuni 3
Kuigi tegelik DVD eraldusvõime on 704x480, säilitab see siiski 4:3 kuvasuhte, kuna PAR on 10:11 (704x10 / 480x11).
Ja lõpuks saame kindlaks teha video nagu jada n perioodi raamid aeg, mida võib pidada lisamõõtmeks. A n siis on kaadrisagedus või kaadrite arv sekundis (FPS - alates Kaadrit sekundis).
Video kuvamiseks vajalik bittide arv sekundis on selle edastuskiirus - bitikiirus.
bitikiirus = laius * kõrgus * biti sügavus * kaadrit sekundis
Näiteks 30 kaadrit/s, 24 b/s, 480 x 240 video jaoks oleks vaja 82,944,000 82,944 30 b/s või 480 240 Mb/s (24 x XNUMX x XNUMX x XNUMX), kuid seda siis, kui pakkimismeetodit ei kasutata.
Kui edastuskiirus peaaegu konstantne, siis nimetatakse seda püsiv edastuskiirus (CBR - alates konstantne bitikiirus). Kuid see võib ka varieeruda, antud juhul nimetatakse seda muutuv edastuskiirus (VBR - alates muutuv bitikiirus).
See graafik näitab piiratud VBR-i, kus täiesti tumeda kaadri puhul ei lähe liiga palju bitte raisku.
Insenerid töötasid algselt välja meetodi videokuva tajutava kaadrisageduse kahekordistamiseks ilma täiendavat ribalaiust kasutamata. See meetod on tuntud kui põimitud video; Põhimõtteliselt saadab see pool ekraani esimeses "kaadris" ja teise poole järgmises "kaadris".
Praegu renderdatakse stseene enamasti kasutades progressiivse skaneerimise tehnoloogiad. See on liikuvate kujutiste kuvamise, salvestamise või edastamise meetod, kus iga kaadri kõik jooned tõmmatakse järjestikku.
Noh! Nüüd oleme teadlikud, kuidas pilti esitatakse digitaalselt, kuidas on paigutatud selle värvid, mitu bitti sekundis kulutame video näitamiseks, kui bitikiirus on konstantne (CBR) või muutuv (VBR). Me teame antud eraldusvõimet antud kaadrisagedust kasutades, oleme tuttavad paljude teiste terminitega, nagu interlaced video, PAR ja mõned teised.
Üleliigsuse eemaldamine
On teada, et ilma tihendamiseta videot ei saa normaalselt kasutada. Tunnine video eraldusvõimega 720p ja 30 kaadrit sekundis võtaks 278 GB. Selle väärtuseni saame korrutades 1280 x 720 x 24 x 30 x 3600 (laius, kõrgus, bitid piksli kohta, FPS ja aeg sekundites).
Kasutama kadudeta pakkimisalgoritmid, nagu DEFLATE (kasutatakse PKZIP-is, Gzipis ja PNG-s), ei vähenda vajalikku ribalaiust piisavalt. Peame otsima muid viise video tihendamiseks.
Selleks saate kasutada meie visiooni funktsioone. Me oskame paremini eristada heledust kui värvi. Video on järjestikuste piltide seeria, mis aja jooksul korduvad. Sama stseeni külgnevate kaadrite vahel on väikesed erinevused. Lisaks sisaldab iga kaader palju alasid, mis kasutavad sama (või sarnast) värvi.
Värv, heledus ja meie silmad
Meie silmad on heleduse kui värvi suhtes tundlikumad. Seda näete seda pilti vaadates ise.
Kui te seda pildi vasakus pooles ei näe, siis ruutude värvid A и B on tegelikult samad, siis on see normaalne. Meie aju sunnib meid pöörama rohkem tähelepanu valgusele ja varjule, mitte värvile. Paremal pool määratud ruutude vahel on sama värvi hüppaja – nii me (st meie aju) teeme kergesti kindlaks, et tegelikult on need sama värvi.
Vaatame (lihtsustatult), kuidas meie silmad töötavad. Silm on keeruline organ, mis koosneb paljudest osadest. Kõige rohkem huvitavad meid aga käbid ja vardad. Silm sisaldab umbes 120 miljonit varrast ja 6 miljonit koonust.
Vaatleme värvi ja heleduse tajumist teatud silma osade eraldi funktsioonidena (tegelikult on kõik mõnevõrra keerulisem, kuid me lihtsustame seda). Varrasrakud vastutavad peamiselt heleduse eest, koonusrakud aga värvi eest. Koonused jagunevad kolme tüüpi, olenevalt neis sisalduvast pigmendist: S-koonused (sinine), M-koonused (roheline) ja L-koonused (punased).
Kuna meil on palju rohkem vardaid (heledust) kui koonuseid (värvi), võime järeldada, et oleme võimelised eristama üleminekuid tumeda ja heleda vahel kui värve.
Kontrastsuse tundlikkuse omadused
Eksperimentaalpsühholoogia ja paljude teiste valdkondade teadlased on välja töötanud palju inimnägemise teooriaid. Ja ühte neist nimetatakse kontrastitundlikkuse funktsioonid. Need on seotud ruumilise ja ajalise valgustusega. Lühidalt öeldes on küsimus selles, kui palju muudatusi on vaja teha, enne kui vaatleja neid märkab. Pange tähele sõna "funktsioon" mitmust. Selle põhjuseks on asjaolu, et saame mõõta kontrastitundlikkuse funktsioone mitte ainult mustvalgete, vaid ka värviliste piltide puhul. Nende katsete tulemused näitavad, et enamikul juhtudel on meie silmad tundlikumad heleduse kui värvi suhtes.
Kuna me teame, et oleme pildi heleduse suhtes tundlikumad, võime proovida seda fakti kasutada.
Värvimudel
Mõtlesime natuke välja, kuidas RGB-skeemi abil värvipiltidega töötada. On ka teisi mudeleid. On olemas mudel, mis eraldab heleduse kroomist ja seda tuntakse kui YCbCr. Muide, on ka teisi mudeleid, mis teevad sarnase jaotuse, kuid me käsitleme ainult seda.
Selles värvimudelis Y on heleduse esitus ja kasutab ka kahte värvikanalit: Cb (rikas sinine) ja Cr (rikas punane). YCbCr saab tuletada RGB-st ja võimalik on ka pöördkonversioon. Seda mudelit kasutades saame luua täisvärvilisi pilte, nagu näeme allpool:
Teisendage YCbCr ja RGB vahel
Keegi vaidleb vastu: kuidas on võimalik saada kõik värvid, kui rohelist ei kasutata?
Sellele küsimusele vastamiseks teisendame RGB-d YCbCr-ks. Kasutame standardis kasutusele võetud koefitsiente BT.601, mida üksus soovitas ITU-R. See jaotus määrab digitaalvideo standardid. Näiteks: mis on 4K? Milline peaks olema kaadrisagedus, eraldusvõime, värvimudel?
Kõigepealt arvutame heleduse. Kasutame ITU pakutud konstante ja asendame RGB väärtused.
Y = 0.299R + 0.587G + 0.114B
Pärast heleduse saavutamist eraldame sinise ja punase värvi:
Cb = 0.564(B - Y)
Cr = 0.713(R - Y)
Ja YCbCr abil saame ka tagasi teisendada ja isegi roheliseks saada:
R = Y + 1.402Cr
B = Y + 1.772Cb
G = Y - 0.344Cb - 0.714Cr
Tavaliselt kasutavad kuvarid (monitorid, telerid, ekraanid jne) ainult RGB mudelit. Kuid seda mudelit saab korraldada erineval viisil:
Värvi alamproovide võtmine
Kujutise puhul, mis on kujutatud heleduse ja värvilisuse kombinatsioonina, saame teabe valikulise eemaldamise teel ära kasutada inimese visuaalse süsteemi suuremat tundlikkust heleduse kui värvilisuse suhtes. Kroomi alamdiskreetimine on piltide kodeerimise meetod, kasutades värvide puhul väiksemat eraldusvõimet kui heleduse jaoks.
Kui palju on lubatud värvide eraldusvõimet vähendada?! Selgub, et juba on olemas mõned diagrammid, mis kirjeldavad, kuidas käsitleda eraldusvõimet ja liitmist (Resulting Color = Y + Cb + Cr).
Neid skeeme tuntakse kui alladiskreetimissüsteemid ja neid väljendatakse 3-kordse suhtena - a:x:y, mis määrab heleduse ja värvide erinevuse signaalide näidiste arvu.
a — horisontaalne proovivõtustandard (tavaliselt 4) x — värvinäidiste arv esimeses pikslireas (horisontaalne eraldusvõime võrreldes a) y — värvinäidiste muutuste arv esimese ja teise pikslirea vahel.
Erandiks on 4:1:0, pakkudes igas 4x4 heleduse eraldusvõimega plokis ühe värvinäidise.
Kaasaegsetes koodekites kasutatavad tavalised skeemid:
4:4:4 (allavõtit ei toimu)
4:2:2
4:1:1
4:2:0
4:1:0
3:1:1
YCbCr 4:2:0 – liitmise näide
Siin on ühendatud pilt, kasutades YCbCr 4:2:0. Pange tähele, et kulutame ainult 12 bitti piksli kohta.
Selline näeb välja sama pilt, mis on kodeeritud põhiliste värvide alamdisamplimise tüüpidega. Esimene rida on viimane YCbCr, alumine rida näitab kroma eraldusvõimet. Väga korralikud tulemused, arvestades kerget kvaliteedilangust.
Mäletate, kui loendasime 278 GB salvestusruumi tunnipikkuse videofaili salvestamiseks eraldusvõimega 720p ja 30 kaadrit sekundis? Kui kasutame YCbCr 4:2:0, siis see suurus väheneb poole võrra - 139 GB. Siiani on see vastuvõetavast tulemusest veel kaugel.
YCbCr histogrammi saate ise hankida FFmpegi abil. Sellel pildil domineerib sinine punase üle, mis on histogrammil endal selgelt näha.
Värv, heledus, värvigamma – videoülevaade
Soovitame vaadata seda suurepärast videot. See selgitab, mis on heledus, ja üldiselt on kõik punktid punktidega ё heleduse ja värvi kohta.
Raami tüübid
Liigume edasi. Proovime ajalise liiasuse kõrvaldada. Kuid kõigepealt määratleme mõned põhiterminoloogia. Oletame, et meil on film kiirusega 30 kaadrit sekundis, siin on selle esimesed 4 kaadrit:
Kaadrites näeme palju kordusi: näiteks sinine taust, mis kaadrist kaadrisse ei muutu. Selle probleemi lahendamiseks võime need abstraktselt liigitada kolme tüüpi raamidesse.
I-raam (Intro raam)
I-raam (võrdlusraam, võtmeraam, siseraam) on iseseisev. Olenemata sellest, mida soovite visualiseerida, on I-kaader sisuliselt staatiline foto. Esimene kaader on tavaliselt I-kaader, kuid me jälgime regulaarselt I-kaadreid isegi mitte esimeste kaadrite hulgas.
P-raam (Predigeeritud raam)
P-kaader (ennustav kaader) kasutab ära asjaolu, et peaaegu alati saab praegust pilti taasesitada eelmise kaadri abil. Näiteks teises freimis on ainsaks muudatuseks palli edasiliikumine. Kaadri 2 saame lihtsalt kaadrit 1 veidi muutes, kasutades ainult nende kaadrite erinevust. Kaadri 2 koostamiseks viitame eelmisele kaadrile 1.
←
B-raam (Bi-ennustav raam)
Aga lingid mitte ainult mineviku, vaid ka tulevaste kaadrite juurde, et pakkuda veelgi paremat tihendamist?! See on põhimõtteliselt B-raam (kahesuunaline kaader).
← →
Vahepealne taganemine
Neid raamitüüpe kasutatakse parima võimaliku tihenduse tagamiseks. Kuidas see juhtub, vaatame järgmises jaotises. Praeguseks olgu öeldud, et kulutatud mälu poolest on kõige “kallim” I-kaader, P-kaader on märgatavalt odavam, kuid video jaoks on kõige tulusam B-kaader.
Ajaline liiasus (kaadritevaheline ennustus)
Vaatame, millised võimalused on meil aja jooksul korduste minimeerimiseks. Seda tüüpi koondamise saame lahendada ristennustusmeetodite abil.
Püüame kulutada võimalikult vähe bitte, et kodeerida kaadrite 0 ja 1 jada.
Saame toota lahutamine, me lihtsalt lahutame kaadri 1 kaadrist 0. Saame kaadri 1, kasutame ainult selle ja eelmise kaadri vahet, tegelikult kodeerime ainult saadud jäägi.
Aga mis siis, kui ma ütleksin teile, et on veel parem meetod, mis kasutab veelgi vähem bitte?! Kõigepealt murrame raami 0 selgeks plokkidest koosnevaks ruudustikuks. Ja siis proovime kaadrist 0 pärit plokke sobitada kaadriga 1. Teisisõnu hindame liikumist kaadrite vahel.
Vikipeediast - ploki liikumise kompenseerimine
Ploki liikumise kompensatsioon jagab praeguse kaadri mittekattuvateks plokkideks ja liikumise kompensatsiooni vektor annab teada plokkide päritolu (tavaline eksiarvamus on see, et eelmine kaader on jagatud mittekattuvateks plokkideks ja liikumiskompensatsiooni vektorid näitavad, kuhu need plokid lähevad. Kuid tegelikult on see vastupidi - analüüsitakse mitte eelmist kaadrit, vaid järgmist; pole selge, kus plokid liiguvad, vaid kust nad tulid). Tavaliselt kattuvad lähteplokid lähtekaadris. Mõned videotihendusalgoritmid koondavad praeguse kaadri isegi mitte ühe, vaid mitme varem edastatud kaadri osadest.
Hindamisprotsessi käigus näeme, et pall on liikunud (x= 0 y=25) poolt (x= 6 y=26), väärtused x и y määrata liikumisvektorit. Teine samm, mida saame bittide säilitamiseks teha, on kodeerida ainult liikumisvektorite erinevus viimase ploki asukoha ja ennustatud asukoha vahel, nii et lõplik liikumisvektor on (x=6-0=6, y=26-25=1 ).
Reaalses olukorras jaguneks see pall kaheks n blokeerib, kuid see ei muuda asja olemust.
Kaadris olevad objektid liiguvad kolmes dimensioonis, nii et kui pall liigub, võib see muutuda visuaalselt väiksemaks (või suuremaks, kui see liigub vaataja poole). On normaalne, et plokkide vahel ei teki täiuslikku sobivust. Siin on meie hinnangu ja tegeliku pildi kombineeritud vaade.
Kuid me näeme, et kui kasutame liikumise hinnangut, on kodeerimiseks märgatavalt vähem andmeid kui kaadritevahelise delta arvutamiseks lihtsama meetodi kasutamisel.
Kuidas näeks välja tõeline liikumiskompensatsioon
Seda tehnikat rakendatakse kõikidele plokkidele korraga. Sageli jagatakse meie tingimuslikult liikuv pall korraga mitmeks plokiks.
Saate neid mõisteid kasutades ise aimu saada jupyter.
Liikumisvektorite vaatamiseks saate luua välise ennustusvideo, kasutades ffmpeg.
Võite ka kasutada Intel Video Pro analüsaator (see on tasuline, kuid on tasuta prooviperiood, mis on piiratud ainult esimese kümne kaadriga).
Ruumiline liiasus (sisemine prognoos)
Kui analüüsime videos iga kaadrit, leiame palju omavahel seotud alasid.
Vaatame selle näite läbi. See stseen koosneb peamiselt sinisest ja valgest värvist.
See on I-raam. Me ei saa ennustamiseks kasutada eelmisi kaadreid, kuid saame selle tihendada. Kodeerime punase ploki valiku. Kui vaatame selle naabreid, märkame, et selle ümber on teatud värvitrende.
Eeldame, et värvid levivad kaadris vertikaalselt. Mis tähendab, et tundmatute pikslite värv sisaldab selle naabrite väärtusi.
Selline prognoos võib osutuda valeks. Sel põhjusel peate rakendama seda meetodit (sisemine prognoos) ja seejärel lahutama tegelikud väärtused. See annab meile jääkploki, mille tulemuseks on originaaliga võrreldes palju tihendatud maatriks.
Kui soovite sisemiste ennustustega harjutada, saate ffmpeg abil luua makroplokkidest ja nende ennustustest video. Iga ploki värvi tähenduse mõistmiseks peate lugema ffmpegi dokumentatsiooni.
Või võite kasutada Intel Video Pro Analyzerit (nagu ma eespool mainisin, on tasuta prooviversioon piiratud esimese 10 kaadriga, kuid sellest piisab teile alguses).