JPEG. Algoritm de compresie

Buna din nou! Am găsit acest articol scris în mai 2019. Aceasta este o continuare a unei serii de articole despre WAVE și JPEG, aici în primul rând. Această publicație va include informații despre algoritmul de codificare a imaginii și formatul în sine în ansamblu.

Un praf de istorie

O lingură de articol Wikipedia:

JPEG (Joint Photographic Experts Group) este unul dintre formatele de grafică raster populare utilizate pentru stocarea fotografiilor și imaginilor similare.

Acest standard a fost dezvoltat de Joint Photographic Experts Group încă din 1991 pentru o compresie eficientă a imaginii.

Cum trec imaginile de la raw la JPEG?

Unii oameni cred că imaginile JPEG sunt date brute comprimate folosind metoda Huffman, dar acest lucru nu este adevărat. Înainte de comprimarea controlului, datele parcurg un drum lung.

În primul rând, modelul de culoare este schimbat de la RGB la YCbCr. Există chiar și un algoritm special pentru asta - aici. Y nu este atins, deoarece este responsabil pentru luminozitate, iar schimbarea sa va fi vizibilă.

Primul lucru de făcut cu imaginea este "subtierea" (subeșantionare). Este ușor de înțeles: este luată o matrice 2x2 de pixeli, apoi sunt luate Cb și Cr - valorile medii ale fiecăreia dintre componentele YCbCr ale acestor 4 pixeli. Asa de, am câștigat 6 octeți, în loc de 4 Y, 4 Cb, 4 Cr avem 4 Y și același Cb și Cr pentru fiecare dintre ele (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Chiar și la scară 2x2, compresia cu pierderi cu un raport de compresie 2:1 sună solid. Acest lucru este valabil pentru întreaga imagine. Și așa - au scăzut jumătate de dimensiune. Și putem folosi această tehnică datorită percepției noastre de culoare. O persoană va observa cu ușurință o diferență de luminozitate, dar nu de culoare, dacă este mediată pe un bloc mic de pixeli. Subțierea se poate face și în linie, 4 pixeli pe orizontală și pe verticală. Prima opțiune este folosită mai des. Dacă calitatea imaginii este importantă, atunci decimarea nu se efectuează deloc.
O ilustrare vizuală a subțierii (Habr nu mi-a permis să introduc un gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Partea principală a pregătirii

Dkp

Acum vine partea cea mai grea și cea mai necesară. Întreaga imagine este împărțită în blocuri de 8x8 (se folosește umplerea dacă rezoluția nu este un multiplu al părții blocului).

Acum se aplică fiecărui bloc DCT (transformare cosinus discretă). În această parte, tot ce nu este necesar este scos din imagine. Folosind DCT, trebuie să înțelegeți dacă un anumit bloc (8×8) descrie vreo parte monotonă a imaginii: cerul, peretele; sau conține structură complexă (păr, simboluri etc.). Este logic că 64 de pixeli de culoare similară pot fi descriși doar de 1, deoarece dimensiunea blocului este deja cunoscută. Atât pentru compresie: 64 la 1.

DCT transformă blocul într-un spectru și, acolo unde citirile se schimbă brusc, coeficientul devine pozitiv și cu cât tranziția este mai clară, cu atât ieșirea va fi mai mare. Acolo unde coeficientul este mai mare, imaginea arată tranziții clare în culoare și luminozitate, unde este mai scăzută - modificări slabe (netede) ale valorilor componentelor YCbCr din bloc.

Cuantizare

Setările de compresie sunt deja aplicate aici. Fiecare dintre coeficienții din fiecare dintre matricele 8x8 este împărțit la un anumit număr. Dacă nu veți reduce calitatea imaginii după toate modificările acesteia, atunci divizorul ar trebui să fie unul. Dacă memoria ocupată de această fotografie este mai importantă pentru tine, atunci divizorul va fi mai mare decât 1, iar coeficientul va fi rotunjit. Se dovedește că după rotunjire ajungi adesea cu multe zerouri.

Cuantizarea se face pentru a crea posibilitatea unei compresii și mai mari. Iată cum arată folosind exemplul de cuantificare a graficului y = sin(x):

JPEG. Algoritm de compresie

Comprimare

Mai întâi parcurgem matricea într-un model în zig-zag:

JPEG. Algoritm de compresie

Obținem o matrice unidimensională cu numere. Vedem că există o mulțime de zerouri în el, pot fi eliminate. Pentru a face acest lucru, în loc de o secvență de mai multe zerouri, introducem 1 zero și după acesta un număr care indică numărul lor în succesiune. În acest fel, puteți reseta la 1/3 din dimensiunea întregii matrice. Și apoi pur și simplu comprimăm această matrice folosind metoda Huffman și o scriem în fișierul în sine.

Atunci când este folosit

Pretutindeni. La fel ca PNG, JPEG este folosit în camere, sisteme de operare (ca sigle ale companiei, pictograme aplicații, miniaturi) și în toate zonele posibile în care imaginile trebuie stocate eficient.

Producție

În prezent, cunoștințele despre JPEG sunt acum valoroase doar în scopuri educaționale, deoarece sunt deja construite peste tot și optimizate de grupuri mari de oameni, dar granitul științei este încă gustos.

surse

Articol despre YCbCr pe Wikipedia
Articol Wikipedia pe JPEG
Câteva despre PrEP din postarea Pikabu
Articol Wikipedia despre PrEP

Sursa: www.habr.com

Adauga un comentariu