Szia ismét! Ezt a cikket még 2019 májusában találtam. Ez a WAVE-ról és a JPEG-ről szóló cikksorozat folytatása itt
Egy csipetnyi történelem
Egy evőkanál Wikipédia-cikk:
A JPEG (Joint Photographic Experts Group) az egyik legnépszerűbb rasztergrafikus formátum, amelyet fényképek és hasonló képek tárolására használnak.
Ezt a szabványt a Joint Photographic Experts Group fejlesztette ki 1991-ben a hatékony képtömörítés érdekében.
Hogyan válnak a képek nyersből JPEG-be?
Vannak, akik úgy gondolják, hogy a JPEG képek Huffman-módszerrel tömörített nyers adatok, de ez nem igaz. A vezérlés tömörítése előtt az adatok hosszú utat tesznek meg.
Először is, a színmodell RGB-ről YCbCr-re változik. Még egy speciális algoritmus is létezik erre -
A képpel kapcsolatos első dolog az "ritkítás" (almintavétel). Könnyen érthető: egy 2x2-es pixeltömböt veszünk, majd a Cb-t és a Cr-t - ennek a 4 pixelnek az egyes YCbCr-komponenseinek átlagértékeit. Így, 6 bájtot nyertünk, 4 Y, 4 Cb, 4 Cr helyett 4 Y-t és ugyanazt a Cb-t és Cr-t kaptunk mindegyikre (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Még 2x2 léptékben is szilárdan hangzik a veszteséges tömörítés 2:1 tömörítési aránnyal. Ez a teljes képre vonatkozik. És így - fél méretet estek. Ezt a technikát pedig színérzékelésünknek köszönhetően használhatjuk. Az ember könnyen észreveszi a különbséget a fényerőben, de nem a színben, ha azt egy kis pixeltömbre átlagolja. A ritkítás vonalban is elvégezhető, 4 pixel vízszintesen és függőlegesen is. Az első lehetőséget gyakrabban használják. Ha a képminőség fontos, akkor a tizedelés egyáltalán nem történik meg.
A ritkítás vizuális illusztrációja (Habr nem engedte, hogy gif-et szúrjak be) -
Az előkészítés fő része
Dkp
Most jön a legnehezebb és legszükségesebb rész. A teljes kép 8x8-as blokkra van osztva (kitöltést használunk, ha a felbontás nem a blokkoldal többszöröse).
Most alkalmazza minden blokkra DCT (diszkrét koszinusz transzformáció). Ebben a részben minden felesleges kikerül a képből. A DCT használatával meg kell értened, hogy egy adott blokk (8×8) leírja-e a kép bármely monoton részét: az eget, a falat; vagy összetett szerkezetet tartalmaz (haj, szimbólumok stb.). Logikus, hogy 64 hasonló színű pixel csak 1-gyel írható le, mert a blokk mérete már ismert. Ennyit a tömörítésről: 64 az 1-hez.
A DCT a blokkot spektrummá alakítja, és ahol a leolvasások élesen változnak, ott az együttható pozitív lesz, és minél élesebb az átmenet, annál nagyobb lesz a kimenet. Ahol magasabb az együttható, a képen világos átmenetek láthatók a színben és a fényerőben, ahol alacsonyabb - gyenge (sima) változások a blokk YCbCr komponenseinek értékében.
Kvantálás
Itt már alkalmazták a tömörítési beállításokat. A 8x8-as mátrixok mindegyik együtthatóját elosztjuk egy bizonyos számmal. Ha nem csökkenti a képminőséget az összes módosítás után, akkor az osztónak egynek kell lennie. Ha a fénykép által elfoglalt memória fontosabb Önnek, akkor az osztó nagyobb lesz, mint 1, és a hányados kerekítve lesz. Kiderült, hogy a kerekítés után gyakran sok nullát kapunk.
A kvantálás a még nagyobb tömörítés lehetőségének megteremtése érdekében történik. Így néz ki az y = sin(x) gráf kvantálásának példájával:
Tömörítés
Először cikk-cakk mintában megyünk végig a mátrixon:
Kapunk egy egydimenziós tömböt számokkal. Azt látjuk, hogy sok nulla van benne, kivehetők. Ehhez a sok nullából álló sorozat helyett 1 nullát írunk be, és utána egy számot, amely jelzi a számukat a sorozatban. Így visszaállíthatja a teljes tömb méretének 1/3-át. Ezután egyszerűen tömörítjük ezt a tömböt a Huffman-módszerrel, és beírjuk magába a fájlba.
Hol használják
Mindenhol. A PNG-hez hasonlóan a JPEG-et is használják kamerákban, operációs rendszerekben (vállalati logóként, alkalmazásikonként, miniatűrként) és minden olyan területen, ahol a képeket hatékonyan kell tárolni.
Teljesítmény
Jelenleg a JPEG-ről szóló tudás ma már csak oktatási célokra értékes, mert már mindenhol be van építve és nagy csoportok optimalizálják, de a tudomány gránitja még mindig ízletes.
forrás
Forrás: will.com