Teine osa:
Iga rasterpilt vÔib olla esitatud kahemÔÔtmelise maatriksina . Kui rÀÀkida vÀrvide kohta, siis ideed saab arendada, vaadates pilti kuikolmemÔÔtmelist maatriksit , kus lisamÔÔtmeid kasutatakse iga vÀrvi andmete salvestamiseks.Kui kÀsitleda lÔppvÀrvi kui kombinatsiooni nn pÔhivÀrvidest (punane, roheline ja sinine), mÀÀratleme meie kolmemÔÔtmelises maatriksis kolm tasandit: esimene punasele, teine rohelisele ja viimane sinisele.
Kutsume seda maatriksi igat punkti piksliks (pildi elemendiks). Iga piksel sisaldab teavet iga vÀrvi intensiivsuse kohta (tavaliselt numbrilise vÀÀrtusena). NÀiteks
punane piksel tÀhendab, et sellel on 0 rohelist, 0 sinist ja maksimaalne punane. Roosa piksel vÔib olla moodustatud kolme vÀrvi kombinatsiooni abil. Kasutades numbrilist vahemikku 0 kuni 255, mÀÀratletakse roosa piksel kui Punane = 255 Roheline = 192, Sinine = 203 ja Artikkel on avaldatud EDISONi toetusel..
ArendameArendame , samuti tegeleme .
Alternatiivsed meetodid vÀrvipildi kodeerimiseks
Kuvamiseks on palju muid mudelite olemas, mis kirjeldavad vĂ€rve pildis. NĂ€iteks vĂ”ib kasutada indekseeritud paletti, kus iga piksel on esindatud ĂŒhe baitiga, vĂ”rreldes kolme baitiga, mis on vajalik RGB-mudelis. Sellises mudelis vĂ”ib iga vĂ€rvi esitlemiseks kasutada 2D-matrixit 3D-matriisi asemel. See sÀÀstab mĂ€lu, kuid pakub vĂ€iksemat vĂ€rvivalikut.

RGB
NĂ€iteks vaadake allolevat pilti. Esimene joonis on tĂ€ielikult vĂ€rvitud. ĂlejÀÀnud on punased, rohelised ja sinised tasandid (vastavate vĂ€rvide intensiivsus on esitatud halli skaala jĂ€rgi).

NĂ€eme, et punase tooni varjundid originaalis asuvad samades kohtades, kus on nĂ€ha teise nĂ€o eredamad osad. Samas on sinise vĂ€rvi panus peamiselt nĂ€htav ainult Mario silmades (viimane nĂ€gu) ja tema riiete elementides. Pange tĂ€hele, kuhu kĂ”ik kolm vĂ€rvitegemist annavad kĂ”ige vĂ€hem panust (tumedamad osad piltidel) â see on Mario vuntsides.
Iga vĂ€rvi intensiivsuse salvestamiseks on vajalik kindel arv bitte â seda nimetatakse bittide sĂŒgavuseks. Oletame, et kulutatakse 8 bitti (vÀÀrtusest 0 kuni 255) ĂŒhe vĂ€rvitegemise kohta. Sel juhul on meil vĂ€rvisĂŒgavus 24 bitti (8 bitti * 3 R/G/B ette).
Teine omadus, millega piltidega tegeledes kokku puutume, on eraldusvĂ”ime, mis esindab pikslite arvu ĂŒhes mÔÔtmes. Sageli tĂ€histatakse seda kui laius Ă kĂ”rgus, nagu alloleval 4x4 pildinĂ€idisel.

Veel ĂŒks omadus, millega me töötades pilte/ videotega kokku puutume, on kuvasuhe, mis kirjeldab tavalist proportsionaalset seost pildi vĂ”i piksli laiuse ja kĂ”rguse vahel.
Kui rÀÀgitakse, et mĂ”ne filmi vĂ”i pildi suurus on 16:9, siis tavaliselt mĂ”eldakse ekraani kuvasuhet (DAR â lĂŒhend Display Aspect Ratio). Siiski vĂ”ivad eraldi pikslite vormid olla erinevad â sel juhul rÀÀgime pikslisuhtest (PAR â lĂŒhend Pixel Aspect Ratio).


KööginÔustajale tÀhelepanekuks: DVD vastab DAR 4:3
Kuigi DVD reaalne resolutsioon on 704Ă480, sĂ€ilitab see siiski 4:3 kuvasuhte, kuna PAR vÀÀrtus on 10:11 (704Ă10 / 480Ă11).
Ja lĂ”puks saame mÀÀratleda video ka kui jĂ€rjestikuste n kaadrite seeriat ajaĂŒles mÔÔtmiseks, mida vĂ”ib pidada tĂ€iendavaks mÔÔtmiseks. Ning n see on ka kaadrisagedus ehk kaadrite arv sekundis (FPS â lĂŒhend Frames per Second).

BitimÀÀr, mis on vajalik video esitamiseks, on selle ĂŒlekandekiirus â bitrate.
bitrate = laius * kĂ”rgus * bit sĂŒgavus * kaadreid sekundis
NĂ€iteks, video jaoks 30 kaadrit sekundis, 24 bitti pikseli kohta ja resolutsiooniga 480Ă240 on vajalik 82,944,000 bitti sekundis vĂ”i 82,944 Mbit/s (30x480x240x24) â aga see on juhul, kui ei kasutata ĂŒhtegi tihendamise meetodit.
Kui ĂŒlekandekiirus on peaaegu konstantne, siis nimetatakse seda konstantseks ĂŒlekandekiirus (CBR â lĂŒhend constant bit rate). Kuid see vĂ”ib ka varieeruda, sel juhul nimetatakse seda muutuvaks andmeedastuskiirus (VBR â lĂŒhend variable bit rate).
See graafik nÀitab piiratud VBR-i, kui tÀielikult tumeda kaadri puhul ei kulutata liiga palju bitte.

Alguses töötasid insenerid vÀlja meetodi, mis kahekordistab tajutavat videodisplei kaadrisagedust ilma tÀiendava ribalaiuse kasutamiseta. See meetod on tuntud kui vÀljakudekad video; pÔhimÔtteliselt saadab see poole ekraanist esimeses "kaadris" ja teise poole jÀrgmisel "kaadris."
Praegu toimub stseenide visualiseerimine peamiselt progressiivse skaneerimise tehnoloogia. See on meetod liikuvate piltide kuvamiseks, sÀilitamiseks vÔi edastamiseks, kus iga kaadri kÔik read joonistatakse jÀrjestikuseid.

NĂŒĂŒd oleme kursis, kuidas pilt digitaalsetes vormides esitatakse, kuidas on korraldatud selle vĂ€rvid ja kui palju bitti sekundis kulutame video nĂ€itamiseks, olgu see siis pidev (CBR) vĂ”i muutuv (VBR) edastuskiirus. Teame mÀÀratud eraldusvĂ”imet koos mÀÀratud kaadrisagedusega ning oleme tutvunud paljude teiste mĂ”istetega, nagu vahelduvvĂ€line video, PAR ja paljude teistega.
ĂlemÀÀrasuse eemaldamine
On teada, et kompressimata videot ei saa normaalselt kasutada. Tund aega 720p resolutsiooniga videot 30 kaadrit sekundis vÔtaks 278 GB. Sellisele vÀÀrtusele jÔuame, korrutades 1280 x 720 x 24 x 30 x 3600 (laius, kÔrgus, bitid pikseli kohta, FPS ja aeg sekundites).
Kasutamine kaotusteta kompressioonialgoritmid, nagu DEFLATE (kasutatakse PKZIP-is, Gzip-is ja PNG-s), ei anna piisavat vÀhendamist vajaliku ribalaiuse osas. Peame otsima teisi video kokkusurumise viise.
Selleks saab kasutada meie nĂ€gemise omadusi. Meie silmad tajuvad paremini heledust kui vĂ€rve. Video on jĂ€rjestatud piltide kogum, mis kordub aja jooksul. Ăhe stseeni kĂ”rval asuvate kaadrite vahel on vĂ€iksed erinevused. Lisaks sisaldab iga kaader palju piirkondi, mis kasutavad ĂŒhte ja sama (vĂ”i sarnast) vĂ€rvi.
VĂ€rv, heledus ja meie silmad
Meie silmad on heledusele tundlikumad kui vÀrvile. Veenduge ise, vaadates seda kujutist.

Kui te ei nĂ€e, et vasakus pooles pildi ruutude vĂ€rvid A ja B on tegelikult samad, siis see on normaalne. Meie aju paneb meid rohkem tĂ€helepanu pöörama heledusele kui vĂ€rvile. Paremal pool on tĂ€histatud ruutude vahel sama vĂ€rvi ĂŒhendus â seega suudame (ehk siis meie aju) kergesti kindlaks teha, et seal on tegelikult sama vĂ€rv.
Vaatame (lihtsustatult) lÀhemalt, kuidas meie silmad töötavad. Silm on keeruline organ, mis koosneb paljusid osadest. Kuid meid huvitavad eelkÔige koonus- ja varsarakud. Silmas on umbes 120 miljonit varsarakku ja 6 miljonit koonusrakku.
Vaatleme vĂ€rvi ja heleduse tajumist kui eraldi funktsioone silma teatud osades (tegelikult on asi keerulisem, kuid lihtsustame). Keerukad rakud vastutavad enamasti heleduse eest, samas kui koonusrakud vastutavad vĂ€rvi eest. Koonusrakud jaotatakse kolme tĂŒĂŒpi sĂ”ltuvalt sisaldatavast pigmendist: S-koonused (sinine), M-koonused (roheline) ja L-koonused (punane).
Kuna meil on palju rohkem keppe (heleduse jaoks) kui koonusrakke (vĂ€rvi jaoks), vĂ”ib jĂ€reldada, et me oleme paremini vĂ”imelised eristama tumeduse ja valguse ĂŒleminekuid kui vĂ€rve.
Kontrastitundlikkuse funktsioonid
EksperimentaalpsĂŒhholoogia ja paljude teiste valdkondade teadlased on vĂ€lja töötanud arvukalt teooriaid inimnĂ€gemise kohta. Ăks neist nimetatakse kontrastitundlikkuse funktsioonideks. Need on seotud ruumilise ja ajaga valgustusega. LĂŒhidalt öeldes, rÀÀgime sellest, kui palju muutusi on vajalik, enne kui vaatleja neid mĂ€rkab. Pange tĂ€hele sĂ”na âfunktsioonâ mitmuses. See on seotud sellega, et saame mÔÔta kontrasti tundlikkuse funktsioone mitte ainult mustvalges, vaid ka vĂ€rvilistes piltides. Need eksperimendi tulemused nĂ€itavad, et enamikul juhtudel on meie silmad valgustusele tundlikumad kui vĂ€rvile.
Kuna on teada, et oleme valgustuse suhtes tundlikumad, vÔiksime proovida seda fakti Àra kasutada.
VĂ€rvimudel
Oleme natuke aru saanud, kuidas töötada vÀrviliste piltidega, kasutades RGB-skeemi. On ka teisi mudeleid. On mudel, mis eraldab heleduse vÀrvustest ja seda tuntakse kui YCbCr. Muide, on ka teisi mudeleid, mis teevad sarnase jaotuse, kuid kÀsitleme ainult seda.
Selles vĂ€rvimudelis Y â esindab heledust, samas kasutatakse kaht vĂ€rvikanalit: Cb (kĂŒlluslik sinine) ja Cr (kĂŒllane punane). YCbCr vĂ”ib olla saadud RGB-st, samuti on vĂ”imalik ka tagurpidi muundamine. Kasutades seda mudelit, saame luua tĂ€isvĂ€rvilisi pilte, nagu allpool nĂ€htav:

YCbCr ja RGB vaheline muundamine
Keegi vÔib vÀita: kuidas on vÔimalik saada kÔiki vÀrve, kui roheline ei ole kasutusel?
Sellele kĂŒsimusele vastamiseks muundame RGB YCbCr-iks. Kasutame standardis kehtestatud koefitsiente BT.601, mille soovitab ITU-R. See organisatsioon mÀÀratleb digitaalsete video standardid. NĂ€iteks: mis on 4K? Millised peaksid olema kaadrisagedus, eraldusvĂ”ime, vĂ€rvimudel?
Esiteks arvutame heledust. Kasutame ITU soovitatud konstandeid ja asendame RGB vÀÀrtused.
Y = 0.299R + 0.587G + 0.114B
PÀrast heleduse saamist eraldame sinise ja punase vÀrvi:
Cb = 0.564(B â Y)
Cr = 0.713(R â Y)
Ja me saame ka tagasi muundada ja isegi saada rohelise YCbCr abil:
R = Y + 1.402Cr
B = Y + 1.772Cb
G = Y â 0.344Cb â 0.714Cr
Tavaliselt kasutavad ekraanid (monitorid, telerid, ekraanid jne) ainult RGB mudelit. Kuid seda mudelit saab organiseerida erinevalt:

VĂ€rvi alampurskamine
Pilt, mis on esitatud heleduse ja vĂ€rvuse kombinatsioonina, vĂ”imaldab meil kasutada inimeste nĂ€gemise sĂŒsteemi suuremat tundlikkust heledusele kui vĂ€rvusele, kui me valikuliselt teabe eemaldame. VĂ€rvialane alalĂ€bilaskmine on piltide kodeerimise meetod, mis kasutab vĂ€rvuse jaoks madalamat eraldusvĂ”imet kui heleduse jaoks.

Kui palju on lubatud vÀrvuse eraldusvÔimet vÀhendada?! Tundub, et juba on olemas mÔned skeemid, mis kirjeldavad, kuidas töötleda eraldusvÔimet ja sulandada (LÔppvÀrv = Y + Cb + Cr).
Need skeemid on tuntud kui alalĂ€bilaskmise sĂŒsteemid ja need vĂ€ljendatakse 3:1 suhetes â a:x:y, mis mÀÀrab heledus- ja vĂ€rvuseidendi signaalide proovide arvu.
a â standardne horisontaalne valimine (tavaliselt 4)
x â vĂ€rvuse proovide arv esimese pikslirea kohta (horisontaalne eraldusvĂ”ime seoses a)
y â vĂ€rvuse proovide muutuste arv esimese ja teise pikslirea vahel.
Erandiks on 4:1:0, mis tagab ĂŒhe vĂ€rvuse proovi iga 4x4 heleduslahtri kohta.
Kaasaegsetes koodekites kasutatavad ĂŒldskeemid:
- 4:4:4 (ilma alamdiskreetimiseta)
- 4:2:2
- 4:1:1
- 4:2:0
- 4:1:0
- 3:1:1
YCbCr 4: 2: 0 â sulandamise nĂ€ide
Siin on YCbCr 4:2:0 abil ĂŒhitatud pildi fragment. Pange tĂ€hele, et meil kulub ainult 12 bitti pikslile.
Nii nĂ€eb vĂ€lja sama pilt, kodeeritud peamiste vĂ€rvisubdiskreetimise tĂŒĂŒpide jĂ€rgi. Ălemine rida on lĂ”plik YCbCr, alumine rida nĂ€itab vĂ€rvivoldingu eraldusvĂ”imet. TĂ”eliselt head tulemused, arvestades vĂ€hese kvaliteedikao.

Kas mĂ€letate, et loendasime 278 GB kettaruumi tunni pikkuse 720p ja 30 kaadrit sekundis video faili talletamiseks? Kui kasutame YCbCr 4:2:0, siis kahaneb see suurus poole vĂ”rra â 139 GB. Seni on see siiski kaugel vastuvĂ”etavast tulemusest.
Saate ise YCbCr-i histogrammi luua FFmpeg abil. Sellel pildil domineerib sinine punase ĂŒle, mis on histogrammil hĂ€sti nĂ€ha.

VĂ€rvivolding, heledus, vĂ€rvigamma â videoĂŒlevaade
Soovitatav on vaadata seda hĂ€mmastavat videot. Siin selgitatakse, mis on heledus, ja ĂŒldiselt on kĂ”ik punktid hĂ€sti paika pandud ĂŒ heleduse ja vĂ€rvi osas.
KaadritĂŒĂŒbid
Liigume edasi. Proovime vÀhendada ajakulu. Kuid esmalt mÀÀratlegime mÔned pÔhiterminoloogiad. Oletame, et meil on film, kus on 30 kaadrit sekundis, ja siin on selle esimesed 4 kaadrit:

NĂ€eme kaadrites palju kordusi: nĂ€iteks sinine taust, mis ei muutu kaadrist kaadrisse. Selle probleemi lahendamiseks saame neid abstraktselt klassifitseerida kolme tĂŒĂŒpi kaadriks.
I-kaar (IIntro Frame)
I-kaar (link-kaader, vÔtme-kaader, sise-kaader) on iseseisev. SÔltumata sellest, mida tuleb visualiseerida, on I-kaar sisuliselt staatiline foto. Esimene kaader on tavaliselt I-kaar, kuid jÀlgime I-kaare ka kaugelt mitte esimestes kaadris.

P-kaar (PPredicted Frame)
P-kerge (ennustatav kerge) kasutab Àra, et peaaegu alati saab praegust pilti esitada kasutades eelmist kerget. NÀiteks teises kerges on ainus muutus edasiviiv pall. Saame kerge 2 lihtsalt veidi muutes kergest 1, kasutades ainult nende kergete vahe. Kerge 2 ehitamiseks viitame eelnevale kergemale 1.
â 
B-kerge (Bi-predictive Frame)
A kuidas oleks viidete asemel mitte ainult minevikus, vaid ka tulevikus kergetele, et tagada veelgi parem kokkusurumine?! See on peamiselt B-kerge (kahepoolsed kerged).
â
â 
VahekokkuvÔte
Need tĂŒĂŒbid kergetest tagavad parima kokkusurumise. Uurime, kuidas see toimub jĂ€rgmises jaotises. Seni tasub mĂ€rkida, et kĂ”ige "kallim" mĂ€lu kasutamine on I-kerge, P-kerge on mĂ€rgatavalt odavam, samas kui kĂ”ige kasulikum variant video jaoks on B-kerge.

Ajaliseks liigseks (vahekergete ennustamine)
Vaatame, millised on meie vĂ”imalused korduvate ajakulu vĂ€hendamiseks. Seda tĂŒĂŒpi liigset andmemahutatust saame lahendada vastastikuste prognoosimisvĂ”tete abil.
PĂŒĂŒdke kodeerimise jĂ€rjestuses 0 ja 1 kulutada vĂ”imalikult vĂ€he bitte.

Saame teha lahutamise, lihtsalt lahutame kaadri 1 kaadrist 0. Saame kaadri 1, kasutades ainult erinevust selle ja eelneva kaadri vahel, tegelikult kodeerime vaid saadud jÀÀki.

Aga mis siis, kui ma ĂŒtlen teile, et on veel parem meetod, mis kasutab veel vĂ€hem bitte?! Alustame selge ruudustiku loomisega kaadrist 0, mis koosneb plokkidest. SeejĂ€rel proovime vĂ”rrelda plokke kaadrist 0 kaadriga 1. TeisisĂ”nu, hindame liikumist kaadrite vahel.
Wikipediast â plokkide liikumise kompensatsioon
Plokkide liikumise kompensatsioon jagab praeguse kaadri mittetĂ€iendavateks plokkideks ja liikumise kompensatsiooni vektor nĂ€itab plokkide pĂ€ritolu (levinud valearusaam on, et eelmine kaader jaguneb eraldiseisvateks plokkideks ning liikumise kompensatsiooni vektorid nĂ€itavad, kuhu need plokid liiguvad. Tegelikult on vastupidi â analĂŒĂŒsitakse mitte eelmist kadreid, vaid jĂ€rgmist, selgub mitte see, kuhu plokid liiguvad, vaid kust nad on tulnud. TĂŒĂŒpiliselt kattuvad algsed plokid algses kaadris. MĂ”ned videokompressiooni algoritmid koguvad praeguse kaadri osad isegi mitte ĂŒhest, vaid mitmest eelnevalt edastatud kaadrist.

Protsessi kĂ€igus nĂ€eme, et pall on liikunud (x=0, y=25) koha pealt (x=6, y=26), vÀÀrtused x ja y moodustavad liikumise vektori. Veel ĂŒks samm, mida saame teha, et andmeid sÀÀsta, on kodeerida ainult liikumise vektorite erinevus viimase ploki asukoha ja prognoositud vahel, seega lĂ”plik liikumise vektor on (x=6-0=6, y=26-25=1).
Reaalses situatsioonis oleks see pall jagatud n plokkideks, kuid see ei muuda asja olemust.
Kadris olevad objektid liiguvad kolmes mÔÔtmes, seega kui pall liigub, vĂ”ib see visuaalselt muutuda vĂ€iksemaks (vĂ”i suuremaks, kui see liigub vaatleja suunas). On normaalne, et plokkide vahel ei pruugi olla ideaalset vastavust. Siin on ĂŒhendatud vaade meie hindamisest ja reaalsest pildist.

Kuid nÀeme, et kui rakendame liikumise hindamist, on kodeerimiseks vajalikud andmed oluliselt vÀhem, kui kasutades lihtsamat meetodit raamide vahelise delta arvutamiseks.

Kuidas tÔeline liikumise kompensatsioon vÀlja nÀeb
Seda meetodit rakendatakse kohe kÔikidele plokkidele. Sageli jaguneb meie nii-öelda liikuv pall kohe mitmeks plokiks.

Sa saad neid kontseptsioone ise katsuda, kasutades .
Liikumise vektorite nÀgemiseks saab luua video vÀlist ennustust kasutades .

Samuti saad kasutada (see on tasuline, kuid saadaval on tasuta prooviversioon, mis on piiratud ainult esimestel kĂŒmnel kaadril).

Ruumiline ĂŒleliigsus (sisemine prognoos)
Kui analĂŒĂŒsida iga kaadrit videos, avastame palju omavahel seotud alasid.

Vaadakem sellele nÀitele lÀhemalt. See stseen koosneb peamiselt sinistest ja valgetest vÀrvide toonidest.

See on I-raam. Eelmisi raame prognoosimiseks kasutada ei saa, kuid saame selle kokku suruda. Kodeerime punase ploki eristamise. Kui vaatame selle naabreid, siis mĂ€rkame, et ĂŒmberringi on teatud vĂ€rvilised trendid.

Oletame, et kaadris levivad vÀrvid vertikaalselt. See tÀhendab, et tundmatute pikslite vÀrvide vÀÀrtused sisaldavad naabrite vÀÀrtusi.

Selline prognoos vÔib osutuda vale. Just sellepÀrast tuleb rakendada seda meetodit (sisemine prognoos), seejÀrel lahutada reaalsed vÀÀrtused. See annab meile jÀÀkploki, mis viib palju tihedama matriitsini vÔrreldes originaaliga.

Kui soovite sisemiste prognoosidega harjutada, saate luua video makrobokidest ja nende prognoosidest, kasutades ffmpeg'i. Iga ploki vÀrvi tÀhenduse mÔistmiseks peate tutvuma ffmpeg'i dokumentatsiooniga.

VÔi vÔite kasutada Intel Video Pro Analyzer'it (nagu eelnevalt mainisin, on prooviversioonis piirang esimestele 10 kaadrile, kuid seda piisab alguses).

Teine osa:
Allikas: habr.com



