2017. szept. 25.

JPEG alapok 1 - RGB - YCbCr átalakítás.

Az utóbbi időben lépten-nyomon beleszaladunk a JPEG meg nem értésébe. Akár metaadatok, akár fileba rejtett tartalom a téma. Úgy tűnik, addig nem bírom elengedni ezt, amíg a végére nem járunk, ha csak felületesen is.
Csak akkor érdemes tovább olvasnod ezt a sorozatot, hogyha te sem tudod, miért van a PhotoShopban 13 szintre mappelve a JPEG tömörítés 0-100% helyett, ha azt gondoltad a 6-os érték kisebb és gyengébb filet eredményez, mint a 7-es, nem tudod, mi történik, hogyha többször újramentesz egy JPEG-et, ha 12-es szintre mented a képeidet, függetlenül attól, hogy gőzöd sincs milyen tömörítéssel dolgozik a kamerád, mondván az a legbesztesebb, meg ilyenek. Hanem ne. De tényleg. Elég kocka lesz. Még én se értem. És nem kívánok sérvet kapni a szakkifejezések magyarításával sem. Tudjátok, 2-3 ember olvassa úgyis.

RGB csatornák
YCbCr csatornák
1. Első lépés RGB-ből YCbCr színtérbe történő konverzió. Ez a fényességérték és színkülönbség értékek szétválasztását jelenti, hogy külön lehessen őket tömöríteni, a luminanciát kevésbé, a krominanciát jobban (ez még külön subsamplinget is kaphat) -  ez a folyamat az emberi színlátás és kontrasztlátás közötti különbséget aknázza ki, vagyis hogy érzékenyebb a luminancia, de kevésbé a színek változására.
Ezért lehet például a színcsatornákat subsamlingelni.
Azon kívül az emberi látás a nagyfrekvenciás jelekre kevésbé érzékeny, mint az alacsonyakra Ezt szintén ki lehet használni a DCT átalakítással és a kvantálással).
Tehát egy luminancia csatornára, egy kék-sárga, illetve egy piros-zöld csatornára robbantják az RGB képet. A PhotoShop nem tud YCbCr színtérbe váltani (vagyis de, amikor a JPEG-et bergeti, de ahhoz nem férünk hozzá), a JPEGsnoop képernyőképei mutatják kb. miről van szó. Aki játszani akar a konverzióval, annak itt egy online eszköz, menthet vele YCBCR kiterjesztésű mamutfilet (de semmiben sem fogja tudni megnyitani). Kísérletezhet a wiki képleteivel is, nekünk sajnos nem sikerült kitalálni, pontosan hogyan is működik a képlet (sokféle szabvány, mindenhol mást mondanak stb.), de legalább az vigasztalt, hogy sokan elakadtak itt.
Egyetlen követhető képletet találtunk, mondjuk pont azon az oldalon, ahonnan a JPEGsnoop is származik, na ez legalább konzisztens önmagával, pár színre ki is számoltuk:
Forrás: innen A Cb és Cr csatornák értékei -128...+127 között lehetnek, tehát az eredményeihez +128 dukál,
hogy a PS-ben mért értékekkel meg lehessen feleltetni. 

Hogy minden színt ne kelljen kiszámolni és legalább az alapszínek leképezésével képben legyünk, csináltunk egy ilyen színskálát a JPEGsnoop segítségével (már amennyiben az etalonnak számít). Ha ti tudtok tutibb képletet, vagy konvertert, írjátok meg.

Fenti két sor RGB, alatta Y, alatta Cb és Cr
Ami világosan látszik, hogy a fehér szín (R0G0B0) esetén Y=0 (és nem 16 ahogyan állítják pár helyen). A Cb és Cr = 128. A fekete szín (R255G255B255) Y értéke szintén 255, a Cb és Cr pedig szintén 128. Tehát a fekete-fehér árnyalatokat csak a luminancia (Y) képezi le, a színcsatornákon pedig a 128-as középértéktől nincs eltérés.

A piros (R255G0B0) luminanciája 76, a zöldé (R0G255B0) 149, a kék (R0G0B255) pedig 29 (hogy miért ennyi, volt már róla szó). A Cred csatornán a piros szín a red tengely irányába tér el -128-al (lesz fehér), a Cblue csatornán pedig a kék szín lesz -128, vagyis fehér. A többi szín betagolódása a tengelyre már bonyibb, egyelőre elég ennyi.

Azt is olvastuk, hogy a képlet szerint a csatornák pixeleinek értékei összefüggnek (az Y értékén keresztül), ezért csak bizonyos értékeket (kombinációt) vehetnek fel, amennyiben tetszőleges értéket adnánk, előfordulhatna, hogy az a szín kívül esne az RGB színterén, ennek most nem járunk utána, meg úgyse tudunk belepiszkálni ezekbe az értékekbe.

Az YCbCr-ről nem találtam, hogy hány byteon tárolja az infókat, de a fileméret alapján ugyancsak 24 bit (3x8) lehet. Mindenesetre 256 szintet tud a képletek szerint. Ebből arra következtetünk, hogy a színtér konverziója is veszteséggel jár, ha pár színre kiszámoljátok az értékeket tutti beleszaladtok pár felkerekítésbe, a visszaalakításnál meg gondolom szintén vár pár kerekítés. Gondoltam a fent meglinkelt konverterrel készített YCbCr filet visszakonvertálom TIFF-nek és egymásra szűröm (difference), hátha látszik a kerekítésből származó különbség, de a majom konverter a saját maga által készített filet nem tudja visszaalakítani. Ciki.

* UPDATE - találtunk egy sokkal egyszerűbb képletsort RGB-ből YCbCr-be és vissza alakításra.
Y = 0.299 R + 0.587 G + 0.114 B
Cb = - 0.1687 R - 0.3313 G + 0.5 B + 128
Cr = 0.5 R - 0.4187 G - 0.0813 B + 128

R = Y + 1.402 (Cr-128)
G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
B = Y + 1.772 (Cb-128)

A következő lépések később, még nem értem a végére én se. A többi cucc még durvább lesz :)

Nincsenek megjegyzések:

Megjegyzés küldése