Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Windows 7, XP
  • JPEG, JPEG2000, JPEG-LS. Compresie de imagine cu pierderi și fără pierderi

JPEG, JPEG2000, JPEG-LS. Compresie de imagine cu pierderi și fără pierderi

Fotografiile și imaginile diferă unele de altele nu numai prin conținut, ci și prin alte caracteristici „computer”. De exemplu, după mărime.

Se întâmplă că par să existe două desene identice, dar unul este de trei ori mai mare decât celălalt.

Imaginile diferă și ca calitate. Cred că ați întâlnit de mai multe ori fotografii de o calitate extrem de slabă. Acest lucru este vizibil cu ochiul liber. De exemplu, doi fotografii identice, dar unul este de calitate mai bună, iar celălalt este de calitate mai proastă.

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

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

De fapt, imaginile vin într-o varietate de formate. Și sunt foarte, foarte mulți dintre ei. Nu le vom lua în considerare pe toate, ci vom vorbi 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 ai. 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 așa cum mi-aș dori - mai estompată, neclară.

Așa e cu formatele de imagine. Unii lasă toate culorile, în timp ce alții le taie pe unele. Și uneori acest lucru face ca imaginea să se deterioreze.

Acesta este un exemplu destul de dur. De fapt, totul este ceva mai complicat, dar cred că ai înțeles ideea principală.

Formate comune de imagine

BMP este un format pentru desenele realizate în programul Paint. Poate fi folosit pentru a stoca imagini 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 socială, aceasta trebuie să fie de alt tip - gif, jpg sau png.

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

JPG este un format pentru fotografii și picturi cu un număr mare de culori. Puteți salva o imagine în ea atât fără pierderea calității, cât și cu pierdere.

PNG este un format modern de imagine. Se obține acest tip de imagine mărime mică si fara pierderi de calitate. Foarte comod: fișierul este mic și calitatea este bună. De asemenea, susține transparența.

TIFF - imaginile sunt foarte calitate bună, fără compresie Prin urmare, dimensiunea unor astfel de fișiere este uriașă. TIFF este folosit atunci când calitatea este de 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 pe computer.
  • GIF - dacă o animație sau un desen cu un număr mic de culori pentru publicare pe Internet.
  • PNG - dacă aceasta este o imagine care are multe culori sau unele părți transparente.
  • JPG (jpeg) - dacă este o fotografie.
  • TIFF - imagine pentru tipărire (cărți de vizită, broșuri, postere etc.).

Bună, dragi prieteni. Astăzi vom vorbi despre ce format de imagine este cel mai bine de utilizat pe site, ce formate de fișiere grafice sunt disponibile astăzi pentru site și dacă este necesar să se urmărească noi formate grafice.

Primesc destul de multe întrebări de genul acesta; mulți dintre studenții mei întreabă dacă pot folosi noile formate SVG și WebP și unde este cel mai bun loc pentru a folosi aceste imagini. Desigur, puteți folosi formate noi, trebuie doar să înțelegeți ce format este mai potrivit pentru ce.

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

Imaginile neoptimizate sunt unul dintre factorii care încetinesc un site web, așa cum indică serviciile de verificare.

Prin urmare, va trebui întotdeauna să alegeți ce format să alegeți pentru imagine. Mărimea și calitatea acestuia vor depinde de acest lucru. Și să folosești imagini dimensiune mai micăși fără a pierde calitatea, ar trebui să știi câteva lucruri.

Ce imagini pentru site-uri folosesc astăzi?

Toate imaginile pentru site-uri web sunt împărțite în:

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

Raster Imaginile sunt formate din pixeli care stochează valori de culoare și transparență. Aceste formate includ 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 imaginilor raster este că nu se scalează bine.

Adică, atunci când dimensiunea imaginii crește, are loc o pierdere a calității.

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

Toate aceste imagini pot și sunt folosite 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 poze pe site.

Imaginile în acest format sunt optimizate destul de bine, practic 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ă reduce 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 cu afișarea pe site-uri.

Marele dezavantaj al acestui format este lipsa de transparență. Adică nu va fi posibilă combinarea imaginilor în acest format. Pentru astfel de sarcini este mai bine să utilizați următorul format.

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 diverse imagini Pe net. Datorită transparenței, vă permite să creați imagini combinate. Adesea folosit pentru a crea butoane și pictograme animate unde este necesar un efect de transparență.

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

Formatul este, de asemenea, acceptat de toate browserele și dispozitivele, asigurându-se că poate fi 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ă în crearea de bannere, butoane, pictograme și așa mai departe.

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

Î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 perfect potrivite cerințelor privind viteza de încărcare și adaptabilitatea site-ului web.

SVG

Este un format de fișier vectorial 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 problemele cu afișajul încă apar.

Acest format este cel mai des folosit pentru imagini simple, cum ar fi logo-uri, elemente de design și așa mai departe. Nu este potrivit pentru fotografii.

Formatul SVG este ușor, foarte scalabil, oferind imagini clare pe orice rezoluție a ecranului, acceptă animație, poate fi controlat prin CSS și plasat în HTML, reducând numărul de solicitări.

WebP

Un format open source dezvoltat de Google special pentru Internet. Astăzi, YouTube utilizează conversia miniaturii video în WebP.

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

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

Există modalități de a evita aceste restricții, dar ele împiedică utilizarea formatului peste tot.

Concluzie

Prieteni, sper că am explicat totul clar și 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 suport 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.

Asta e tot pentru azi, astept comentariile voastre.

Salutări, Maxim Zaitsev.

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

    Formatul de fișier în care este stocată o imagine este în esență un compromis între calitatea imaginii și dimensiunea fișierului.

    Probabil că știi deja asta imagine raster este format din pixeli. Modul în care este organizat un fișier raster și sub ce formă sunt stocate informațiile despre pixeli în el determină formatul fișierului. Calitatea imaginii unui fișier raster este determinată de doi parametri principali: dimensiunea pixelilor (adică numărul total de pixeli) și acuratețea culorii pixelului în reprezentarea culorii reale.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 reproducerii culorilor depinde de numărul de culori per pixel sau de adâncimea culorii.

    Adâncimea culorii (calitate de redare a culorii, adâncimea de biți a imaginii) - cantitatea de memorie în numărul de biți utilizat pentru stocarea și reprezentarea culorii la codificarea unui pixel grafică raster sau imagini video. Numărul de biți indică numărul de gradări (pași de ton) 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 de 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, gradație gri Urmatoarea statie
    • 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ă, ca standard VGA de înaltă rezoluție
    • 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, VGA cu rezoluție joasă, Super VGA, AGA
    • Culoare pe 12 biți (212 = 4.096 culori) pe unele sisteme Silicon Graphics, sisteme 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 patru 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 oamenii vorbesc despre RGB pe 24 de biți, se referă la canale pe 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 pretențios 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, iată ce se întâmplă:

    1. Dacă camera dvs. este atât de simplă încât înregistrează doar JPEG și doriți să obțineți calitate maxima, seteaza dimensiunea maxima si compresia minima si nu te chinui cu faptul ca nu ai alte formate. În cele mai multe cazuri, o imagine RAW redată manual se potrivește cu JPEG capturat automat de cameră.

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

    3. Dacă aveți ocazia să faceți poze în , lucrați cu el. Vei simți singur dacă este potrivit pentru tine. În unele cazuri, numai RAW face posibilă realizarea fotografie unică pentru mărire mare 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 simultan: RAW+ JPEG. Filmați scene importante în acest mod. Stocarea digitală modernă a informațiilor - atât cardurile de memorie, cât și hard disk-urile - fac posibil acest lucru. În acest caz, primiți un JPEG pentru a utiliza fotografia imediat, fără a pierde timp pentru revizuire. Și, dacă aveți nevoie de acest lucru, încredințați fișierul RAW unui specialist pentru procesare.

    Fotografie. Formate de fișiere.

    Este ușor de calculat că o imagine color necomprimată cu o dimensiune 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 dispozitivelor 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 invers al algoritmului de compresie care vă permite să restaurați cu acuratețe imaginea originală. Pentru algoritmi de compresie cu pierderi algoritm invers nu exista. 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 exemplul unei secvențe de biți. Această secvență va alterna grupuri de zerouri și unu. Î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 se află î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În formă, această secvență are 18 biți.
    Deși acest algoritm este foarte simplu, eficiența 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ă lanțurile de elemente ale secvenței originale sunt codificate. Această codificare folosește un dicționar special, care este obținut pe baza secvenței originale.
    Există o întreagă familie de algoritmi de dicționar, 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 lanțuri de codare pe măsură ce algoritmul rulează. Când codul comprimat este decodat, dicționarul este restaurat automat, astfel încât nu este nevoie să transmiteț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. În timpul compresiei, se face o căutare pentru cel mai lung lanț deja înregistrat în dicționar. De fiecare dată când se întâlnește un lanț care nu a fost încă scris în dicționar, acesta este adăugat acolo și iese un cod comprimat corespunzător lanțului 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 dublem dimensiunea tabelului, trebuie să alocăm un bit în plus pentru a stoca coduri comprimate. Pentru a preveni astfel de situații, se introduce cod special, simbolizând inițializarea tabelului cu toate lanțurile singleton.
    Să ne uităm la un exemplu de algoritm de compresie. Vom comprima linia cuccuckoocuckoohood. Să presupunem că dicționarul va conține 32 de poziții, ceea ce înseamnă că fiecare dintre codurile sale va ocupa 5 biți. Inițial, dicționarul este completat după cum urmează:

    Acest tabel există atât de partea celui care comprimă informația, cât și de partea celui care o decomprimă. 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 durează 105 biți, iar textul original (presupunând că cheltuim 4 biți pentru codificarea unui caracter) are 116 biți.
    În esență, procesul de decodare se reduce la decodarea directă a codurilor și 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-a doar la i+1. Evident, linia i-a trebuie să se termine cu primul caracter al liniei i+1. Acea. Tocmai ne-am dat seama cum să restabilim un dicționar. Un oarecare interes este situația când este codificată o secvență de forma cScSc, 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 statistică
    Algoritmii din această serie atribuie cel mai scurt cod comprimat celor mai frecvente elemente ale secvențelor. Acestea. secvențele de aceeași lungime sunt codificate cu coduri comprimate de lungimi diferite. Mai mult, cu cât apare mai des o secvență, cu atât codul comprimat corespunzător este mai scurt.
    Algoritmul Huffman
    Algoritmul Huffman vă permite să construiți coduri de prefix. Ne putem gândi la coduri de prefix ca fiind căi într-un arbore binar: trecerea de la un nod la fiul său din stânga corespunde unui 0 în cod, iar fiului său din dreapta corespunde unui 1. Dacă etichetăm frunzele arborelui cu simbolurile pentru a fi codificat, obținem reprezentarea cod prefix sub forma unui arbore binar.
    Să descriem algoritmul pentru construirea unui arbore Huffman și obținerea codurilor Huffman.
  1. Caracterele alfabetului 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 de arbore libere cu cele mai mici 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, celuilalt i se atribuie bitul 0
  6. Pașii începând cu al doilea se repetă până când un singur nod liber rămâne în lista nodurilor libere. Aceasta 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 într-o fracție. În acest caz, se ia în considerare distribuția de frecvență a elementelor. În prezent, algoritmii de codare aritmetică sunt protejați de brevete, așa că ne vom uita doar la ideea de bază.

Este ușor de calculat că o imagine color necomprimată cu o dimensiune 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 dispozitivelor 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 invers al 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 exemplul unei secvențe de biți. Această secvență va alterna grupuri de zerouri și unu. Î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 se află î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 discutată mai sus este codificată de următoarea secvență de numere 5 6 7 0 1 2. Este ușor de calculat că codificarea secvenței originale necesită 21 de biți, iar în formă comprimată RLE această secvență are 18 biți.
Deși acest algoritm este foarte simplu, eficiența 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ă lanțurile de elemente ale secvenței originale sunt codificate. Această codificare folosește un dicționar special, care este obținut pe baza secvenței originale.
Există o întreagă familie de algoritmi de dicționar, 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 lanțuri de codare pe măsură ce algoritmul rulează. Când codul comprimat este decodat, dicționarul este restaurat automat, astfel încât nu este nevoie să transmiteț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. În timpul compresiei, se face o căutare pentru cel mai lung lanț deja înregistrat în dicționar. De fiecare dată când se întâlnește un lanț care nu a fost încă scris în dicționar, acesta este adăugat acolo și iese un cod comprimat corespunzător lanțului 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 dublem dimensiunea tabelului, trebuie să alocăm un bit în plus pentru a stoca coduri comprimate. Pentru a preveni astfel de situații, se introduce un cod special, simbolizând inițializarea tabelului cu toate lanțurile cu un singur element.
Să ne uităm la un exemplu de algoritm de compresie. Vom comprima linia cuccuckoocuckoohood. Să presupunem că dicționarul va conține 32 de poziții, ceea ce înseamnă că fiecare dintre codurile sale va ocupa 5 biți. Inițial, dicționarul este completat după cum urmează:

Acest tabel există atât de partea celui care comprimă informația, cât și de partea celui care o decomprimă. 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 durează 105 biți, iar textul original (presupunând că cheltuim 4 biți pentru codificarea unui caracter) are 116 biți.
În esență, procesul de decodare se reduce la decodarea directă a codurilor și 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-a doar la i+1. Evident, linia i-a trebuie să se termine cu primul caracter al liniei i+1. Acea. Tocmai ne-am dat seama cum să restabilim un dicționar. Un oarecare interes este situația când este codificată o secvență de forma cScSc, 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 statistică
Algoritmii din această serie atribuie cel mai scurt cod comprimat celor mai frecvente elemente ale secvențelor. Acestea. secvențele de aceeași lungime sunt codificate cu coduri comprimate de lungimi diferite. Mai mult, cu cât apare mai des o secvență, cu atât codul comprimat corespunzător este mai scurt.
Algoritmul Huffman
Algoritmul Huffman vă permite să construiți coduri de prefix. Ne putem gândi la coduri de prefix ca fiind căi într-un arbore binar: trecerea de la un nod la fiul său din stânga corespunde unui 0 în cod, iar fiului său din dreapta corespunde unui 1. Dacă etichetăm frunzele arborelui cu simbolurile pentru a fi codificat, obținem o reprezentare în arbore binar a codului de prefix.
Să descriem algoritmul pentru construirea unui arbore Huffman și obținerea codurilor Huffman.
  1. Caracterele alfabetului 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 de arbore libere cu cele mai mici 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, celuilalt i se atribuie bitul 0
  6. Pașii începând cu al doilea se repetă până când un singur nod liber rămâne în lista nodurilor libere. Aceasta 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 într-o fracție. În acest caz, se ia în considerare distribuția de frecvență a elementelor. În prezent, algoritmii de codare aritmetică sunt protejați de brevete, așa că ne vom uita doar la ideea de bază.
Să fie alfabetul nostru format din N simboluri a1,...,aN și, respectiv, frecvențele lor de apariție p1,...,pN. Să împărțim jumătatea de interval. Acești pași sunt importanți pentru ca codificatorul să funcționeze eficient în pasul următor.

1.2. PrEP

Ca pas cheie al algoritmului de compresie, transformarea cosinus discretă (denumită în continuare DCT) este un tip de transformată Fourier și, ca și aceasta din urmă, are o transformată inversă (DCCT). Dacă considerăm o imagine ca un set de unde spațiale, unde axele X și Y corespund lățimii și înălțimii imaginii, iar axa Z afișează valorile de culoare ale pixelilor corespunzători, atunci ne putem deplasa din spațial. reprezentarea imaginii la ea reprezentare spectrală si inapoi. DCT convertește o matrice N x N de pixeli într-o matrice de coeficienți de frecvență de dimensiunea corespunzătoare.



Orez. 4.

În matricea rezultată, componentele de joasă frecvență sunt situate mai aproape de colțul din stânga sus, iar componentele de frecvență mai înaltă sunt deplasate în jos la dreapta. Datorită faptului că partea principală a imaginilor grafice de pe ecran constă din informații de joasă frecvență, folosind matricea rezultată puteți elimina în mod diferențial cel mai mic Informații importante cu pierderi vizuale minime. Astfel, DCT vă permite să selectați informații care pot fi aruncate în siguranță fără a introduce distorsiuni serioase în imagine. Este greu de imaginat cum ar putea fi îndeplinită această sarcină pe imaginea originală.

Din formulele (Fig. 4) este clar că calcularea unui element din matricea rezultată necesită timp O(N 2), deci este aproape imposibil să se transforme întreaga matrice. Echipa de dezvoltare JPEG a propus cea mai bună soluție la această problemă: împărțirea matricei originale în pătrate marimea standard 8x8 și transformați fiecare dintre ele. Utilizarea blocurilor mai mari va îmbunătăți calitatea compresiei, dar nu la infinit, deoarece probabilitatea ca punctele foarte îndepărtate să fie similare între ele este prea mică.

Este de remarcat faptul că în timpul calculelor sunt utilizate doar 32 de valori cosinus precalculate, ceea ce vă permite să creșteți semnificativ viteza de conversie. Acest lucru duce, fără îndoială, la pierderea parțială a informațiilor, dar volumele acesteia sunt relativ nesemnificative.

O ușoară creștere a performanței poate fi obținută dacă în calcule se utilizează numai aritmetica întregi, care, totuși, este relevantă doar pentru mai vechi. calculatoare, deoarece în calculatoarele moderne costul operațiunilor pe numere în virgulă mobilă nu este diferit de operațiunile pe numere întregi. De asemenea, utilizarea aritmeticii întregi afectează negativ calitatea imaginii comprimate, ceea ce face ca această metodă să fie inacceptabilă pentru calculatoare moderne. Deoarece DCT este un tip de transformată Fourier, toate metodele de creștere a performanței transformării Fourier pot fi utilizate aici.

1.3. Rotunjire

Următoarea etapă, în care are loc principala pierdere de informații, este rotunjirea sau cuantizarea. După cum puteți vedea, DCT nu efectuează nicio compresie sau codificare. Sarcina sa principală este de a transforma imaginea originală într-o formă convenabilă pentru operațiunile ulterioare pe ea.

Rotunjirea este procesul de reducere a cantității de informații necesare pentru stocarea matricei DCT, cu o pierdere parțială a preciziei. Conform standardului JPEG, pentru aceasta este utilizată o matrice de rotunjire (RO). Fiecare element al matricei DCT originale corespunde unui element MO. Matricea rezultată se obține prin împărțirea matricei originale la MO. În acest caz, valorile de frecvență joasă din matricea DCT corespund unor coeficienți MO mai mici, ceea ce face posibilă păstrarea informațiilor de frecvență joasă mai semnificative și eliminarea informațiilor de frecvență înaltă mai puțin importante. Datorită faptului că componentele de joasă frecvență sunt concentrate în stânga colțul de sus Matricele DCT, valorile MO cresc de la stânga la dreapta și de sus în jos.


3 5 7 9 11 13 15 17
5 7 9 11 13 15 17 19
7 9 11 13 15 17 19 21
9 11 13 15 17 19 21 23
11 13 15 17 19 21 23 25
13 15 17 19 21 23 25 27
15 17 19 21 23 25 27 29
17 19 21 23 25 27 29 31

Un exemplu de matrice de rotunjire cu un factor de calitate de 2.

Rezultatele rotunjirii și calitatea imaginii reconstruite depind direct de matricea de rotunjire selectată. Standardul JPEG vă permite să utilizați orice MO, dar ISO, prin teste experimentale extinse, a dezvoltat un set de matrice care vă permit să obțineți rezultate optime.

1.4. Comprimare

Ultima etapă a algoritmului de codificare JPEG este compresia. După procesarea matricei DCT folosind MO, în matricea rezultată apar un număr mare de zerouri, în special în regiunea de înaltă frecvență (colțul din dreapta jos).

Primul pas este înlocuirea valorii din colțul din stânga sus al matricei rezultate cu o valoare relativă. Deoarece blocurile de imagine adiacente sunt similare între ele, codificarea următorului element (0,0) prin diferența cu cel anterior va fi mai eficientă. Al doilea pas este aplicarea directă a algoritmului de codare repetitivă (LZW) la proces cantitate mare zerouri consecutive. Testele experimentale au arătat că cele mai bune rezultate pot fi obținute dacă ocoliți matricea în zig-zag, așa cum se arată în figura de mai jos.

Orez. 5.

În cele din urmă, în al treilea și ultimul pas, rezultatul rezultat este comprimat ca datele normale folosind algoritmul Huffman sau codificarea aritmetică în funcție de implementare. Această etapă se numește „codare entropică” (în terminologia JPEG).

1.5. Decodare

Deoarece DCT este o transformată Fourier, există o transformată cosinus discretă inversă (IDCT). Algoritmul de decodare repetă algoritmul de codificare în ordine inversă.

2.JPEG2000

Inițial, noul standard a fost dezvoltat ca bază pentru viitorul standard de compresie fără pierderi JPEG-LS, dar ulterior a fost abandonat din cauza apariției unor algoritmi mai eficienți. Datorită dezvoltării tehnologiei, standardul JPEG și-a pierdut treptat relevanța. Dezvoltatorii JPEG2000 sperau să creeze un standard care să corecteze multe dintre erorile din standardele existente. Printre sarcinile lor au fost:

  • Eliminarea nu este compresie eficientăîn regiunea de joasă frecvență. Algoritmii existenți au făcut o treabă bună în comprimarea regiunilor de frecvență medie și înaltă, dar au arătat rezultate slabe în regiunea de frecvență joasă.
  • Compresie cu pierderi și fără pierderi. La momentul dezvoltării, nu exista niciun standard care să permită compresia cu pierderi și fără pierderi într-un singur flux de compresie.
  • Procesarea imaginii mari. Algoritmii existenți nu au permis comprimarea eficientă a imaginilor mai mari de 64Kx64K fără tiling.
  • Structura unificată a algoritmului de compresie. Actuala implementare JPEG a suportat 44 de modificări, dintre care majoritatea erau specifice aplicației și nu erau acceptate de majoritatea decodoarelor.
  • Imunitate la zgomot. La momentul dezvoltării JPEG, tehnologiile de rețea nu erau încă suficient de dezvoltate, iar designerii JPEG nu s-au gândit la imunitatea la zgomot atunci când transmiteau imagini pe canale nesigure sau la capacitatea de a restabili imaginea dacă aceasta a fost deteriorată ca urmare a transmisiei.
  • Imagini generate de computer. Algoritmii originali au funcționat bine pe fotografiile digitale și imaginile obținute folosind o cameră digitală sau un scaner, dar nu au procesat în mod eficient imaginile create pe un computer, de exemplu, folosind editori grafici.
  • Documente complexe. JPEG a funcționat foarte slab la procesarea imaginilor 2D complexe (în special imaginile text).

Următoarea diagramă prezintă pașii de bază ai unui encoder JPEG2000.


Orez. 6.


Orez. 7.

Spre deosebire de JPEG, codificatorul JPEG2000 nu necesită împărțirea imaginii în blocuri pătrate mici, deoarece DWT (transformarea wavelet discretă) utilizată în timpul funcționării algoritmului funcționează pe fragmente de orice dimensiune. Pe de altă parte, uneori, dacă cantitatea de memorie disponibilă codificatorului pentru a lucra este mai mică decât cantitatea de memorie necesară pentru a codifica întreaga imagine, imaginea este împărțită în plăci pătrate, care sunt codificate independent unele de altele. În continuare, vom lua în considerare codificarea unei plăci. Pașii rămași sunt similari cu JPEG.

Orez. 8.

2.2. Placi de fibre

JPEG2000 utilizează Transformarea Wavelet discretă pentru a împărți imaginea în regiuni de înaltă frecvență și de joasă frecvență. DWP procesează fiecare rând și coloană a imaginii sursă folosind filtru de frecventa.

Orez. 9.

Datorită faptului că fiecare trecere folosind un filtru de frecvență la ieșire dublează cantitatea de informații, după procesare dimensiunea imaginii este redusă la jumătate. După o etapă de procesare a plăcilor dure, fragmentul procesat este împărțit în patru segmente:

  • LL - frecvente joase pe rânduri și coloane
  • HL – frecvențe înalte în rânduri și frecvențe joase în coloane
  • LH – frecvențe joase în rânduri și frecvențe înalte în coloane
  • HH – frecvențe înalte în rânduri și coloane

Conform standardului, numărul de etape poate fi de la 0 la 32. Pentru o imagine obișnuită, se folosesc de la 4 la 8 etape. La fiecare etapă ulterioară, este procesată doar regiunea de joasă frecvență (LL), deoarece regiunile de înaltă frecvență nu conțin de obicei informații importante.


Orez. 10.

Orez. unsprezece.

2.3. Rotunjire

Pentru a rotunji coeficienții DWT, se folosește un cuantificator constant cu o zonă moartă. (Fig. 14) Pentru fiecare fragment, o valoare constantă a pasului de rotunjire este utilizată pentru toți coeficienții acestui fragment. Formula pentru calcularea valorilor rotunjite este prezentată în Figura 12. Aici y este valoarea inițială a coeficientului, semnul (y) determină semnul coeficientului, iar Δb este valoarea pasului de rotunjire. Zonă moartă cuantificatorul este un interval cu un interval de 2Δb în jurul zero, dă un număr mai mare de zerouri la ieșire.

2.4. Codificare

Codarea coeficienților rotunjiți rezultați se realizează bloc cu bloc. Conform standardului JPEG2000, imediat înainte de codificare, fragmentele sunt împărțite în blocuri suficient de mici (de exemplu, 32x32 sau 64x64 în dimensiune), astfel încât toate blocurile unui fragment să aibă aceeași dimensiune. Partiționarea în blocuri se realizează pentru a implementa o organizare mai flexibilă a informațiilor comprimate pentru a crește imunitatea la zgomot și așa mai departe.


Orez. 16.

În JPEG2000, fiecare bloc este codificat separat. Algoritmul de codare traversează matricea coeficientului de rotunjire a fiecărui bloc în dungi, așa cum se arată în Figura 17. Blocurile sunt împărțite în blocuri cu o înălțime nominală de 4. Dungile sunt apoi scanate de sus în jos, iar coloanele din fiecare bandă sunt parcurs de la stânga la dreapta.


Orez. 17.

În timpul procesului de codificare, coeficienții dintr-un bloc sunt reprezentați virtual ca planuri de biți. Unul dintre aceste planuri este alcătuit din semnele coeficienților; planurile rămase corespund diferitelor cifre ale valorilor coeficientului (poziția bitului în plan corespunde cu poziția coeficientului în bloc). Codarea se realizează în plan: mai întâi se codifică planul corespunzător celei mai semnificative cifre a coeficienților, apoi următorul în ordine descrescătoare etc. Se poate întâmpla ca cele N planuri de biți cu cea mai mare prioritate (planuri NPB) să nu conțină. În acest caz, primul plan care conține cel puțin o unitate devine planul NPB. Planurile goale care îl preced sunt omise în timpul codificării, iar informațiile despre numărul lor sunt introduse în antetul blocului.

Codarea aritmetică se bazează pe un model sensibil la context. Contextul este format în funcție de valorile biților din jurul bitului care este codificat. Fiecare plan de biți, cu excepția NBP, este de obicei codificat în trei treceri. În timpul primei treceri de cod, sunt diseminate informații despre semnificația coeficienților. În timpul codificării, fiecărui coeficient din blocul codificat i se atribuie un parametru de semnificație. Un coeficient este numit semnificativ dacă în planurile de biți deja codificate în acest moment, există cel puțin un bit diferit de zero al acestui coeficient.

Pentru fiecare bit al planului, dacă coeficientul corespunzător nu este încă semnificativ și dacă cel puțin un coeficient învecinat este deja semnificativ, se codifică faptul de semnificație pentru coeficientul curent, adică valoarea acestui bit al curentului codificat. planul este de fapt codificat. Dacă bitul codificat se dovedește a fi diferit de zero, imediat după procesare, bitul corespunzător din planul de biți al semnelor coeficientului este codificat (codarea semnelor).

În timpul celei de-a doua treceri, biții de coeficienți care sunt în prezent semnificativi și neatinse în prima trecere sunt codificați. Spre deosebire de trecerea anterioară, când decizia de codificare a fost luată pe baza informațiilor despre semnificația coeficienților învecinați, în timpul acestei treceri biții sunt codificați fără greșeală.

A treia și ultima trecere procesează acei biți care nu au fost procesați în timpul primei și celei de-a doua treceri. În timpul acesta stadiu final codificare aritmetică utilizat împreună cu codificarea grupurilor.

Un detaliu esențial oferit de standard este abilitatea de a sări peste trecerile de cod, care este o altă sursă de câștiguri de eficiență din cauza pierderilor de informații (prima, cea mai evidentă sursă este cuantizarea). Această caracteristică este utilizată în mod activ pentru a controla viteza de generare a codului.

2.5. Organizarea datelor

Un avantaj important al standardului luat în considerare este capacitatea de a accesa elemente individuale ale imaginii fără a decoda complet reprezentarea acestuia. Această posibilitate este asigurată, în primul rând, prin împărțirea imaginii originale în zone care nu se suprapun (placi), care sunt codificate ca imagini separate, iar în al doilea rând, prin reprezentarea codului unei plăci individuale sub formă de părți (straturi), fiecare dintre care este un cod total de coeficienți corespunzător unei anumite zone (tigle) ale acesteia. Straturile, la rândul lor, sunt împărțite în așa-numitele pachete care conțin codul blocurilor de coeficienți pentru diferite niveluri descompunere. Pentru a decoda orice zona imaginii, este suficient să se determine cărei plăci aparține și care straturi aferente acestor plăci conțin codul de blocuri de coeficienți necesar refacerii zonei necesare.



Orez. 20.

Desigur, o reprezentare „convenabilă” a imaginii poate să nu fie benefică în ceea ce privește eficiența compresiei. Într-adevăr, odată cu scăderea dimensiunii elementelor structurale (plăci, zone de plăci care formează straturi etc.), eficiența compresiei scade oarecum. Standardul în acest caz ne lasă de ales: pe de o parte, avem posibilitatea de a obține reprezentări de informații care ne permit să extragem și să edităm rapid părți ale imaginii, pe de altă parte, standardul nu împiedică crearea de reprezentări informaţionale eficiente ca volum.

Pentru a asigura imunitate la zgomot și acces ușor la informații, standardul JPEG2000 oferă un sistem de markeri și segmente de marcare. Segmentele marker conțin parametri de informații limitați de markeri. Datele care încep cu un marker pot fi interpretate corect fără nicio informație suplimentară (acest lucru nu înseamnă că întregul poate fi reconstruit din fragmente), ceea ce face posibilă restaurarea parțială a unei imagini a cărei reprezentare a fost deteriorată. Introducerea elementelor de imunitate la zgomot dă undă verde utilizării standardului în tot felul de aplicații de telecomunicații.

Obținerea compresiei de înaltă calitate a fost, desigur, una dintre sarcinile principale la crearea standardului, iar aici dezvoltatorii au făcut progrese clare. Standardul JPEG2000 este de aproximativ 2 ori mai eficient decât standardul JPEG când este comprimat cu pierderi și cu 5-20% când este comprimat fără pierderi. Desigur, eficiența compresiei fără pierderi în acest caz nu este la fel de mare ca, să zicem, standardul JPEG-LS, dar este destul de acceptabilă. În ceea ce privește eficiența compresiei cu pierderi, aici standardul vă permite să obțineți rezultate care sunt aproape de cele mai bune rezultate pentru acest tip de metode astăzi.

3.JPEG-LS

Format JPEG-LS s-a bazat pe format LOCO-I(Compresie fără pierderi de complexitate scăzută pentru imagini). Algoritmul de compresie fără pierderi LOCO-I, adoptat ca bază pentru dezvoltarea standardului JPEG-LS, a oferit pentru prima dată nu numai modul fără pierderi, ci și aproape fără pierderi (compresie cu pierderi limitate, definite de utilizator). Spre deosebire de modul fără pierderi JPEG2000, JPEG-LS s-a dovedit a fi cu adevărat de succes: cu o eficiență de compresie mai mare, noul standard oferă viteză mare de compresie/decompresie și nu este prea solicitant pentru resursele computerului.

Este important să înțelegeți că formatul JPEG-LS:

  • nu este o extensie sau o modificare a metodei JPEG;
  • nu folosește nici codare DCT, nici codare aritmetică;
  • folosește cuantizarea slabă numai în modul „aproape fără pierderi”.

3.1. Introducerea conceptelor de bază și a principiilor de funcționare

Comprimarea datelor fără pierderi constă din două părți independente separate: modelare și codare. Să definim câțiva termeni pe care îi vom folosi în mod activ în viitor:

Encoderul este „responsabil” de procesul de codificare și anume: primește ca intrare imaginea originală în format digital și toți parametrii necesari definiți de standard, iar folosind un set special de proceduri creează un set de date care conține imaginea comprimată. Decodorul „răspunde” la procesul de decodare și conversie a fragmentelor, și anume: primirea datelor cu o imagine comprimată și toți parametrii necesari ca intrare, scoate o imagine reconstruită

Decodorul JPEG-LS diferă puțin de codificator, așa că acest algoritm de compresie poate fi numit aproape simetric. Iată o diagramă simplificată care arată principiile codării:



Orez. 21.

Câteva informații despre imaginea originală: după cum se arată în diagrama de mai jos (Fig. 22), imaginea originală poate consta din componente Nf. Fiecare componentă Ci conține o matrice bidimensională de pixeli (eșantioane) de x i coloane și y i rânduri. Dimensiunile componentelor depind de doi parametri: X și Y, unde X este maximul dintre valorile x i și Y este maximul dintre valorile y i ale tuturor componentelor. (În standardul JPEG-LS, un întreg capitol este dedicat diferențelor de lucru cu imagini cu mai multe componente în comparație cu imaginile cu o singură componentă, dar în acest articol ne vom concentra doar pe lucrul cu imagini cu o singură componentă).



Orez. 22.

Figura arată orientarea fiecărei componente: sus, jos, stânga și dreapta. Ordinea în care pixelii sunt supuși procedurilor de codificare este determinată după cum urmează: de la stânga la dreapta (de la stânga la dreapta) și de sus în jos (de sus în jos) pe componentă.

Pixelii de context a, b, c, d sunt utilizați pentru a prezice pixelul x curent. În funcție de context, codificatorul alege un mod: serial (mod rulare) sau modul normal. Moda în serie este ales dacă y și z sunt probabil să coincidă, regulat- in caz contrar. Să facem aici o notă legată de prezența opțiunii „aproape fără pierderi”: Când această opțiune este activată, modul serial va fi selectat dacă y și z sunt aproape identice conform parametrului de toleranță NEAR.

În cazul utilizării modului în serie, începem să navigăm linia curentă din pixelul x și găsiți cea mai mare lungime a unei serii de pixeli care coincide cu pixelul contextual a. Astfel, în cadrul liniei curente obținem o serie de pixeli identici care coincid ca valoare cu pixelul cunoscut a. Tot ce rămâne este să codificați lungimea seriei. (Acest lucru se face folosind o matrice de 32 de elemente J.) Poate ați ghicit deja că, cu opțiunea „aproape fără pierderi” activată, o serie de pixeli aproape de a sunt selectați folosind parametrul NEAR.

Acum să ne uităm la acțiunile noastre în cazul utilizării unui mod obișnuit. Valorile pixelilor a, b și c sunt utilizate pentru a calcula predicția pixelului x (Px). Apoi se calculează așa-numita eroare de prognoză (Errval). Valoarea sa este egală cu diferența dintre valorile lui x și Px. Errval este ajustat de un termen dependent de context și apoi codificat folosind coduri Golomb. Codul Golomb depinde de a, b, c, d și Errval ale acelorași pixeli, care sunt stocați în rețele speciale A și N. Când opțiunea „aproape fără pierderi” este activată, eroarea de predicție este cuantificată în continuare înainte de codificare.


Orez. 23.

3.2. Codificator

JPEG-LS este folosit în principal ca metodă de comprimare a informațiilor fără pierderi, prin urmare fișierul imagine recuperat este de obicei identic cu fișierul original. În mod aproape fără pierderi, imaginea originală și imaginea reconstruită pot diferi. Vom nota pixelul reconstruit cu Rp, iar pixelul original cu p.

În etapa de inițializare, codificatorul efectuează următoarele operații:

  • Parametrii sunt calculați RANGE = floor((MAXVAL + 2 * NEAR) / (2 * NEAR + 1)) + 1, qbpp = ceil(log RANGE), bpp = max(2, ceil(log(MAXVAL + 1)) ), LIMIT = 2 * (bpp + max(8, bpp)) . (În cazul codificării fără pierderi, NEAR = 0, RANGE = MAXVAL + 1. Dacă modul „aproape fără pierderi” este activat, NEAR > 0). MAXVAL și NEAR sunt parametri stabiliți de aplicația care implementează algoritmul.
  • Matricele de index N, A, B și C sunt inițializate. Să le explicăm scopul: N este folosit pentru a stoca frecvența de apariție a fiecărui context, A - pentru a acumula valoarea erorii de predicție, B - pentru a calcula abaterea sistematică, C - pentru a stoca valorile corecției eroarea de prognoză.
  • Variabilele pentru modul de rulare sunt inițializate RUNindex=0 și J = (0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5 , 5, 6, 6, 7, 7, 8, 9,10,11,12,13,14,15) .
  • Două variabile auxiliare Nn sunt inițializate, Nn=0 pentru a codifica pixelul de explozie.

Să introducem câteva funcții și variabile care vor fi folosite mai târziu:

Funcția GetNextSample(): Primește informații despre următorul pixel al imaginii sursă și setează valorile corespunzătoare ale variabilelor x, a, b, c, d, Ix, Ra, Rb, Rc, Rd. Dacă pixelul citit este la sfârșitul liniei, atunci GetNextSample() setează EOLine = 1 . În toate celelalte cazuri, EOLine = 0. Valorile Ra, Rb, Rc, Rd își moștenesc valorile din valoarea Rx calculată anterior. Variabilă globală EOLine: setată de funcția GetNextSample(): egal cu 1 dacă pixelul curent este ultimul din linie, egal cu 0 în caz contrar. AppendToBitStream(a,b) Funcție: adaugă un număr nenegativ în formă binară la fluxul de biți codificat folosind b biți. Cei mai semnificativi biți sunt adăugați mai întâi. Funcția Quantize(a): Folosită pentru a cuantifica eroarea de predicție în modul „aproape fără pierderi”. Funcția ComputeRx(): Returnează valoarea Rx reconstruită pentru pixelul curent (folosește „eroarea de predicție” cuantificată).

Din imaginea de mai sus (Fig. 23) este clar că pixelii a, b, c și d joacă un rol semnificativ în codificarea pixelului x. Să încercăm să ne dăm seama ce se întâmplă atunci când acești pixeli lipsesc. Deci, la codificarea liniei de sus, pixelii contextului c, b și d lipsesc, astfel încât valorile lor sunt considerate zero. Dacă pixelul curent se află la începutul sau la sfârșitul liniei, atunci pixelii a, c sau d sunt nedefiniti. În acest caz, a și d folosesc valoarea Rb reconstruită a pixelului b (sau zero pentru linia de sus), iar c utilizează valoarea reconstruită a lui a când codifică primul caracter al liniei anterioare. Astfel, codificatorul trebuie să facă o parte din munca decodorului prin reconstruirea unor pixeli.

Codificatorul începe cu următorii trei pași:

După stabilirea contextului Q, codificatorul prezice pixelul x. În primul rând, predicția Px este calculată folosind așa-numitul „predictor de detectare a marginilor”:

dacă (Rc > = max(Ra, Rb)) Px = min(Ra, Rb);
altceva(
dacă (Rc<= min(Ra, Rb))
Px= max(Ra, Rb);
altfel
Px = Ra + Rb - Rc;
}

Să explicăm esența „regula marginii”. Pentru a face acest lucru, luați în considerare cazul b< а. При этом условии «правило края» выбирает b в качестве прогноза х во многих случаях, когда вертикальный край изображения находится непосредственно слева от х. Аналогично, пиксель а выбирается в качестве прогноза х во многих случаях, когда горизонтальный край находится непосредственно над х. Если край не обнаруживается, то «правило края» вычисляет прогноз в виде а + b - с, что имеет простую геометрическую интерпретацию. Если каждый пиксель является точкой трехмерного пространства, то прогноз а + b - с помещает Рх на ту же плоскость, что и точки а, b и с.

Următorul pas este corectarea predicției din părtinire folosind numărul SIGN (în funcție de cele trei numere de zonă Qi), valorile de corecție C(Q) (derivate din părtiniri sistematice și care nu sunt discutate aici) și parametrul MAXVAL.

dacă (SEMN == +1)
Px = Px + C(Q);
altfel
Px = Px - C(Q);

Dacă (Px > MAXVAL)
Px = MAXVAL;
altfel dacă (Px< 0)
Px = 0;

După ce predicția Px este găsită, codificatorul calculează eroarea de predicție Errval ca diferență x - Px, dar își schimbă semnul dacă valoarea SIGN este negativă.

În mod aproape fără pierderi, eroarea este cuantificată și codificatorul folosește această valoare Rx reconstruită a pixelului x în același mod ca un decodor. Etapa de bază de cuantificare este următoarea:

dacă (Errval > 0)
Errval = (Errval + NEAR) / (2 * NEAR + 1);
altfel
Errval = - (Errval - APROAPE) / (2 * APROAPE + 1);

Acesta folosește parametrul NEAR, dar există câteva detalii care nu sunt afișate aici. Pasul principal de reconstrucție este găsirea Rx = Px + SIGN * Errval * (2 * NEAR + 1) .

Eroarea de prognoză (după o posibilă cuantizare) suferă o reducere modulo. (După aceasta, este gata pentru pasul principal de codare).

dacă (Errval< 0)
Errval = Errval + RANGE;
dacă (Errval >= ((RANGE + 1) / 2))
Errval = Errval - RANGE;

Codurile Golomb (parametrul principal a fost notat cu b). În JPEG-LS, acest parametru este desemnat m. Dacă numărul m a fost deja ales, atunci codul Golomb al unui număr întreg nenegativ n este format din două părți: codul unar al părții întregi a numărului n/m și reprezentare binară n mod m. Acest cod este ideal pentru numerele întregi care au o distribuție geometrică (adică atunci când probabilitatea numărului n este (1 - r) * r n , 0< r < 1) . Для каждого геометрического распределения найдется такое число m, что код Голомба, построенный по m, имеет наименьшую возможную среднюю длину. Cel mai simplu caz, când m este o putere de 2 (m = 2 k), duce la operații simple de codare/decodare. Codul numărului n în acest caz este format din k cifre de ordin inferior ale numărului n, precedate de codul unar al numărului compus din cifrele de ordin superior rămase ale numărului n. Acest cod Golomb special este notat cu G(k) .

De exemplu, să calculăm codul G(2) al numărului n = 19 = 10011 2 . Deoarece k = 2, atunci m = 4. Să începem cu cele două cifre cel mai puțin semnificative, 11 2, ale numărului n. Ele sunt egale cu 3, care este același cu n mod m (3 = 19 mod 4). Cele mai semnificative cifre rămase, 100 2, vor da numărul 4, care este egal cu partea întreagă n/m (19/4 = 4,75). Codul unar al lui 4 este 00001, deci codul G(2) al lui n = 19 este 00001|11.

În practică, există întotdeauna un număr finit de numere întregi nenegative. Să notăm cel mai mare număr cu I. Cea mai mare lungime a lui G(0) este I + 1 și, deoarece I poate fi mare, este de dorit să se limiteze dimensiunea codului Golomb. Acest lucru se face folosind un cod Golomb special LG(k, glimit) care depinde de doi parametri k și glimit. În primul rând, trebuie să formați numărul q din cele mai semnificative cifre ale numărului n. Dacă q< glimit- - 1 , то код LG(k, glimit) совпадает с кодом LG(k]. В противном случае, приготавливается унарный код числа glimit - ceil(log I) - 1 (то есть, glimit - ceil(log I) - 1 нулей, за которыми стоит единственная 1). Это действует как код esc, после которого стоит двоичный код n - 1 из ceil(log I) бит.

Erorile de prognoză nu sunt neapărat numere pozitive. Ele sunt egale cu unele diferențe, care pot fi zero sau negative. Cu toate acestea, codurile Golomb au fost create pentru numere pozitive. Prin urmare, înainte de codificare, valorile de eroare negative ar trebui să fie reflectate într-un set de numere nenegative. Pentru a face acest lucru, utilizați următoarea mapare:
MErrval =
2 * Errval dacă Errval >= 0,
2 * |Errval| daca Errval< 0.

Acest afișaj alternează valorile negative și pozitive în secvența 0, -1, +1, -2, +2, -3,... .

Tabelul de mai jos enumeră unele dintre erorile de predicție, valorile afișate și codurile lor LG(2, 32), presupunând că alfabetul are dimensiunea 256 (adică I = 255 și ceil(log I) = 8).

Tabel: erori de prognoză, afișaje și coduri LG (2, 32)

Eroare de prognoză Valoarea afișată Cod
0 0 1 00
-1 1 1 01
1 2 1 10
-2 3 1 11
2 4 01 00
-3 5 01 01
3 6 01 10
-4 7 01 11
4 8 001 00
-5 9 001 01
5 10 001 10
-6 11 001 11
6 12 0001 00
...
50 100 000000000000
000000000001
01100011

Acum trebuie să discutăm despre alegerea parametrului k pentru codurile Golomb. Acest lucru se face adaptiv. Parametrul k este dependent de context și valoarea sa este actualizată de fiecare dată când este găsit un pixel cu acel context. Calculul lui k poate fi exprimat pe o linie simplă:
pentru (k=0; (N[Q]<unde A și N sunt tablouri de indici de la 0 la 364. Această formulă folosește contextul Q ca indice al celor două tablouri. La început, k este inițializat la zero și apoi este executată bucla. La fiecare iterație a buclei, un element al matricei N[Q] este deplasat la stânga cu k biți și comparat cu A[Q]. Dacă valoarea deplasată N[Q] este mai mare sau egală cu A[Q], atunci valoarea curentă k este selectată. În caz contrar, k se mărește cu 1 și testul se repetă.

După găsirea numărului k, eroarea de predicție Errval este convertită în numărul MErrval, care este codificat folosind codul LG(k, LIMIT). Numărul LIMIT este un parametru. Actualizarea matricelor A și N (împreună cu matricea auxiliară B) este ilustrată de următorul fragment de cod (parametrul RESET este setat de aplicație):

B[Q] = B[Q] + Errval * (2 * APROAPE + 1);
A[Q] = A[Q] + abs(Errval);
dacă (N[Q] == RESET) (
A[Q] = A[Q]>>1;
B[Q] = B[Q]>>1;
N[Q] = N[Q]>>1;
}
N[Q] = N[Q] + 1;

Acum să vorbim despre calcularea abaterii sistematice a prognozei. Valoarea de corectare a predicției C[Q] trebuie actualizată la sfârșitul codificării pixelului x. Acest lucru necesită două variabile - B[Q] și N[Q]. N[Q] este numărul de apariții ale contextului Q de la inițializare. B[Q] este o abatere sistematică care permite ca valoarea lui C[Q] să fie actualizată cel mult o dată pe iterație. Deci, valoarea predictorului C[Q] este calculată conform următorului cod:

dacă (B[Q]<= -N[Q]) {
B[Q] = B[Q] + N[Q];
dacă (C[Q] > MIN_C)
C[Q] = C[Q]-1;
dacă (B[Q]<= -N[Q])
B[Q] = -N[Q] + 1;
}
altfel dacă (B[Q] > 0) (
B[Q] = B[Q] - N[Q];
dacă (C[Q]< MAX_C)
C[Q] = C[Q] + 1;
dacă (B[Q] > 0)
B[Q] = 0;
}

Constantele MIN_C și MAX_C sunt minime și maxime sens posibil matrice de index C, egală cu -128 și, respectiv, 127.

Codarea în modul serial se face diferit. Reamintim că codificatorul selectează acest mod atunci când detectează pixeli succesivi x ale căror valori Ix se potrivesc și sunt egale cu valoarea Ra reconstruită a pixelului context a. Pentru opțiunea „aproape fără pierderi”, pixelii din serie trebuie să aibă valori Ix care să satisfacă inegalitatea |Ix - Ra|<= NEAR . Серия не должна выходить за пределы текущей строки. Длина серии кодируется (сам пиксель кодировать не нужно, поскольку он равен Ra), и если конец серии находится раньше конца строки, то после ее закодированной длины будет сразу записан код следующего пикселя (который прерывает серию). Две основные задачи кодера в этой моде состоят

  1. în urmărirea unei serii și codificarea lungimii acesteia;
  2. în codificarea pixelului care a întrerupt seria.

Seria poate fi urmărită după cum urmează:

RUNval = Ra;
RUNcnt = 0;
în timp ce (abs(Ix - RUNval)<= NEAR) {
RUNcnt = RUNcnt + 1;
Rx = RUNval;
dacă (EOLine == 1)
pauză;
altfel
GetNextSample();
}

Să explicăm câteva dintre valorile introduse: RUNcnt este numărul de pixeli care se repetă (pentru modul serial), iar RUNval este valoarea curentă a pixelului care se repetă reconstruit.

Să descriem procesul de codificare a seriei. Primul fragment de cod descrie codificarea pentru segmentele de rulare cu lungimea rm:

în timp ce (RUNcnt >= (1<AppendToBitStream(1, 1);
RUNcnt = RUNcnt - (1<dacă (RUNindex< 31))
RUNindex = RUNindex + 1;
}

Următorul cod ilustrează codificarea pentru segmente de rulare cu lungime mai mică decât rm:

dacă (EOLine == 0) (
AppendToBitStream(0, 1);
AppendToBitStream(RUNcnt, J);
dacă (RUNindex > 0)) (
RUNindex = RUNindex - 1;
}
else if (RUNcnt > 0)
AppendToBitStream(1, 1);

Aici codificatorul folosește tabelul J, care constă din 32 de intrări, notate cu rk. J este inițializat cu valori
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15 .

Pentru fiecare valoare a lui rk notăm rm = 2 rk. Numerele rm (sunt 32 în total) se numesc ordinea codului. Primele 4 valori rk au rm = 2 0 = 1. Pentru al doilea cvadruplu rm = 2 1 = 2, iar pentru următorul cvadruplu rm = 2 2 = 4. Pentru ultimul număr rm = 2 15 = 32768. codificatorul efectuează procedura descrisă pentru găsirea lungimii rulării, care este stocată în variabila RUNlen. Această variabilă este apoi codificată prin împărțirea ei în termeni ale căror valori sunt egale cu numerele succesive rm. De exemplu, dacă RUNlen=6, atunci este reprezentat ca 6 = 1 + 1 + 1 + 1 + 2 folosind primele cinci numere rm. Este codificat folosind 5 biți. Înregistrarea se realizează folosind instrucțiunea AppendToBitStream(l,l). De fiecare dată când se scrie un 1, valoarea rm corespunzătoare este scăzută din RUNlen . Dacă RUNlen a fost egal cu 6 la început, atunci este redus succesiv la 5, 4, 3, 2 și 0.

Se poate întâmpla ca lungimea seriei RUNlen să nu fie egală cu suma întreagă a numerelor rm. De exemplu, RUNlen = 7 . În acest caz, cinci biți din 1 sunt scriși ca cod, urmați de un bit de prefix și restul de RUNlen (în exemplul nostru este 1), care este scris în fișier ca un număr de biți rk (valoarea curentă a rk în exemplul nostru este 2). Această ultimă operație este efectuată prin apelarea procedurii AppendToBitStream(RUNcnt, J). Bitul de prefix este 0 dacă seria este întreruptă de un alt pixel în linie. Dacă seria ajunge la sfârșitul liniei, atunci bitul de prefix este 1.

A doua sarcină principală a codificatorului, care este de a codifica pixelul de explozie, este realizată într-un mod similar cu codificarea pixelului curent. Să discutăm detaliile implementării sale.

Luați în considerare o situație în care progresul codificării este întrerupt de sfârșitul unui șir de pixeli: cum va fi codificat noul pixel care provoacă întreruperea? Această problemă este rezolvată prin codificarea diferenței dintre valoarea lui Ix la poziția curentă x și valoarea reconstruită a pixelilor a sau b (reamintim că aceștia sunt pixeli vecini în raport cu x - vezi Fig. 23). În acest caz, sunt luate în considerare două situații diferite: în primul rând, când abs(Ra - Rb)<= NEAR , вторая - в противном случае. По сути кодирование пикселя прерывания серии происходит теми же методами, что и кодирование нового пикселя в регулярной моде с тем лишь дополнением, что Ix должно отличаться от Ra на величину большую NEAR, иначе ход кодирования будет продолжен. Опишем операции, которые должны быть выполнены:

dacă (abs(Ra - Rb)<= NEAR)
RItip = 1;
altfel
RItip = 0;
dacă (RItip == 1)
Px = Ra;
altfel
Px = Rb;
Errval = Ix - Rb;

Fragmentul de cod de mai sus definește indicele RItype și eroarea de predicție pentru pixelul x. Apoi, dacă este necesar, schimbați semnul Errval, iar pentru opțiunea „aproape fără pierderi”, cuantificați și eroarea de predicție:

dacă ((RItip == 0) && (Ra > Rb)) (
Errval = -Errval;
SEMNE = -1;
altfel
SEMN = 1;
dacă (APROAPE > 0) (
Errval = Quantize(Errval);
Rx = ComputeRx();
}
altfel
Rx = Ix;
Errval = ModRange(Errval, RANGE);

Acum să calculăm variabila auxiliară TEMP, care va fi folosită pentru a calcula parametrul k în codurile Golomb.

dacă (RItip == 0)
TEMP = A;
altfel
TEMP = A + (N>>1);

Să setăm Q = RItype + 365. Vom calcula parametrul k pentru codurile Golomb astfel: pentru (k=0; (N[Q])<

dacă (Errval< 0) {
Nn[Q] = Nn[Q] + 1;
A[Q] = A[Q] + ((EMERrval + 1 -RItip)>>1);
dacă (N[Q] == RESET) (
A[Q] = A[Q]>>1;
N[Q] = N[Q]>>1;
Nn[Q] = Nn[Q]>>1;
}
N[Q] = N[Q] + 1;

Aceasta încheie descrierea codificatorului JPEG-LS. Rețineți că este cu siguranță incomplet, dar nu ne-am propus scopul de a copia standardul acestei metode. Toate detaliile omise pot fi găsite în standard. Acum să trecem la o scurtă descriere a principiilor de funcționare a decodorului.

3.3. Decodor

După cum am menționat mai devreme, metoda JPEG-LS este aproape simetrică, așa că nu vom copia descrierea codificatorului cu modificări minore - aceste informații pot fi citite în standard. Să ne oprim doar asupra modului în care are loc decodarea în modul serial. După ce toate valorile pentru pixelul curent au fost calculate, citiți bit nou R din fluxul de biți. Dacă este egal cu 1, atunci:

  1. Imaginea este completată de 2 J|RUNindex| pixeli cu valoarea Ra.
  2. Dacă în pasul anterior imaginea a fost deja completată cu 2 J|RUNindex| pixeli și RUNindex< 31, то RUNindex увеличивается на 1. Если последний пиксель в строке ещё не декодирован, то мы снова считываем биты, в противном случае переходим к вычислению всех требуемых величин.

Dacă bitul este 0, atunci:

  1. Citiți J|RUNindex| bit din fluxul de biți și este convertit într-un număr, iar imaginea este completată cu pixeli cu valori Ra într-o cantitate corespunzătoare numărului calculat.
  2. Dacă RUNindex > 0, atunci RUNindex este redus cu 1.
  3. Pixelul de întrerupere a seriei este decodat și calculul tuturor cantităților necesare începe din nou.

3.4. Tipul fisierului

Fișier comprimat este format din:

  • din segmente de date care conțin coduri Golomb și lungimi de rulare;
  • din segmente marker (informații necesare pentru decodor);
  • din segmentul markerilor „repaus” (unii markeri JPEG rezervați).

Aici numim un marker un octet de uni, urmat de un cod special care semnalează începutul unui nou segment. Dacă un simbol este urmat de un octet al cărui bit cel mai semnificativ este 1, atunci acel octet este începutul segmentului de simbol. În caz contrar, începe segmentul de date.

3.5. Codurile Golomb

Am menționat deja codurile Golomb de mai multe ori. Ce este? Codul Golomb al unui întreg nenegativ „poate fi un cod Huffman eficient”. Depinde de alegerea unui parametru b. Principiul de codare este următorul:

  • se calculează două cantități
    q = etaj((n - 1) / b) și
    r = n - qb - 1 ;
  • codul este construit în două părți: prima parte este q în cod unar, a doua parte este o expresie binară pentru r, constând din biți floor(log 2 b) pentru resturile mici și ceil(log 2 b) biți pentru cele mari .

Nu oferim o justificare matematică pentru utilizarea codurilor Golomb în JPEG-LS, observăm doar că dacă fluxul de date de intrare este format din numere întregi, iar probabilitatea numărului n este egală cu P(n) = (1 - p ) n - 1 p (0<= p <= 1) , то коды Голомба будут оптимальными кодами для этого потока данных, если выбрать параметр b следующим образом:
(1 - p) b + (1 - p) b + 1<= 1 <= (1 - p) b - 1 + (1 - p) b .

3.6. Concluzie

Formatul JPEG-LS a fost dezvoltat în primul rând pentru stocarea imaginilor în scopuri medicale, adică pentru acele cazuri în care este important să aveți o imagine mare fără cea mai mică pierdere de calitate. După cum sa menționat deja, formatul LOCO-I, dezvoltat în cadrul laboratoarelor HP, a fost luat ca bază. Apoi a fost dezvoltat în continuare prin eforturile comune ale HP și Mitsubishi. Ambele companii au permis ca brevetele lor pe acest format să fie folosite fără a plăti o licență, astfel încât JPEG-LS poate fi găsit și în programele obișnuite pentru PC.

Să explic cu propriul meu exemplu. Poate mă poți ajuta să înțeleg unele lucruri. Sarcina pusă înaintea mea de către mine este următoarea. Transferați un cadru (prin comandă) de pe camera WEB în memoria unui telefon mobil cu transfer ulterior pe alt telefon mobil. Din articolul dvs. nu este clar pe ce format ar trebui să se bazeze, disponibilitatea algoritmului. În continuare - transformarea cosinusului - doar o interpretare superficială și unde mă pot uita la un algoritm detaliat cu un exemplu specific (de exemplu, studiați analiza matematică, dar chiar și acolo aproape că nu există exemple specifice și, dacă există, atunci secțiuni întregi de calculele sunt ratate. Poate că există un manual specific, deci consultați. Structura organizării fișierelor a fost complet aruncată și nici măcar legăturile nu au fost indicate: „În matricea rezultată, componentele de joasă frecvență sunt situate mai aproape de colțul din stânga sus. , iar cele cu frecvență mai înaltă sunt deplasate în jos spre dreapta”, mi se pare că așa se face, dar nu merge (poate mă înșel!).

Întrebare: cum să captezi, de exemplu, doar informațiile necesare dintr-un cadru JPG pentru decodare ulterioară în rezoluția ecranului telefonului, fără a folosi un computer, folosind un MK. O versiune alb-negru a cadrului este suficientă. La care FFxx ar trebui să acordați atenție și să înregistrați numai acele informații. De unde pot obține structura cadrului camerei WEB? Înțeleg că problema este complexă și multifațetă. De exemplu, pe MK este imposibil să decriptați cadrul și apoi să-l comprimați cu rezoluția necesară, dar probabil că este posibil să tăiați cel puțin colțul de sus cu formatul necesar.

As fi recunoscator pentru informatii.

Ce pot face = program în VB, MK. Dezvoltarea interactivă de operare independentă a controlului prin telefon mobil cu mai multe relee, control audio cu ajutorul unui telefon mobil.

>> Al doilea pas este să aplicați direct algoritmul de codificare repetat (LZW)

poate RLE?

Desigur, la acest pas JPEG (vezi context) este RLE. Mulțumesc pentru identificarea erorii.

Cele mai bune articole pe această temă