Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Windows 7, XP
  • Implementați compresia imaginii folosind jpeg c. JPEG, JPEG2000, JPEG-LS

Implementați compresia imaginii folosind jpeg c. JPEG, JPEG2000, JPEG-LS

Fotografiile și imaginile diferă unele de altele nu numai prin conținut, ci și prin alte caracteristici „calculatorului”. De exemplu, în dimensiune.

Se întâmplă ca două modele identice, dar o dimensiune este de trei ori mai mare decât cealaltă.

De asemenea, imaginile diferă ca calitate. Cred că ați văzut fotografii de o calitate extrem de slabă de mai multe ori. Acest lucru poate fi văzut cu ochiul liber. De exemplu, două fotografii identice, dar una de cea mai bună calitate și cealaltă de cea mai proastă.

Și se întâmplă ca imaginea să pară lipsită de culori. Iată un exemplu.

Și formatul sau tipul fișierului este responsabil pentru toate acestea.

De fapt, imaginile sunt cele mai multe diferite formate... Și sunt o mulțime. Nu le vom lua în considerare pe toate, ci vorbim despre cele mai comune. Acestea sunt formate precum bmp, gif, jpg, png, tiff.

Se deosebesc unul de celălalt, în primul rând, prin calitate. Iar calitatea diferă prin numărul (saturația) de culori.

De exemplu, pictez o imagine folosind culori diferite. Și apoi, deodată, unele dintre ele s-au terminat și trebuie să termini de pictat cu ceea ce avem noi. Desigur, voi încerca să fac tot posibilul pentru ca acest lucru să nu afecteze foarte mult rezultatul, dar totuși, imaginea nu va ieși la fel cum mi-aș dori - mai estompată, neclară.

Așa este și cu formatele de imagine. Unul lasă toate culorile, celălalt taie o parte. Și, se întâmplă, din această cauză, imaginea se deteriorează.

Acesta este un exemplu destul de grosolan. De fapt, totul este ceva mai complicat acolo, dar cred că ai prins principalul.

Formate comune de imagine

BMP este un format pentru desenele realizate în Paint. Poate fi folosit pentru a stoca imaginile desenate pe computer. Dar acest tip de fișier nu este folosit pe Internet din cauza dimensiunii mari. Deci, dacă doriți să publicați o imagine desenată în Paint, pe un blog sau rețea de socializare, aceasta trebuie să fie de alt tip - gif, jpg sau png.

GIF este un format de imagine popular pe Internet. Le poți salva în ea fără a pierde calitatea, dar cu număr limitat culori - 256. GIF a câștigat o popularitate deosebită datorită faptului că în el puteți crea mici imagini animate (în mișcare).

JPG este un format de fotografii și imagini cu multe culori. Poate salva o imagine atât fără pierderea calității, cât și cu pierdere.

PNG este un format modern pentru imagini. Acest tip de imagine nu este obținut. marime mare si fara pierderi de calitate. Foarte comod: fișierul este mic și calitatea este bună. De asemenea, susține transparența.

TIFF - imagini de foarte bună calitate, necomprimate și, în consecință, dimensiunea unor astfel de fișiere este uriașă. TIFF este folosit când calitatea este mare importanță... De exemplu, atunci când creați cărți de vizită, broșuri, coperți de reviste.

Ce format să alegi

  • BMP - dacă acesta este un desen realizat în Paint și îl veți păstra doar în computer.
  • GIF - dacă o animație sau un desen cu o cantitate mică de culori pentru publicare pe Internet.
  • PNG - dacă este un desen cu multe culori sau unele părți transparente.
  • JPG (jpeg) - dacă fotografie.
  • TIFF - o imagine pentru imprimare (carti de vizita, brosuri, postere etc.).

Salutare dragi prieteni. Astăzi vom vorbi despre ce format de imagine este mai bine de utilizat pe site, ce formate de fișiere grafice sunt disponibile astăzi pentru site și dacă este necesar să urmăriți cele mai recente formate grafice.

Primesc o mulțime de astfel de întrebări, mulți dintre studenții mei întreabă dacă pot folosi noile formate SVG și WebP și unde este mai bine să aplice aceste imagini. Desigur, puteți utiliza și formate noi, dar trebuie să înțelegeți ce format este cel mai potrivit pentru ce.

Astăzi imaginile de pe site sunt parte integrantă. Începând de la design graficși încărcarea imaginilor în articole, graficele însoțesc majoritatea site-urilor de pe web. Dar frumusețea are un preț

Imaginile neoptimizate sunt unul dintre factorii de încetinire a site-ului, așa cum indică serviciile de verificare.

Prin urmare, te vei confrunta mereu cu alegerea formatului de a alege pentru imagine. Mărimea și calitatea acestuia vor depinde de acest lucru. Și pentru a utiliza imagini mai mici fără a pierde calitatea, există câteva lucruri pe care trebuie să le știi.

Ce imagini folosesc astăzi pentru site-uri web?

Toate imaginile pentru site-uri sunt subdivizate:

  • raster (exemplu - JPG, JPEG, GIF, PNG),
  • vector (exemplu - SVG).

Raster imaginile sunt formate din pixeli care stochează valoarea culorii și a transparenței. Aceste formate sunt imagini în articole, butoane, pictograme și elemente de design. Aceste imagini sunt populare în rândul dezvoltatorilor și proprietarilor de site-uri web. Principalul dezavantaj al bitmap-urilor este că nu se scalează bine.

Adică, atunci când măriți dimensiunea imaginii, există o pierdere de calitate.

Vector imaginile sunt compuse din linii și puncte de traseu. Informațiile despre o imagine sunt stocate în instrucțiuni de desen matematic, ceea ce permite ca astfel de imagini să fie scalate cât se dorește fără pierderea calității.

Toate aceste imagini pot și sunt utilizate pe site-uri web moderne. Trebuie doar să înțelegeți asta înainte de a încărca pe site,!

Descrierea formatelor de imagine populare pentru site

Din descrierea acestor formate, veți înțelege unde și ce format este cel mai bine utilizat pe site.

Jpeg

JPEG sau JPG este unul dintre cele mai populare formate de imagine pentru site-uri web. Formatul acceptă milioane de culori, ceea ce îi conferă o poziție de lider în prezentarea de fotografii și imagini pe site.

Imaginile în acest format sunt destul de bine optimizate, aproape fără pierderi de calitate, ceea ce vă permite să obțineți un fișier mai mic fără pierderea vizuală a calității. Trebuie amintit că fiecare optimizare ulterioară scade calitatea.

Fișierele cu acest format sunt acceptate de toate dispozitivele și browserele, ceea ce confirmă încă o dată popularitatea și vă permite să nu vă faceți griji cu privire la problemele de afișare pe site-uri.

Marele dezavantaj al acestui format este lipsa de transparență. Adică, nu va funcționa să combinați imagini în acest format. Pentru astfel de sarcini, este mai bine să utilizați următorul format.

Imagine PNG

Acest format folosește un algoritm de compresie fără pierderi. În ceea ce privește numărul de culori și nivelul de transparență, acesta este disponibil în două tipuri, 8 și 24 de biți. Ambele susțin transparența.

8-bit nu este foarte popular, dar 24-bit este utilizat pe scară largă pentru diferite imagini de pe site. Datorită transparenței, vă permite să creați imagini combinate. Este adesea folosit pentru a crea butoane animate, pictograme, unde este nevoie de un efect de transparență.

Imaginile PNG pot fi optimizate de mai multe ori, editate - își va păstra calitatea originală.

Formatul este, de asemenea, acceptat de toate browserele și dispozitivele pentru a se asigura că este afișat pe orice ecran.

Calitatea imaginilor arată mai bună decât JPG, dar greutatea fișierului va fi mai mare. Acest lucru trebuie luat în considerare la plasarea fișierelor pe site.

GIF

Este un format de 8 biți care acceptă 256 de culori, transparență și animație. Datorită suportului unui număr mic de culori, greutatea fișierului este, de asemenea, minimă.

Formatul nu este potrivit pentru fotografii și imagini cu gamă largă culorile.

Dar este utilizat pe scară largă atunci când se creează bannere, butoane, pictograme și așa mai departe.

Acest format este folosit din ce în ce mai puțin în site-urile web moderne.

În continuare, să vorbim despre formatele SVG și WebP relativ recente, care nu sunt atât de populare, dar câștigă popularitate și suport și sunt cele mai potrivite cerințelor privind viteza de încărcare și capacitatea de răspuns a site-ului.

SVG

Este un format de fișier vectorial pe Bazat pe XML... Formatul a început să câștige popularitate destul de recent, deoarece anterior era slab acceptat în browsere. Și din cauza problemelor de afișare, nimeni nu s-a grăbit să-l folosească.

Astăzi, SVG este acceptat de toate browserele moderne. Dar, există încă probleme cu afișajul.

Acest format este cel mai frecvent utilizat pentru imagini simple, cum ar fi logo-uri, elemente de design și așa mai departe. Nu se aplică pentru fotografii.

Formatul SVG este ușor, se scalează bine pentru imagini clare la orice rezoluție de ecran, acceptă animație, poate fi manipulat prin CSS și plasat în HTML, reducând numărul de solicitări.

Webp

Format deschis cod sursa, dezvoltat de Google special pentru internet. YouTube utilizează astăzi conversia miniaturii video în format WebP.

Formatul oferă o compresie superioară și menține transparența. Combină avantajele formatelor JPG și PNG fără a crește dimensiunea fișierului.

Dar, în ciuda avantajelor formatului, acesta nu este acceptat de toate browserele, cum ar fi IE, Edge, Firefox și Safari.

Există modalități de a evita aceste limitări, dar ele împiedică utilizarea universală a formatului.

Concluzie

Prieteni, sper că am explicat totul clar, iar acum știți ce format de imagine este cel mai bine să utilizați pe site și de ce nu insist să folosesc un anumit format, ci recomand o abordare integrată.

Poate că atunci când WebP va câștiga sprijin pe scară largă, vom trece cu toții la el și vom înlocui jpg și png pe site-urile noastre.

Să discutăm în comentarii ce formate folosiți pe site-urile dvs., ce vă place și ce nu vă place.

Pentru astazi am de toate, astept comentariile voastre.

Salutări, Maxim Zaitsev.

    CU Cele mai populare sunt trei formate de fișiere - JPEG, RAW, TIFF. Uneori puteți auzi dezacorduri între fotografi - care este cel mai bun format de fișier pentru fotografie, în ce format este mai bine să faceți fotografii, deoarece camerele moderne vă permit să faceți fotografiiimprimarea în oricare dintre aceste formate și, uneori, în mai multe simultan!

    Formatul de fișier în care este stocată imaginea este, de fapt, un anumit compromis între calitatea imaginii și dimensiunea fișierului.

    Probabil știți deja că un bitmap este format din pixeli. Cum este organizat un fișier raster și sub ce formă stochează informații despre pixeli și determină formatul fișierului. Calitatea imaginii pentru un fișier raster este determinată de doi parametri principali: dimensiunea pixelilor (adică numărul total de pixeli) și acuratețea reproducerii reale a culorii prin culoarea pixelilor.Cu dimensiunea pixelilor este clar - cu cât sunt mai mulți pixeli (sau - cu cât este "mai mic" pixelul), cu atât mai bine.Iar acuratețea culorii depinde de numărul de culori pe pixel sau de adâncimea culorii.

    Adâncimea culorii (calitatea culorii, bitness al imaginii) - cantitatea de memorie în numărul de biți utilizat pentru a stoca și reprezenta culoarea la codificarea unui pixel grafică bitmap sau imagini video. Numărul de biți indică numărul de gradări (pași tonali) din fiecare componentă de culoare sau, pur și simplu, numărul de culori. Adăugarea unui bit înseamnă a adăuga încă un bit la codul de culoare binar.

    • Culoare pe 1 bit (21 = 2 culori) culoare binară, cel mai adesea reprezentată de alb-negru (sau negru și verde)
    • Culoare pe 2 biți (22 = 4 culori) CGA Grayscale NeXTstation
    • Culoare pe 3 biți (23 = 8 culori) multe computere personale vechi cu ieșire TV
    • Culoarea pe 4 biți (24 = 16 culori) este cunoscută ca EGA și, într-o măsură mai mică, standardul de înaltă rezoluție VGA
    • Culoare pe 5 biți (25 = 32 de culori) Chipset Amiga original
    • Culoare pe 6 biți (26 = 64 de culori) Chipset Amiga original
    • Culoare pe 8 biți (28 = 256 culori) Stații de lucru Unix vechi, rezoluție joasă VGA, Super VGA, AGA
    • Culoare pe 12 biți (212 = 4.096 culori) unele sisteme Silicon Graphics, sisteme de culoare NeXTstation și sisteme în modul Amiga HAM.

    De exemplu, lucrăm în spațiul de culoare RGB. Aceasta înseamnă că există trei canale din care se formează culoarea finală a pixelului: canalul roșu (Rad), canalul verde (verde) și canalul albastru (albastru). Să presupunem că canalele sunt pe 4 biți. Aceasta înseamnă că fiecare canal are capacitatea de a afișa 16 culori. Ca rezultat, toate RGB vor fi pe 12 biți și vor putea fi afișate

    C = 16x16x16 = 4096 culori

    Adâncimea culorii în acest caz este de 12 biți.

    Când vorbim de RGB pe 24 de biți, ele înseamnă canale de 8 biți (256 de culori fiecare) cu un număr total de opțiuni de culoare per pixel

    C = 256x256x256 = 16777216 culori.

    Cifra este impresionantă. Acest număr de culori pentru fiecare pixel satisface cerințele celui mai exigent fotograf.

    Câteva despre formatele în sine.

    format TIFF

    TIFF înseamnă Tagged Image File Format și este un standard pentru industria de tipărire și tipărire.

    Ca urmare, se dovedește astfel:

    1. Dacă camera ta este atât de simplă încât filmează doar JPEG, și vrei să obții o calitate maximă, setează dimensiunea maximă și compresia minimă și nu te chinui cu faptul că nu ai alte formate. În cele mai multe cazuri, o imagine RAW realizată manual se potrivește cu o cameră JPEG capturată automat.

    2. Poate că nu ar trebui să faci fotografii în TIFF. Înregistrarea în acest format este mai dificilă și nu există nicio diferență vizibilă în comparație cu JPEG de înaltă calitate.

    3. Dacă aveți capacitatea de a face fotografii, lucrați cu el. Tu însuți vei simți dacă ți se potrivește. În unele cazuri, numai RAW face posibilă realizarea unei fotografii unice pentru o mărire ridicată la imprimare.

    Mai rămâne o soluție, s-ar putea spune universal. Există un mod care vă permite să luați cadre în două formate în același timp: RAW + JPEG. Capturați scene importante în acest mod. Stocarea modernă a informațiilor digitale - atât carduri de memorie, cât și hard disk-uri - vă permit să faceți acest lucru. În acest caz, obțineți un JPEG pentru a utiliza fotografia imediat, fără a pierde timp pentru revizuire. Și, dacă aveți nevoie de acesta, încredințați fișierul RAW unui specialist pentru procesare.

    Fotografia. Formate de fișiere.

    Este ușor de calculat că o imagine color necomprimată de 2000 * 1000 pixeli va avea o dimensiune de aproximativ 6 megaocteți. Dacă vorbim de imagini obținute de la camere sau scanere profesionale Rezoluție înaltă, atunci dimensiunea lor poate fi și mai mare. În ciuda creșterii rapide a capacității de stocare, diverși algoritmi de compresie a imaginii sunt încă foarte relevanți.
    Toți algoritmii existenți pot fi împărțiți în două clase mari:

    • Algoritmi de compresie fără pierderi;
    • Algoritmi de compresie cu pierderi.
    Când vorbim despre compresie fără pierderi, ne referim la faptul că există un algoritm care este opusul algoritmului de compresie, care vă permite să restaurați cu acuratețe imaginea originală. Nu există un algoritm invers pentru algoritmii de compresie cu pierderi. Există un algoritm care restabilește o imagine care nu se potrivește neapărat cu cea originală. Algoritmii de compresie și recuperare sunt selectați pentru a obține un raport de compresie ridicat, menținând în același timp calitatea vizuală a imaginii.

    Algoritmi de compresie fără pierderi

    Algoritmul RLE
    Toți algoritmii Seria RLE se bazează pe o idee foarte simplă: grupurile repetate de elemente sunt înlocuite cu o pereche (număr de repetări, element repetat). Să luăm în considerare acest algoritm folosind o secvență de biți ca exemplu. În această secvență, grupurile de zerouri și unu vor alterna. În plus, grupurile vor avea adesea mai mult de un element. Apoi, secvența 11111 000000 11111111 00 va corespunde următorului set de numere 5 6 8 2. Aceste numere indică numărul de repetări (numărarea începe de la unii), dar și aceste numere trebuie să fie codificate. Vom presupune că numărul de repetări este în intervalul de la 0 la 7 (adică 3 biți sunt suficienți pentru a codifica numărul de repetări). Apoi, secvența considerată mai sus este codificată de următoarea secvență de numere 5 6 7 0 1 2. Este ușor de calculat că sunt necesari 21 de biți pentru a codifica secvența originală, iar în cel comprimat metoda RLE această secvență durează 18 biți.
    Deși acest algoritm este foarte simplu, eficacitatea sa este relativ scăzută. Mai mult, în unele cazuri, utilizarea acestui algoritm nu duce la o scădere, ci la o creștere a lungimii secvenței. De exemplu, luați în considerare următoarea secvență 111 0000 11111111 00. Secvența RL corespunzătoare arată astfel: 3 4 7 0 1 2. Lungimea secvenței originale este de 17 biți, lungimea secvenței comprimate este de 18 biți.
    Acest algoritm este cel mai eficient pentru imaginile alb-negru. De asemenea, este adesea folosit ca una dintre etapele intermediare de compresie a algoritmilor mai complexi.

    Dicţionar algorithms

    Ideea din spatele algoritmilor de dicționar este că șirurile de elemente din secvența originală sunt codificate. În această codificare, se folosește un dicționar special, care este obținut din secvența originală.
    Există o întreagă familie de algoritmi de vocabular, dar ne vom uita la cel mai comun algoritm LZW, numit după dezvoltatorii săi Lepel, Ziv și Welch.
    Dicționarul din acest algoritm este un tabel care este umplut cu șiruri de codare pe măsură ce algoritmul rulează. La decodificarea codului comprimat, dicționarul este restaurat automat, deci nu este nevoie să transferați dicționarul împreună cu codul comprimat.
    Dicționarul este inițializat cu toate șirurile singleton, adică primele rânduri ale dicționarului reprezintă alfabetul în care codificăm. Compresiunea caută cel mai lung lanț deja scris în dicționar. De fiecare dată când se întâlnește un șir care nu a fost încă scris în dicționar, acesta este adăugat acolo și iese un cod comprimat corespunzător șirului deja scris în dicționar. În teorie, nu sunt impuse restricții cu privire la dimensiunea dicționarului, dar în practică are sens să se limiteze această dimensiune, deoarece în timp încep să apară lanțuri care nu se mai regăsesc în text. În plus, atunci când dimensiunea tabelului este dublată, trebuie să alocăm un bit în plus pentru stocarea codurilor comprimate. Pentru a evita astfel de situatii, se introduce un cod special care simbolizeaza initializarea tabelului de catre toate sirurile singleton.
    Să luăm în considerare un exemplu de compresie prin algoritm. Vom strânge sfoara cucului, cucul, cucul a cumpărat gluga. Să presupunem că dicționarul va conține 32 de poziții, ceea ce înseamnă că fiecare dintre codurile sale va lua 5 biți. Inițial, dicționarul este completat după cum urmează:

    Acest tabel este, atât pe partea celui care comprimă informația, cât și pe partea celui care despachetează. Acum ne vom uita la procesul de compresie.


    Tabelul arată procesul de completare a dicționarului. Este ușor de calculat că codul comprimat rezultat are 105 biți, iar textul original (presupunând că cheltuim 4 biți pentru a codifica un caracter) are 116 biți.
    De fapt, procesul de decodare se rezumă la decriptarea directă a codurilor, în timp ce este important ca tabelul să fie inițializat în același mod ca în timpul codificării. Acum să ne uităm la algoritmul de decodare.



    Putem defini complet șirul adăugat în dicționar la pasul i doar la i + 1. Evident, linia i-a trebuie să se termine cu primul caracter i + 1 al liniei. Acea. tocmai ne-am dat seama cum să restabilim un dicționar. Un oarecare interes este situația în care o secvență de forma cScSc este codificată, unde c este un caracter și S este un șir, iar cuvântul cS este deja în dicționar. La prima vedere, poate părea că decodorul nu va putea rezolva această situație, dar de fapt, toate liniile de acest tip trebuie să se termine întotdeauna cu același caracter cu care încep.

    Algoritmi de codare a entropiei
    Algoritmii din această serie atribuie cel mai scurt cod comprimat celor mai frecvente elemente de secvență. Acestea. secvențele de aceeași lungime sunt codificate cu coduri comprimate de lungimi diferite. Mai mult, cu cât secvența apare mai des, cu atât codul comprimat corespunzător este mai scurt.
    Algoritmul Huffman
    Algoritmul lui Huffman vă permite să construiți coduri de prefix. Vă puteți gândi la codurile de prefix ca pe căi pe un arbore binar: trecerea de la un nod la fiul său din stânga corespunde cu 0 în cod, iar fiul său din dreapta - 1. Dacă marchem frunzele arborelui cu caractere codificate, vom obține reprezentarea cod prefix ca arbore binar.
    Să descriem un algoritm pentru construirea unui arbore Huffman și obținerea codurilor Huffman.
  1. Caracterele din alfabetul de intrare formează o listă de noduri libere. Fiecare foaie are o greutate care este egală cu frecvența de apariție a simbolului
  2. Sunt selectate două noduri libere ale arborelui cu cele mai puține greutăți
  3. Părintele lor este creat cu o greutate egală cu greutatea lor totală
  4. Părintele este adăugat la lista de noduri libere, iar cei doi copii ai săi sunt eliminați din această listă
  5. Un arc care părăsește părintele i se atribuie bitul 1, celălalt - bitul 0
  6. Pașii începând cu al doilea se repetă până când în lista liberă rămâne un singur nod liber. El va fi considerat rădăcina copacului.
Folosind acest algoritm, putem obține coduri Huffman pentru un alfabet dat, ținând cont de frecvența de apariție a caracterelor.
Codare aritmetică
Algoritmii de codare aritmetică codifică șiruri de elemente în fracții. Aceasta ia în considerare distribuția de frecvență a elementelor. În prezent, algoritmii de codare aritmetică sunt protejați de brevete, așa că vom lua în considerare doar ideea de bază.
  • Tutorial

UPD. A fost forțat să elimine formatarea monospațiu. Într-o bună zi, habraparserul a încetat să mai perceapă formatarea din interiorul etichetelor pre și cod. Întregul text s-a transformat într-o mizerie. Administrația Habr nu m-a putut ajuta. Acum neuniform, dar cel puțin lizibil.

Te-ai întrebat vreodată cum funcționează un fișier jpg? Să ne dăm seama acum! Încălzește-ți compilatorul și editorul hexadecimal preferat, hai să decodificăm asta:

Am luat special un desen mai mic. Aceasta este favicon-ul Google familiar, dar puternic comprimat:

Vă avertizez imediat că descrierea este simplificată, iar informațiile furnizate nu sunt complete, dar ulterior va fi ușor de înțeles specificația.

Fără să știm măcar cum are loc codificarea, putem deja extrage ceva din fișier.
- marker de pornire. Se găsește întotdeauna la începutul tuturor fișierelor jpg.
Urmat de octeți ... Acesta este un marcator care marchează începutul secțiunii de comentarii. Următorii 2 octeți - lungimea secțiunii (inclusiv acești 2 octeți). Deci în următoarele două - comentariul în sine. Acestea sunt codurile pentru caracterele „:” și „)”, adică. emoticon obișnuit. Îl puteți vedea pe prima linie din partea dreaptă a editorului hexadecimal.

Un pic de teorie

Foarte pe scurt, în pași:
Să ne gândim la ordinea în care aceste date pot fi codificate. Să presupunem, mai întâi, complet, pentru întreaga imagine, canalul Y este codificat, apoi Cb, apoi Cr. Toată lumea își amintește că a încărcat imagini pe dial-up. Dacă ar fi codificate în acest fel, ar trebui să așteptăm ca întreaga imagine să se încarce înainte de a apărea pe ecran. De asemenea, va fi neplăcut dacă se pierde sfârșitul fișierului. Probabil că există și alte motive bune. Prin urmare, datele codificate sunt dispuse alternativ, în părți mici.

Permiteți-mi să vă reamintesc că fiecare bloc Y ij, Cb ij, Cr ij este o matrice de coeficienți DCT codificati cu coduri Huffman. În dosar sunt dispuse în următoarea ordine: Y 00 Y 10 Y 01 Y 11 Cb 00 Cr 00 Y 20

Citirea unui fișier

După ce am extras comentariul, ar trebui să fie ușor de înțeles că:
  • Fișierul este împărțit în sectoare precedate de markeri.
  • Markerii au lungimea de 2 octeți, cu primul octet.
  • Aproape toate sectoarele își stochează lungimea în următorii 2 octeți după marcator.
Pentru comoditate, să evidențiem marcatorii:
FF D8 FF FE 00 04 3A 29 FF DB 00 43 00 A0 6E 78



FF FF FF FF FF FF FF FF FF FF FF FF FF FF DB 00
43 01 AA B4 B4 F0 D2 F0 FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF C0 00 11 08 00 10 00 10 03 01 22 00 02
11 01 03 11 01 FF C4 00 15 00 01 01 00 00 00 00
00 00 00 00 00 00 00 00 00 00 03 02 FF C4 00 1A
10 01 00 02 03 01 00 00 00 00 00 00 00 00 00 00
00 01 00 12 02 11 31 21 FF C4 00 15 01 01 01 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 FF
C4 00 16 11 01 01 01 00 00 00 00 00 00 00 00 00
00 00 00 00 11 00 01 FF DA 00 0C 03 01 00 02 11
03 11 00 3F 00 AE E7 61 F2 1B D5 22 85 5D 04 3C
82 C8 48 B1 DC BF FF D9

Marker: DQT - tabel de cuantizare.

FF DB 00 43 00 A0 6E 78
8C 78 64 A0 8C 82 8C B4 AA A0 BE F0 FF FF F0 DC
DC F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF

Antetul secțiunii este întotdeauna de 3 octeți. În cazul nostru, așa este. Antetul este format din:
Lungime: 0x43 = 67 de octeți
Lungimea valorilor din tabel: 0 (0 - 1 octet, 1 - 2 octet)
[_0] ID tabel: 0
Restul de 64 de octeți trebuie să umple tabelul 8x8.



Aruncă o privire mai atentă la ordinea în care sunt completate valorile tabelului. Această ordine se numește ordine în zig-zag:

Marker: SOF0 - Baseline DCT

Acest marker se numește SOF0 și înseamnă că imaginea este codificată prin metoda de bază. Este foarte comun. Dar pe internet, nu mai puțin populară vă este familiară metoda progresivă, atunci când mai întâi o imagine este încărcată din rezolutie scazuta, și apoi o imagine normală. Acest lucru vă permite să înțelegeți ce este afișat acolo fără a aștepta o descărcare completă. Caietul de sarcini mai definește câteva metode, după cum mi se pare, nu foarte comune.

FF C0 00 11 08 00 10 00 10 03 01 22 00 02
11 01 03 11 01

Lungime: 17 octeți.
Precizie: 8 biți. În metoda de bază, este întotdeauna 8. După cum am înțeles, aceasta este adâncimea de biți a valorilor canalului.
Înălțimea modelului: 0x10 = 16
Lățimea modelului: 0x10 = 16
Număr de componente: 3. Cel mai adesea acestea sunt Y, Cb, Cr.

Prima componenta:
ID: 1
Diluare orizontală (H 1): 2
[_2] Decimarea verticală (V 1): 2
ID tabel de cuantizare: 0

componenta a doua:
ID: 2
Diluare orizontală (H 2): 1
[_1] Rărirea verticală (V 2): 1

a treia componenta:
ID: 3
Diluare orizontală (H 3): 1
[_1] Rărirea verticală (V 3): 1
ID tabel de cuantizare: 1

Acum vedeți cum să determinați cât de subțire este imaginea. Aflați H max = 2 și V max = 2. Canalul i va fi tăiat în H max / H i ori orizontal și V max / V i ori vertical.

Marcator: DHT (tabelul Huffman)

Această secțiune stochează coduri și valori obținute prin codarea Huffman.

FF C4 00 15 00 01 01 00 00 00 00
00 00 00 00 00 00 00 00 00 00 03 02

lungime: 21 de octeți.
clasa: 0 (0 - tabelul coeficienților DC, 1 - tabelul coeficienților AC).
[_0] ID tabel: 0
Lungimea codului Huffman: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Numar de coduri:
Numărul de coduri înseamnă numărul de coduri de lungimea respectivă. Rețineți că secțiunea stochează doar lungimile codurilor, nu codurile în sine. Trebuie să găsim codurile noi înșine. Deci, avem un cod de lungime 1 și unul - de lungime 2. Sunt 2 coduri în total, nu mai există coduri în acest tabel.
Fiecărui cod este asociată o valoare și acestea sunt listate în continuare în fișier. Valorile sunt pe un singur octet, deci citim 2 octeți.
- valoarea primului cod.
- valoarea celui de-al 2-lea cod.

Construirea unui arbore de cod Huffman

Trebuie să construim un arbore binar din tabelul pe care l-am primit în secțiunea DHT. Și deja după acest arbore recunoaștem fiecare cod. Adăugăm valorile în ordinea în care sunt indicate în tabel. Algoritmul este simplu: indiferent unde ne aflăm, încercăm întotdeauna să adăugăm o valoare ramurii din stânga. Și dacă e ocupată, atunci la dreapta. Iar dacă nu este loc acolo, atunci ne întoarcem la un nivel superior și încercăm de acolo. Trebuie să vă opriți la un nivel egal cu lungimea codului. Ramurile din stânga corespund cu 0, ramurile din dreapta - 1.
Cometariu:
Nu trebuie să începi de fiecare dată de sus. Valoare adăugată - reveniți cu un nivel în sus. Există ramura potrivită? Dacă da, urcă din nou. Dacă nu, creați ramura potrivită și navigați acolo. Apoi, de acolo, începeți căutarea pentru a adăuga următoarea valoare.

Arbori pentru toate tabelele din acest exemplu:


UPD (mulțumesc): Nodurile primului arbore (DC, id = 0) trebuie să aibă valorile 0x03 și 0x02

În cercuri - valorile codurilor, sub cercuri - codurile în sine (voi explica că le-am primit, mergând de sus la fiecare nod). Cu astfel de coduri (din acesta și alte tabele) este codificat conținutul figurii în sine.

Marcator: SOS (Start of Scan)

Octetul din marker înseamnă „DA! În cele din urmă, am trecut direct la analizarea secțiunii de imagini codificate! ". Cu toate acestea, secțiunea se numește simbolic SOS.

& nbsp FF DA 00 0C 03 01 00 02 11
03 11 00 3F 00

Lungimea părții antet (nu a întregii secțiuni): 12 octeți.
Numărul de componente de scanare. Avem 3, unul pentru Y, Cb, Cr.

Prima componenta:
Număr piesă imagine: 1 (Y)
ID tabel Huffman pentru coeficienții DC: 0
[_0] ID tabel Huffman pentru coeficienții AC: 0

componenta a doua:
Număr piesă imagine: 2 (Cb)

[_1]

a treia componenta:
Număr componentă a imaginii: 3 (Cr)
ID tabel Huffman pentru coeficienții DC: 1
[_1] ID tabel Huffman pentru coeficienții AC: 1

Aceste componente se alternează ciclic.

Aici se termină partea antetului, de aici până la sfârșitul (markerul) datelor codificate.


0

Aflarea coeficientului DC.
1. Citirea unei secvențe de biți (dacă întâlnim 2 octeți, atunci acesta nu este un marker, ci doar un octet)... După fiecare bit, ne deplasăm de-a lungul arborelui Huffman (cu identificatorul corespunzător) de-a lungul ramurilor 0 sau 1, în funcție de bitul citit. Ne oprim dacă suntem în nodul final.
10 1011101110011101100001111100100

2. Luăm valoarea nodului. Dacă este 0, atunci coeficientul este 0, îl notăm în tabel și trecem la citirea altor coeficienți. În cazul nostru - 02. Această valoare este lungimea coeficientului în biți. Adică citim următorii 2 biți, acesta va fi coeficientul.
10 10 11101110011101100001111100100

3. Dacă prima cifră a valorii în binar este 1, atunci o lăsăm așa cum este: DC_coef = valoare. În caz contrar, transformăm: DC_coef = valoare-2 lungimea valorii +1. Scriem coeficientul în tabel la începutul zigzagului - colțul din stânga sus.

Găsirea coeficienților AC.
1. Similar cu articolul 1, găsirea coeficientului DC. Continuăm să citim secvența:
10 10 1110 1110011101100001111100100

2. Luăm valoarea nodului. Dacă este egal cu 0, înseamnă că valorile rămase ale matricei trebuie să fie umplute cu zerouri. Apoi următoarea matrice este codificată. Primii care au citit până aici și mi-au scris despre asta într-un personal, vor primi un plus în karma. În cazul nostru, valoarea nodului este 0x31.
Prima ciugulire: 0x3 - iată câte zerouri trebuie să adăugăm la matrice. Aceștia sunt 3 coeficienți zero.
Al doilea nibble: 0x1 - lungimea coeficientului în biți. Citim următorul fragment.
10 10 1110 1 110011101100001111100100

3. Similar cu articolul 3 al găsirii coeficientului DC.

După cum ați înțeles deja, trebuie să citiți coeficienții AC până când găsim o valoare de cod zero sau până când matricea este umplută.
În cazul nostru, obținem:
10 10 1110 1 1100 11 101 10 0 0 0 1 11110 0 100
si matricea:





Ați observat că valorile sunt completate în aceeași ordine în zig-zag?
Motivul pentru utilizarea acestei ordine este simplu - cu cât valorile lui v și u sunt mai mari, cu atât coeficientul S vu în transformarea cosinus discretă este mai puțin semnificativ. Prin urmare, la rapoarte de compresie ridicate, coeficienții nesemnificativi sunt reduși la zero, reducând astfel dimensiunea fișierului.

[-4 1 1 1 0 0 0 0] [ 5 -1 1 0 0 0 0 0]
[ 0 0 1 0 0 0 0 0] [-1 -2 -1 0 0 0 0 0]
[ 0 -1 0 0 0 0 0 0] [ 0 -1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [-1 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

[-4 2 2 1 0 0 0 0]
[-1 0 -1 0 0 0 0 0]
[-1 -1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

Oh, am uitat să spun că coeficienții DC codificați nu sunt coeficienții DC în sine, ci diferențele lor între coeficienții din tabelul anterior (același canal)! Este necesar să corectați matricele:
DC pentru al doilea: 2 + (-4) = -2
DC pentru a treia: -2 + 5 = 3
DC pentru al patrulea: 3 + (-4) = -1

[-2 1 1 1 0 0 0 0] [ 3 -1 1 0 0 0 0 0] [-1 2 2 1 0 0 0 0]
………

Acum e ordine. Această regulă durează până la sfârșitul fișierului.

... și prin matrice pentru Cb și Cr:

[-1 0 0 0 0 0 0 0]
[ 1 1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

Deoarece aici există o singură matrice, coeficienții DC pot fi lăsați în pace.

Calcule

Cuantizarea

Vă amintiți că matricea trece prin etapa de cuantizare? Elementele matricei trebuie înmulțite termen cu termen cu elementele matricei de cuantizare. Rămâne să-l alegi pe cel de care ai nevoie. În primul rând, am scanat prima componentă, componenta sa imagine = 1. Componenta imagine cu acest identificator folosește matricea de cuantizare 0 (o avem prima dintre cele două). Deci, după înmulțire:


[ 0 120 280 0 0 0 0 0]
[ 0 -130 -160 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

În mod similar, obținem încă 3 matrice ale canalului Y...

[-320 110 100 160 0 0 0 0] [ 480 -110 100 0 0 0 0 0]
[ 0 0 140 0 0 0 0 0] [-120 -240 -140 0 0 0 0 0]
[ 0 -130 0 0 0 0 0 0] [ 0 -130 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [-140 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

[-160 220 200 160 0 0 0 0]
[-120 0 -140 0 0 0 0 0]
[-140 -130 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

... și prin matrice pentru Cb și Cr.

[-170 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 180 210 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

Transformată cosinus discretă inversă

Formula nu ar trebui să fie dificilă *. S vu este matricea noastră de coeficienți rezultată. u este o coloană, v este un rând. s yx - valorile canalului direct.

* În general, acest lucru nu este în întregime adevărat. Când am reușit să decodez și să afișez pe ecran imaginea de 16x16, am luat o imagine de 600x600 (apropo, era coperta albumului preferat al lui Mind.In.A.Box, Lost Alone). Nu a funcționat imediat - au apărut diverse bug-uri. În curând am putut admira poza încărcată corect. Doar viteza de descărcare a fost foarte supărătoare. Încă îmi amintesc că a durat 7 secunde. Dar acest lucru nu este surprinzător, dacă utilizați fără gânduri formula de mai sus, atunci pentru a calcula un canal de un pixel, va trebui să găsiți 128 cosinus, 768 înmulțiri și unele adunări acolo. Gândește-te doar la asta - aproape o mie de operații dificile pe un singur canal de un pixel! Din fericire, există loc de optimizare (după o mulțime de experimente, am redus timpul de încărcare până la limita de 15 ms acuratețe a cronometrului, iar după aceea am schimbat imaginea într-o fotografie de 25 de ori mai mare. Poate voi scrie despre asta într-o altă formă separată). articol).

Voi scrie rezultatul calculării numai a primei matrice a canalului Y (valorile sunt rotunjite):


[ 87 72 50 36 37 55 79 95]
[-10 5 31 56 71 73 68 62]
[-87 -50 6 56 79 72 48 29]

Și restul de 2:
Cb Cr
[ 60 52 38 20 0 -18 -32 -40] [ 19 27 41 60 80 99 113 120]
[ 48 41 29 13 -3 -19 -31 -37] [ 0 6 18 34 51 66 78 85]
[ 25 20 12 2 -9 -19 -27 -32] [-27 -22 -14 -4 7 17 25 30]
[ -4 -6 -9 -13 -17 -20 -23 -25] [-43 -41 -38 -34 -30 -27 -24 -22]
[ -37 -35 -33 -29 -25 -21 -18 -17] [-35 -36 -39 -43 -47 -51 -53 -55]
[ -67 -63 -55 -44 -33 -22 -14 -10] [ -5 -9 -17 -28 -39 -50 -58 -62]
[ -90 -84 -71 -56 -39 -23 -11 -4] [ 32 26 14 -1 -18 -34 -46 -53]
[-102 -95 -81 -62 -42 -23 -9 -1] [ 58 50 36 18 -2 -20 -34 -42]

  1. Oh, hai să mâncăm!
  2. Da, nu intru deloc, despre ce este vorba.
  3. Odată ce valorile culorii YCbCr sunt primite, rămâne să convertiți în RGB, astfel: YCbCrToRGB (Y ij, Cb ij, Cr ij), Y ij, Cb ij, Cr ij - matricele noastre rezultate.
  4. 4 matrice Y și câte una Cb și Cr, deoarece am subțiat canalele și 4 pixeli din Y corespund unui Cb și Cr. Prin urmare, calculați astfel: YCbCrToRGB (Y ij, Cb, Cr)
Dacă ai ales 1 și 4, atunci mă bucur pentru tine. Ori ați înțeles bine, ori vă veți bucura de masa în curând.

YCbCr la RGB

R = Y + 1,402 * Cr
G = Y - 0,34414 * Cb - 0,71414 * Cr
B = Y + 1,772 * Cb
Nu uitați să adăugați 128. Dacă valorile sunt în afara intervalului, atunci atribuiți valorile limită. Formula este simplă, dar consumă și o fracțiune din timpul CPU.

Iată tabelele rezultate pentru canalele R, G, B pentru pătratul 8x8 din stânga sus al exemplului nostru:
255 248 194 148 169 215 255 255
255 238 172 115 130 178 255 255
255 208 127 59 64 112 208 255
255 223 143 74 77 120 211 255
237 192 133 83 85 118 184 222
177 161 146 132 145 162 201 217
56 73 101 126 144 147 147 141
0 17 76 126 153 146 127 108

231 185 117 72 67 113 171 217
229 175 95 39 28 76 139 189
254 192 100 31 15 63 131 185
255 207 115 46 28 71 134 185
255 241 175 125 112 145 193 230
226 210 187 173 172 189 209 225
149 166 191 216 229 232 225 220
72 110 166 216 238 231 206 186

255 255 249 203 178 224 255 255
255 255 226 170 140 187 224 255
255 255 192 123 91 138 184 238
255 255 208 139 103 146 188 239
255 255 202 152 128 161 194 232
255 244 215 200 188 205 210 227
108 125 148 172 182 184 172 167
31 69 122 172 191 183 153 134

Sfârșit

În general, nu sunt un specialist JPEG, așa că cu greu pot răspunde la toate întrebările. Doar că atunci când îmi scriam decodorul, trebuia adesea să mă ocup de diverse probleme de neînțeles... Și când imaginea a fost afișată incorect, nu știam unde am făcut o greșeală. Poate că a interpretat greșit părțile, sau poate că a folosit greșit DCT. Am ratat un exemplu pas cu pas, așa că sper că acest articol vă va ajuta când scrieți un decodor. Cred că acoperă descrierea metodei de bază, dar totuși nu o poți face doar. Iată câteva link-uri care m-au ajutat:

Este ușor de calculat că o imagine color necomprimată de 2000 * 1000 pixeli va avea o dimensiune de aproximativ 6 megaocteți. Dacă vorbim de imagini obținute de la camere profesionale sau scanere de înaltă rezoluție, atunci dimensiunea acestora poate fi și mai mare. În ciuda creșterii rapide a capacității de stocare, diverși algoritmi de compresie a imaginii sunt încă foarte relevanți.
Toți algoritmii existenți pot fi împărțiți în două clase mari:

  • Algoritmi de compresie fără pierderi;
  • Algoritmi de compresie cu pierderi.
Când vorbim despre compresie fără pierderi, ne referim la faptul că există un algoritm care este opusul algoritmului de compresie, care vă permite să restaurați cu acuratețe imaginea originală. Nu există un algoritm invers pentru algoritmii de compresie cu pierderi. Există un algoritm care restabilește o imagine care nu se potrivește neapărat cu cea originală. Algoritmii de compresie și recuperare sunt selectați pentru a obține un raport de compresie ridicat, menținând în același timp calitatea vizuală a imaginii.

Algoritmi de compresie fără pierderi

Algoritmul RLE
Toți algoritmii din seria RLE se bazează pe o idee foarte simplă: grupurile repetate de elemente sunt înlocuite cu o pereche (număr de repetări, element care se repetă). Să luăm în considerare acest algoritm folosind o secvență de biți ca exemplu. În această secvență, grupurile de zerouri și unu vor alterna. În plus, grupurile vor avea adesea mai mult de un element. Apoi, secvența 11111 000000 11111111 00 va corespunde următorului set de numere 5 6 8 2. Aceste numere indică numărul de repetări (numărarea începe de la unii), dar și aceste numere trebuie să fie codificate. Vom presupune că numărul de repetări este în intervalul de la 0 la 7 (adică 3 biți sunt suficienți pentru a codifica numărul de repetări). Apoi, secvența considerată mai sus este codificată de următoarea secvență de numere 5 6 7 0 1 2. Este ușor de calculat că sunt necesari 21 de biți pentru a codifica secvența originală, iar în forma comprimată RLE această secvență are 18 biți.
Deși acest algoritm este foarte simplu, eficacitatea sa este relativ scăzută. Mai mult, în unele cazuri, utilizarea acestui algoritm nu duce la o scădere, ci la o creștere a lungimii secvenței. De exemplu, luați în considerare următoarea secvență 111 0000 11111111 00. Secvența RL corespunzătoare arată astfel: 3 4 7 0 1 2. Lungimea secvenței originale este de 17 biți, lungimea secvenței comprimate este de 18 biți.
Acest algoritm este cel mai eficient pentru imaginile alb-negru. De asemenea, este adesea folosit ca una dintre etapele intermediare de compresie a algoritmilor mai complexi.

Dicţionar algorithms

Ideea din spatele algoritmilor de dicționar este că șirurile de elemente din secvența originală sunt codificate. În această codificare, se folosește un dicționar special, care este obținut din secvența originală.
Există o întreagă familie de algoritmi de vocabular, dar ne vom uita la cel mai comun algoritm LZW, numit după dezvoltatorii săi Lepel, Ziv și Welch.
Dicționarul din acest algoritm este un tabel care este umplut cu șiruri de codare pe măsură ce algoritmul rulează. La decodificarea codului comprimat, dicționarul este restaurat automat, deci nu este nevoie să transferați dicționarul împreună cu codul comprimat.
Dicționarul este inițializat cu toate șirurile singleton, adică primele rânduri ale dicționarului reprezintă alfabetul în care codificăm. Compresiunea caută cel mai lung lanț deja scris în dicționar. De fiecare dată când se întâlnește un șir care nu a fost încă scris în dicționar, acesta este adăugat acolo și iese un cod comprimat corespunzător șirului deja scris în dicționar. În teorie, nu sunt impuse restricții cu privire la dimensiunea dicționarului, dar în practică are sens să se limiteze această dimensiune, deoarece în timp încep să apară lanțuri care nu se mai regăsesc în text. În plus, atunci când dimensiunea tabelului este dublată, trebuie să alocăm un bit în plus pentru stocarea codurilor comprimate. Pentru a evita astfel de situatii, se introduce un cod special care simbolizeaza initializarea tabelului de catre toate sirurile singleton.
Să luăm în considerare un exemplu de compresie prin algoritm. Vom strânge sfoara cucului, cucul, cucul a cumpărat gluga. Să presupunem că dicționarul va conține 32 de poziții, ceea ce înseamnă că fiecare dintre codurile sale va lua 5 biți. Inițial, dicționarul este completat după cum urmează:

Acest tabel este, atât pe partea celui care comprimă informația, cât și pe partea celui care despachetează. Acum ne vom uita la procesul de compresie.

Tabelul arată procesul de completare a dicționarului. Este ușor de calculat că codul comprimat rezultat are 105 biți, iar textul original (presupunând că cheltuim 4 biți pentru a codifica un caracter) are 116 biți.
De fapt, procesul de decodare se rezumă la decriptarea directă a codurilor, în timp ce este important ca tabelul să fie inițializat în același mod ca în timpul codificării. Acum să ne uităm la algoritmul de decodare.


Putem defini complet șirul adăugat în dicționar la pasul i doar la i + 1. Evident, linia i-a trebuie să se termine cu primul caracter i + 1 al liniei. Acea. tocmai ne-am dat seama cum să restabilim un dicționar. Un oarecare interes este situația în care o secvență de forma cScSc este codificată, unde c este un caracter și S este un șir, iar cuvântul cS este deja în dicționar. La prima vedere, poate părea că decodorul nu va putea rezolva această situație, dar de fapt, toate liniile de acest tip trebuie să se termine întotdeauna cu același caracter cu care încep.

Algoritmi de codare a entropiei
Algoritmii din această serie atribuie cel mai scurt cod comprimat celor mai frecvente elemente de secvență. Acestea. secvențele de aceeași lungime sunt codificate cu coduri comprimate de lungimi diferite. Mai mult, cu cât secvența apare mai des, cu atât codul comprimat corespunzător este mai scurt.
Algoritmul Huffman
Algoritmul lui Huffman vă permite să construiți coduri de prefix. Vă puteți gândi la codurile de prefix ca pe căi pe un arbore binar: trecerea de la un nod la fiul său din stânga corespunde cu 0 în cod, iar fiul său din dreapta - 1. Dacă marchem frunzele arborelui cu caractere codificate, vom obțineți o reprezentare în arbore binar a codului de prefix.
Să descriem un algoritm pentru construirea unui arbore Huffman și obținerea codurilor Huffman.
  1. Caracterele din alfabetul de intrare formează o listă de noduri libere. Fiecare foaie are o greutate care este egală cu frecvența de apariție a simbolului
  2. Sunt selectate două noduri libere ale arborelui cu cele mai puține greutăți
  3. Părintele lor este creat cu o greutate egală cu greutatea lor totală
  4. Părintele este adăugat la lista de noduri libere, iar cei doi copii ai săi sunt eliminați din această listă
  5. Un arc care părăsește părintele i se atribuie bitul 1, celălalt - bitul 0
  6. Pașii începând cu al doilea se repetă până când în lista liberă rămâne un singur nod liber. El va fi considerat rădăcina copacului.
Folosind acest algoritm, putem obține coduri Huffman pentru un alfabet dat, ținând cont de frecvența de apariție a caracterelor.
Codare aritmetică
Algoritmii de codare aritmetică codifică șiruri de elemente în fracții. Aceasta ia în considerare distribuția de frecvență a elementelor. În prezent, algoritmii de codare aritmetică sunt protejați de brevete, așa că vom lua în considerare doar ideea de bază.
Să fie alfabetul nostru format din N simboluri a1,…, aN, iar frecvențele de apariție a acestora sunt p1,…, respectiv pN. Să împărțim jumătatea de interval)

Top articole similare