Bună din nou! Am găsit acest articol, scris încă în mai 2019. Aceasta este o continuare a unei serii de articole despre WAVE și JPEG, iată . Această publicație va conține informații despre algoritmul de codare a imaginilor și despre formatul în sine.
O migă de istorie
O lingură de articol din Wikipedia:
JPEG (Joint Photographic Experts Group) este unul dintre cele mai populare formate de grafică raster, folosit pentru stocarea imaginilor foto și a imaginilor asemănătoare.
Acest standard a fost dezvoltat de către grupul comun de experți în fotografie încă din 1991 pentru comprimarea eficientă a imaginilor.
Ce cale parcurg imaginile de la forma brută la JPEG
Unii consideră că imaginile JPEG sunt date brute comprimate folosind metoda Huffman, dar nu este așa. Înainte de comprimarea finală, datele trec printr-un drum lung.
Mai întâi, modelul de culoare este schimbat din RGB în YCbCr. Pentru aceasta există un algoritm special — . Y nu este atins, deoarece este responsabil pentru luminozitate, iar modificarea sa va fi vizibilă.
Primul lucru care se face cu imaginea este „subsampling” (subsampling). E simplu de înțeles: se ia un bloc de 2x2 pixeli, apoi se obțin Cb și Cr – valorile medii ale fiecărui component YCbCr din acești 4 pixeli. Astfel, am câștigat 6 octeți, în loc de 4 Y, 4 Cb, 4 Cr am obținut 4 Y și valori identice pentru fiecare Cb și Cr (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Chiar și la 2×2, comprimarea cu pierderi cu un coeficient de 2:1 sună solid. Acest lucru se aplică întregii imagini. Așadar, am redus jumătate din dimensiune. Și această tehnică poate fi folosită datorită percepției noastre de culoare. Oamenii vor observa cu ușurință diferența de luminozitate, dar nu și de culoare, dacă este mediată într-un mic bloc de pixeli. De asemenea, subsamplingul poate fi realizat pe linii, 4 pixeli pe orizontală și verticală. Prima variantă este folosită mai des. Dacă calitatea imaginii este importantă, atunci subsamplingul nu se efectuează deloc.
O ilustrație vizuală a subsamplingului (Habr nu a permis inserarea unui gif) —
Partea principală a pregătirii
DCT
Acum ajungem la partea cea mai complicată și necesară. Întreaga imagine este împărțită în blocuri de 8×8 (se folosesc umpleri în cazul în care rezoluția nu este multiplă de dimensiunea blocului).
Acum se aplică DCT (Transformata Cosinus Discretă) la fiecare bloc. În această parte a imaginii se elimină tot ce este în plus. Folosind DCT, trebuie să înțelegem dacă acest bloc (8×8) descrie o parte monotonă a imaginii: cer, ziduri; sau conține o structură complexă (păr, simboluri etc.). Este logic că 64 de pixeli asemănători ca culoare pot fi descriși printr-un singur pixel, deoarece dimensiunea blocului este deja cunoscută. Iată o comprimare: 64 la 1.
DCT transformă blocul într-un spectru, iar acolo unde citirile se schimbă brusc, coeficientul devine pozitiv, iar cu cât tranziția este mai abruptă, cu atât mai mare va fi ieșirea. Acolo unde coeficientul este mai mare, pe imagine sunt reprezentate tranziții clare de culoare și luminozitate, iar unde este mai mic – schimbări slabe (lineare) ale valorilor componentelor YCbCr din bloc.
Cuantificare
Aici se aplică deja setările de compresie. Fiecare dintre coeficienți în fiecare dintre matricele 8×8 este împărțit la un anumit număr. Dacă calitatea imaginii după toate modificările nu trebuie să mai fie diminuată, atunci divizorul trebuie să fie 1. Dacă îți pasă mai mult de memoria ocupată de această fotografie, atunci divizorul va fi mai mare de 1, iar rezultatul va fi rotunjit. Astfel, după rotunjire se obțin adesea multe zerouri.
Cuantificarea se face pentru a permite o comprimare și mai mare. Iată cum arată pe exemplul cuantificării graficului y = sin(x):

Compresie
Mai întâi, parcurgem matricea în zig-zag:

Obținem un array unidimensional cu numere. Vedem că există multe zerouri în el, care pot fi eliminate. Pentru aceasta, în locul unei secvențe cu multiple zerouri, scriem un singur zero și după acesta un număr care reprezintă cantitatea lor în secvență. Astfel, se poate reduce dimensiunea totală a array-ului la 1/3. Apoi, se comprimă acest array folosind metoda Huffman și se scrie deja în fișierul propriu.
Unde se folosește
Acolo unde există. La fel ca PNG, JPEG este utilizat în camerele foto, sisteme de operare (ca logo-uri de companie, pictograme de aplicații, miniaturi) și în toate domeniile posibile în care este necesar să se stocheze eficient imagini.
Ieșire
În prezent, cunoștințele despre JPEG sunt valoroase doar în scopuri educaționale, deoarece este deja incorporat peste tot și optimizat de echipe mari de oameni, dar granitul științei este totuși gustos.
Surse
Sursa: habr.com
