Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Windows 7, XP
  • JPEG, JPEG2000, JPEG-LS. Kompresija slike bez gubitaka i gubitaka

JPEG, JPEG2000, JPEG-LS. Kompresija slike bez gubitaka i gubitaka

Fotografije i slike razlikuju se jedna od druge ne samo sadržajem, već i drugim „kompjuterskim“ karakteristikama. Na primjer, po veličini.

Dešava se da izgleda da postoje dva identična crteža, ali jedan je tri puta veći od drugog.

Slike se takođe razlikuju po kvalitetu. Mislim da ste više puta naišli na fotografije izuzetno lošeg kvaliteta. Ovo je vidljivo golim okom. Na primjer, dva identične fotografije, ali jedan je kvalitetniji, a drugi lošiji.

I dešava se da crtežu nedostaju boje. Evo primjera.

A format ili tip datoteke je odgovoran za sve ovo.

U stvari, slike dolaze u različitim formatima. A ima ih jako, jako puno. Nećemo ih sve razmatrati, već ćemo govoriti o najčešćim. To su formati kao što su bmp, gif, jpg, png, tiff.

Razlikuju se jedni od drugih, prije svega, po kvaliteti. A kvaliteta se razlikuje po broju (zasićenosti) boja.

Na primjer, slikam sliku različitim bojama. I onda odjednom neke od njih prođu, i moraš završiti slikanje onim što imaš. Naravno, pokušat ću učiniti sve što je moguće kako to ne bi uvelike utjecalo na rezultat, ali slika ipak neće ispasti onako kako bih želio - izblijedjela, mutnija.

Tako je to sa formatima slika. Neki ostavljaju sve boje, dok drugi odrežu neke. I ponekad to uzrokuje pogoršanje slike.

Ovo je prilično grub primjer. U stvari, sve je nešto komplikovanije, ali mislim da ste shvatili suštinu.

Uobičajeni formati slika

BMP je format za crteže napravljene u programu Paint. Može se koristiti za čuvanje nacrtanih slika na vašem računaru. Ali ova vrsta datoteke se ne koristi na Internetu zbog svoje velike veličine. Dakle, ako želite da objavite sliku nacrtanu u Paint-u na blogu ili društvenoj mreži, ona mora biti drugog tipa - gif, jpg ili png.

GIF je popularan format slika na Internetu. Možete ih sačuvati u njemu bez gubitka kvaliteta, ali sa ograničenim brojem boja - 256. GIF je stekao posebnu popularnost zbog činjenice da može kreirati male animirane (pokretne) slike.

JPG je format za fotografije i slike sa velikim brojem boja. Možete sačuvati sliku u njoj i bez gubitka kvaliteta i sa gubitkom.

PNG je moderan format slike. Ova vrsta slike se dobija mala velicina i bez gubitka kvaliteta. Vrlo zgodno: datoteka je mala i kvalitet je dobar. Takođe podržava transparentnost.

TIFF - slike su vrlo dobra kvaliteta, bez kompresije.Shodno tome, veličina takvih datoteka je ogromna. TIFF se koristi kada je kvalitet od velike važnosti. Na primjer, kada kreirate vizit karte, knjižice, naslovnice časopisa.

Koji format odabrati

  • BMP - ako je ovo crtež napravljen u Paint-u i čuvaćete ga samo na računaru.
  • GIF - ako je animacija ili crtež sa malim brojem boja za objavljivanje na Internetu.
  • PNG - ako je ovo slika koja ima puno boja ili neke prozirne dijelove.
  • JPG (jpeg) - ako je fotografija.
  • TIFF - slika za štampu (vizit karte, knjižice, posteri, itd.).

Zdravo dragi prijatelji. Danas ćemo razgovarati o tome koji je format slike najbolji za korištenje na web stranici, koji su formati grafičkih datoteka danas dostupni za web stranicu i da li je potrebno tražiti nove grafičke formate.

Dobijam dosta ovakvih pitanja; mnogi moji studenti pitaju da li mogu da koriste nove SVG i WebP formate i gde je najbolje mesto za korišćenje ovih slika. Naravno, možete koristiti nove formate, samo trebate razumjeti koji je format za šta prikladniji.

Danas su slike na web stranici sastavni dio. Počevši od grafički dizajn i učitavanje slika u članke, grafike prate većinu web lokacija na mreži. Ali ljepota ima cijenu

Neoptimizirane slike su jedan od faktora koji usporavaju web stranicu, na što ukazuju usluge verifikacije.

Stoga ćete uvijek morati odabrati koji format da odaberete za sliku. O tome će ovisiti njegova veličina i kvaliteta. I da koristim slike manja veličina i bez gubljenja kvaliteta, treba znati neke stvari.

Koje slike za web stranice koristim danas?

Sve slike za web stranice podijeljene su na:

  • raster (primjer - JPG, JPEG, GIF, PNG),
  • vektor (primjer - SVG).

Raster Slike se sastoje od piksela koji pohranjuju vrijednosti boje i prozirnosti. Ovi formati uključuju slike u člancima, dugmad, ikone i elemente dizajna. Ove slike su popularne među programerima i vlasnicima web stranica. Glavni nedostatak rasterskih slika je to što one nisu dobro skalirane.

Odnosno, kada se veličina slike poveća, dolazi do gubitka kvaliteta.

Vector slike se sastoje od linija i putnih tačaka. Informacije o slici se pohranjuju u matematičke upute za renderiranje, što omogućava da se takve slike skaliraju koliko god želite bez gubitka kvalitete.

Sve ove slike se mogu i koriste na modernim web stranicama. Samo to trebate razumjeti prije postavljanja na stranicu, !

Opis popularnih formata slika za stranicu

Iz opisa ovih formata shvatit ćete gdje i koji format je najbolje koristiti na stranici.

JPEG

JPEG ili JPG jedan je od najpopularnijih formata slika za web stranice. Format podržava milione boja, što mu daje vodeću poziciju u prezentaciji fotografija i slika na sajtu.

Slike u ovom formatu su prilično dobro optimizovane bez gubitka kvaliteta, što vam omogućava da dobijete manju datoteku bez vizuelnog gubitka kvaliteta. Treba imati na umu da svaka sljedeća optimizacija smanjuje kvalitetu.

Datoteke ovog formata podržavaju svi uređaji i preglednici, što još jednom potvrđuje njegovu popularnost i omogućava vam da ne brinete o problemima s prikazom na stranicama.

Veliki nedostatak ovog formata je nedostatak transparentnosti. Odnosno, neće biti moguće kombinirati slike u ovom formatu. Za takve zadatke bolje je koristiti sljedeći format.

PNG

Ovaj format koristi algoritam kompresije bez gubitaka. Što se tiče broja boja i nivoa transparentnosti, dostupan je u dva tipa: 8 i 24-bitni. Oba podržavaju transparentnost.

8-bitna nije baš popularna, ali se 24-bitna široko koristi razne slike Online. Zbog transparentnosti vam omogućava da kreirate kombinovane slike. Često se koristi za kreiranje animiranih dugmadi i ikona gdje je potreban efekat transparentnosti.

Slike u PNG formatu mogu se optimizirati i uređivati ​​mnogo puta - zadržat će originalni kvalitet.

Format također podržavaju svi pretraživači i uređaji, osiguravajući da se može prikazati na bilo kojem ekranu.

Kvaliteta slika izgleda bolje od JPG-a, ali će težina datoteke biti veća. Ovo se mora uzeti u obzir prilikom postavljanja fajlova na sajt.

GIF

To je 8-bitni format koji podržava 256 boja, transparentnost i animaciju. Zbog podrške malog broja boja, težina datoteke je također minimalna.

Format nije prikladan za fotografije i slike sa širok raspon boje.

Ali se široko koristi u kreiranju banera, dugmadi, ikona i tako dalje.

Na modernim web stranicama ovaj format se sve manje koristi.

Dalje, hajde da pričamo o relativno novijim SVG i WebP formatima, koji nisu toliko popularni, ali dobijaju popularnost i podršku, i savršeno odgovaraju zahtevima brzine učitavanja i prilagodljivosti web sajta.

SVG

To je format vektorske datoteke baziran na XML-u. Format je nedavno počeo da dobija na popularnosti, jer je ranije bio slabo podržan u pretraživačima. A zbog problema sa ekranom, niko nije žurio da ga koristi.

Danas SVG podržavaju svi moderni pretraživači. Ali problemi sa ekranom se i dalje javljaju.

Ovaj format se najčešće koristi za jednostavne slike, kao što su logotipi, elementi dizajna i tako dalje. Nije pogodno za fotografije.

SVG format je lagan, vrlo skalabilan, pruža oštre slike na bilo kojoj rezoluciji ekrana, podržava animaciju, može se kontrolisati preko CSS-a i staviti u HTML, smanjujući broj zahtjeva.

WebP

Format otvorenog koda koji je razvio Google posebno za internet. Danas YouTube koristi konverziju sličica videa u WebP.

Format pruža vrhunsku kompresiju i podržava transparentnost. Kombinira prednosti JPG i PNG formata bez povećanja veličine datoteke.

Ali, unatoč prednostima formata, ne podržavaju ga svi pretraživači, na primjer, IE, Edge, Firefox i Safari.

Postoje načini da se zaobiđu ova ograničenja, ali one sprečavaju da se format koristi svuda.

Zaključak

Prijatelji, nadam se da sam sve jasno objasnio, a sada znate koji format slike je najbolje koristiti na sajtu i zašto ne insistiram na korišćenju jednog određenog formata, već preporučujem integrisani pristup.

Možda kada WebP dobije široku podršku, svi ćemo se prebaciti na njega i zamijeniti jpg i png na našim stranicama.

Hajde da prodiskutujemo u komentarima koje formate koristite na svojim sajtovima, šta volite, a šta ne.

To je sve za danas, cekam vase komentare.

Srdačan pozdrav, Maxim Zaitsev.

    WITH Tri najpopularnija formata datoteka su JPEG, RAW, TIFF. Ponekad se mogu čuti nesuglasice među fotografima - koji je format fajla bolji za fotografiju, u kom formatu je bolje slikati, jer moderne kamere omogućavaju fotografisanjetografija u bilo kojem od ovih formata, a ponekad i u nekoliko odjednom!

    Format datoteke u kojem je slika pohranjena je u suštini kompromis između kvaliteta slike i veličine datoteke.

    Vjerovatno to već znate rasterska slika sastoji se od piksela. Način na koji je rasterska datoteka organizirana i u kojem obliku su informacije o pikselima pohranjene u njoj određuje format datoteke. Kvalitet slike rasterske datoteke određuju dva glavna parametra: veličina piksela (to jest, ukupan broj piksela) i tačnost boje piksela u predstavljanju stvarne boje.Sa veličinom piksela je jasno - što je više piksela (ili što je „manji“ piksel), to bolje.A tačnost reprodukcije boja ovisi o broju boja po pikselu ili dubini boje.

    Dubina boje (kvalitet prikazivanja boja, dubina bita slike) - količina memorije u broju bitova koji se koriste za pohranjivanje i predstavljanje boje prilikom kodiranja jednog piksela rasterska grafika ili video slike. Broj bitova označava broj gradacija (tonskih koraka) u svakoj komponenti boje ili, jednostavno, broj boja. Dodavanje 1 bita je dodavanje još jednog bita binarnom kodu boje.

    • 1-bitna boja (21 = 2 boje) binarna boja, najčešće predstavljena crnom i bijelom (ili crnom i zelenom)
    • 2-bitna boja (22 = 4 boje) CGA, gradacija siva NeXTstation
    • 3-bitna boja (23 = 8 boja) mnogi stari lični računari sa TV izlazom
    • 4-bitna boja (24 = 16 boja) poznata je kao EGA i u manjoj mjeri kao VGA standard visoke rezolucije
    • 5-bitna boja (25 = 32 boje) Originalni Amiga čipset
    • 6-bitna boja (26 = 64 boje) Originalni Amiga čipset
    • 8-bitna boja (28 = 256 boja) Naslijeđene Unix radne stanice, VGA niske rezolucije, Super VGA, AGA
    • 12-bitna boja (212 = 4,096 boja) na nekim sistemima Silicon Graphics, NeXTstation sistemima i Amiga HAM sistemima.

    Na primjer, radimo u RGB prostoru boja. To znači da postoje tri kanala iz kojih se formira konačna boja piksela: crveni kanal (Rad), zeleni kanal (Green) i plavi kanal (Blue). Pretpostavimo da su kanali četverobitni. To znači da svaki kanal ima mogućnost prikaza 16 boja. Kao rezultat, sav RGB će biti 12-bitni i moći će se prikazati

    C=16x16x16=4096 boja

    Dubina boje u ovom slučaju je 12 bita.

    Kada ljudi govore o 24-bitnom RGB-u, misle na 8-bitne kanale (svaki od 256 boja) sa ukupnim brojem opcija boja po pikselu

    C=256x256x256=16777216 boja.

    Brojka je impresivna. Ovaj broj boja za svaki piksel zadovoljava zahtjeve i najzahtjevnijeg fotografa.

    Malo o samim formatima.

    TIFF format

    TIFF je skraćenica od Tagged Image File Format i standard je za industriju štampe i štampe.

    Kao rezultat, ovo se događa:

    1. Ako je vaša kamera tako jednostavna da snima samo JPEG i želite da dobijete maksimalni kvalitet, postavite maksimalnu veličinu i minimalnu kompresiju i nemojte se mučiti činjenicom da nemate druge formate. U većini slučajeva, pažljivo ručno renderovana RAW slika odgovara JPEG-u koji je kamera automatski snimila.

    2. Vjerovatno ne biste trebali fotografisati u TIFF formatu. Snimanje u ovom formatu je teže, ali nema primjetne razlike u odnosu na kvalitetan JPEG.

    3. Ako imate priliku da slikate u , radite s tim. Sami ćete osjetiti da li je to pravo za vas. U nekim slučajevima, samo RAW omogućava pravljenje jedinstvena fotografija za veliko uvećanje pri štampanju.

    Ostaje još jedno rješenje, moglo bi se reći univerzalni. Postoji režim koji vam omogućava da istovremeno snimate kadrove u dva formata: RAW+ JPEG. Snimajte važne scene u ovom režimu. Moderno digitalno skladištenje informacija - i memorijske kartice i čvrsti diskovi - omogućavaju to. U tom slučaju, dobijate JPEG da odmah koristite fotografiju, bez trošenja vremena na reviziju. A ako vam je to potrebno, povjerite RAW datoteku stručnjaku na obradu.

    Fotografija. Formati datoteka.

    Lako je izračunati da će nekomprimirana slika u punoj boji veličine 2000 * 1000 piksela imati veličinu od oko 6 megabajta. Ako govorimo o slikama dobivenim profesionalnim fotoaparatima ili skenerima visoke rezolucije, onda njihova veličina može biti i veća. Unatoč brzom rastu kapaciteta uređaja za pohranu, različiti algoritmi kompresije slike i dalje su vrlo relevantni.
    Svi postojeći algoritmi mogu se podijeliti u dvije velike klase:

    • Algoritmi kompresije bez gubitaka;
    • Algoritmi kompresije sa gubitkom.
    Kada govorimo o kompresiji bez gubitaka, mislimo da postoji inverzni algoritam u odnosu na algoritam kompresije koji vam omogućava da precizno vratite originalnu sliku. Za algoritme kompresije s gubicima obrnuti algoritam ne postoji. Postoji algoritam koji vraća sliku koja se nužno ne podudara s originalnom. Algoritmi kompresije i oporavka odabrani su kako bi se postigao visok omjer kompresije uz održavanje vizualnog kvaliteta slike.

    Algoritmi kompresije bez gubitaka

    RLE algoritam
    Svi algoritmi RLE serija zasnivaju se na vrlo jednostavnoj ideji: ponavljajuće grupe elemenata zamjenjuju se parom (broj ponavljanja, element koji se ponavlja). Razmotrimo ovaj algoritam koristeći primjer niza bitova. Ovaj niz će izmjenjivati ​​grupe nula i jedinica. Štaviše, grupe će često imati više od jednog elementa. Tada će niz 11111 000000 11111111 00 odgovarati sljedećem skupu brojeva 5 6 8 2. Ovi brojevi označavaju broj ponavljanja (brojanje počinje od jedinica), ali ovi brojevi također moraju biti kodirani. Pretpostavit ćemo da se broj ponavljanja nalazi u rasponu od 0 do 7 (to jest, 3 bita su nam dovoljna da kodiramo broj ponavljanja). Tada se gore razmatrana sekvenca kodira sljedećim nizom brojeva 5 6 7 0 1 2. Lako je izračunati da je za kodiranje originalne sekvence potreban 21 bit, a u komprimiranom RLE metoda U obliku, ovaj niz traje 18 bita.
    Iako je ovaj algoritam vrlo jednostavan, njegova efikasnost je relativno niska. Štoviše, u nekim slučajevima korištenje ovog algoritma ne dovodi do smanjenja, već do povećanja dužine niza. Na primjer, razmotrite sljedeću sekvencu 111 0000 11111111 00. Odgovarajuća RL sekvenca izgleda ovako: 3 4 7 0 1 2. Dužina originalne sekvence je 17 bita, dužina komprimirane sekvence je 18 bita.
    Ovaj algoritam je najefikasniji za crno-bijele slike. Takođe se često koristi kao jedna od međufaza kompresije složenijih algoritama.

    Algoritmi rječnika

    Ideja iza algoritama rječnika je da se lanci elemenata originalnog niza kodiraju. Ovo kodiranje koristi poseban rečnik, koji se dobija na osnovu originalnog niza.
    Postoji čitava porodica algoritama rječnika, ali ćemo se osvrnuti na najčešći algoritam LZW, nazvan po svojim programerima Lepel, Ziv i Welch.
    Rječnik u ovom algoritmu je tabela koja se puni lancima kodiranja dok algoritam radi. Kada se komprimirani kod dekodira, rječnik se automatski vraća, tako da nema potrebe za prijenosom rječnika zajedno sa komprimiranim kodom.
    Rječnik se inicijalizira sa svim singleton stringovima, tj. prvi redovi rječnika predstavljaju abecedu kojom kodiramo. Tokom kompresije, traži se najduži lanac koji je već zabilježen u rječniku. Svaki put kada se naiđe na lanac koji još nije upisan u rječnik, on se dodaje tamo i izlazi komprimirani kod koji odgovara lancu koji je već napisan u rječniku. U teoriji se ne nameću ograničenja na veličinu rječnika, ali u praksi ima smisla ograničiti ovu veličinu, jer s vremenom počinju da se pojavljuju lanci koji se više ne nalaze u tekstu. Osim toga, kada udvostručimo veličinu tablice, moramo dodijeliti dodatni bit za pohranjivanje komprimiranih kodova. Kako bi se spriječile ovakve situacije, uvodi se poseban kod, simbolizirajući inicijalizaciju tablice sa svim singleton lancima.
    Pogledajmo primjer algoritma kompresije. Komprimovaćemo liniju cuckoocuckoocuckoohood. Pretpostavimo da će rječnik sadržavati 32 pozicije, što znači da će svaki njegov kod zauzimati 5 bita. U početku se rječnik popunjava na sljedeći način:

    Ova tabela postoji i na strani onoga ko komprimuje informaciju i na strani onoga ko je dekomprimuje. Sada ćemo pogledati proces kompresije.


    U tabeli je prikazan proces popunjavanja rječnika. Lako je izračunati da rezultirajući komprimirani kod zauzima 105 bita, a originalni tekst (pod pretpostavkom da potrošimo 4 bita na kodiranje jednog znaka) 116 bita.
    U suštini, proces dekodiranja se svodi na direktno dekodiranje kodova, a važno je da se tabela inicijalizira na isti način kao i tokom kodiranja. Pogledajmo sada algoritam dekodiranja.



    Mi možemo u potpunosti definirati string dodan u rječnik u i-tom koraku samo na i+1. Očigledno, i-ti red mora završiti prvim znakom i+1 reda. To. Upravo smo shvatili kako vratiti rječnik. Zanimljiva je situacija kada je kodiran niz oblika cScSc, gdje je c jedan znak, a S niz, a riječ cS se već nalazi u rječniku. Na prvi pogled može izgledati da dekoder neće moći riješiti ovu situaciju, ali zapravo svi redovi ovog tipa uvijek moraju završavati istim znakom kojim počinju.

    Statistički algoritmi kodiranja
    Algoritmi u ovoj seriji dodeljuju najkraći komprimovani kod najčešćim elementima sekvenci. One. sekvence iste dužine kodirane su komprimiranim kodovima različitih dužina. Štaviše, što se sekvenca češće javlja, kraći je odgovarajući komprimovani kod.
    Huffmanov algoritam
    Hafmanov algoritam vam omogućava da konstruišete prefiksne kodove. Prefiksne kodove možemo zamisliti kao staze u binarnom stablu: odlazak od čvora do njegovog lijevog potomka odgovara 0 u kodu, a desno dijete odgovara 1. Ako lišće stabla označimo simbolima da bude kodiran, dobijamo reprezentaciju kod prefiksa u obliku binarnog stabla.
    Hajde da opišemo algoritam za konstruisanje Hafmanovog stabla i dobijanje Hafmanovih kodova.
  1. Znakovi ulazne abecede formiraju listu slobodnih čvorova. Svaki list ima težinu koja je jednaka učestalosti pojavljivanja simbola
  2. Odabrana su dva slobodna čvora stabla sa najmanjim težinama
  3. Njihov roditelj je kreiran sa težinom jednakom njihovoj ukupnoj težini
  4. Roditelj se dodaje na listu slobodnih čvorova, a njegova dva podređena se uklanjaju sa ove liste
  5. Jednom luku koji napušta roditelj je dodeljen bit 1, a drugom bit 0
  6. Koraci koji počinju od drugog se ponavljaju sve dok samo jedan slobodni čvor ne ostane na listi slobodnih čvorova. Ovo će se smatrati korijenom drveta.
Koristeći ovaj algoritam, možemo dobiti Huffmanove kodove za dati alfabet, uzimajući u obzir učestalost pojavljivanja znakova.
Aritmetičko kodiranje
Algoritmi aritmetičkog kodiranja kodiraju nizove elemenata u razlomak. U ovom slučaju se uzima u obzir frekvencijska raspodjela elemenata. Trenutno su algoritmi aritmetičkog kodiranja zaštićeni patentima, pa ćemo se osvrnuti samo na osnovnu ideju.

Lako je izračunati da će nekomprimirana slika u punoj boji veličine 2000 * 1000 piksela imati veličinu od oko 6 megabajta. Ako govorimo o slikama dobivenim profesionalnim fotoaparatima ili skenerima visoke rezolucije, onda njihova veličina može biti i veća. Unatoč brzom rastu kapaciteta uređaja za pohranu, različiti algoritmi kompresije slike i dalje su vrlo relevantni.
Svi postojeći algoritmi mogu se podijeliti u dvije velike klase:

  • Algoritmi kompresije bez gubitaka;
  • Algoritmi kompresije sa gubitkom.
Kada govorimo o kompresiji bez gubitaka, mislimo da postoji inverzni algoritam u odnosu na algoritam kompresije koji vam omogućava da precizno vratite originalnu sliku. Ne postoji inverzni algoritam za algoritme kompresije sa gubicima. Postoji algoritam koji vraća sliku koja se nužno ne podudara s originalnom. Algoritmi kompresije i oporavka odabrani su kako bi se postigao visok omjer kompresije uz održavanje vizualnog kvaliteta slike.

Algoritmi kompresije bez gubitaka

RLE algoritam
Svi algoritmi serije RLE zasnovani su na vrlo jednostavnoj ideji: ponavljajuće grupe elemenata zamjenjuju se parom (broj ponavljanja, ponavljajući element). Razmotrimo ovaj algoritam koristeći primjer niza bitova. Ovaj niz će izmjenjivati ​​grupe nula i jedinica. Štaviše, grupe će često imati više od jednog elementa. Tada će niz 11111 000000 11111111 00 odgovarati sljedećem skupu brojeva 5 6 8 2. Ovi brojevi označavaju broj ponavljanja (brojanje počinje od jedinica), ali ovi brojevi također moraju biti kodirani. Pretpostavit ćemo da se broj ponavljanja nalazi u rasponu od 0 do 7 (to jest, 3 bita su nam dovoljna da kodiramo broj ponavljanja). Zatim se gore diskutovana sekvenca kodira sljedećim nizom brojeva 5 6 7 0 1 2. Lako je izračunati da kodiranje originalnog niza zahtijeva 21 bit, au RLE komprimiranom obliku ovaj niz traje 18 bita.
Iako je ovaj algoritam vrlo jednostavan, njegova efikasnost je relativno niska. Štoviše, u nekim slučajevima korištenje ovog algoritma ne dovodi do smanjenja, već do povećanja dužine niza. Na primjer, razmotrite sljedeću sekvencu 111 0000 11111111 00. Odgovarajuća RL sekvenca izgleda ovako: 3 4 7 0 1 2. Dužina originalne sekvence je 17 bita, dužina komprimirane sekvence je 18 bita.
Ovaj algoritam je najefikasniji za crno-bijele slike. Takođe se često koristi kao jedna od međufaza kompresije složenijih algoritama.

Algoritmi rječnika

Ideja iza algoritama rječnika je da se lanci elemenata originalnog niza kodiraju. Ovo kodiranje koristi poseban rečnik, koji se dobija na osnovu originalnog niza.
Postoji čitava porodica algoritama rječnika, ali ćemo se osvrnuti na najčešći algoritam LZW, nazvan po svojim programerima Lepel, Ziv i Welch.
Rječnik u ovom algoritmu je tabela koja se puni lancima kodiranja dok algoritam radi. Kada se komprimirani kod dekodira, rječnik se automatski vraća, tako da nema potrebe za prijenosom rječnika zajedno sa komprimiranim kodom.
Rječnik se inicijalizira sa svim singleton stringovima, tj. prvi redovi rječnika predstavljaju abecedu kojom kodiramo. Tokom kompresije, traži se najduži lanac koji je već zabilježen u rječniku. Svaki put kada se naiđe na lanac koji još nije upisan u rječnik, on se dodaje tamo i izlazi komprimirani kod koji odgovara lancu koji je već napisan u rječniku. U teoriji se ne nameću ograničenja na veličinu rječnika, ali u praksi ima smisla ograničiti ovu veličinu, jer s vremenom počinju da se pojavljuju lanci koji se više ne nalaze u tekstu. Osim toga, kada udvostručimo veličinu tablice, moramo dodijeliti dodatni bit za pohranjivanje komprimiranih kodova. Kako bi se takve situacije spriječile, uvodi se poseban kod koji simbolizira inicijalizaciju tablice sa svim lancima od jednog elementa.
Pogledajmo primjer algoritma kompresije. Komprimovaćemo liniju cuckoocuckoocuckoohood. Pretpostavimo da će rječnik sadržavati 32 pozicije, što znači da će svaki njegov kod zauzimati 5 bita. U početku se rječnik popunjava na sljedeći način:

Ova tabela postoji i na strani onoga ko komprimuje informaciju i na strani onoga ko je dekomprimuje. Sada ćemo pogledati proces kompresije.

U tabeli je prikazan proces popunjavanja rječnika. Lako je izračunati da rezultirajući komprimirani kod zauzima 105 bita, a originalni tekst (pod pretpostavkom da potrošimo 4 bita na kodiranje jednog znaka) 116 bita.
U suštini, proces dekodiranja se svodi na direktno dekodiranje kodova, a važno je da se tabela inicijalizira na isti način kao i tokom kodiranja. Pogledajmo sada algoritam dekodiranja.


Mi možemo u potpunosti definirati string dodan u rječnik u i-tom koraku samo na i+1. Očigledno, i-ti red mora završiti prvim znakom i+1 reda. To. Upravo smo shvatili kako vratiti rječnik. Zanimljiva je situacija kada je kodiran niz oblika cScSc, gdje je c jedan znak, a S niz, a riječ cS se već nalazi u rječniku. Na prvi pogled može izgledati da dekoder neće moći riješiti ovu situaciju, ali zapravo svi redovi ovog tipa uvijek moraju završavati istim znakom kojim počinju.

Statistički algoritmi kodiranja
Algoritmi u ovoj seriji dodeljuju najkraći komprimovani kod najčešćim elementima sekvenci. One. sekvence iste dužine kodirane su komprimiranim kodovima različitih dužina. Štaviše, što se sekvenca češće javlja, kraći je odgovarajući komprimovani kod.
Huffmanov algoritam
Hafmanov algoritam vam omogućava da konstruišete prefiksne kodove. O prefiksnim kodovima možemo razmišljati kao o stazama u binarnom stablu: odlazak od čvora do njegovog lijevog djeteta odgovara 0 u kodu, a desno dijete odgovara 1. Ako lišće stabla označimo simbolima da bude kodiran, dobijamo reprezentaciju prefiksnog koda u binarnom stablu.
Hajde da opišemo algoritam za konstruisanje Hafmanovog stabla i dobijanje Hafmanovih kodova.
  1. Znakovi ulazne abecede formiraju listu slobodnih čvorova. Svaki list ima težinu koja je jednaka učestalosti pojavljivanja simbola
  2. Odabrana su dva slobodna čvora stabla sa najmanjim težinama
  3. Njihov roditelj je kreiran sa težinom jednakom njihovoj ukupnoj težini
  4. Roditelj se dodaje na listu slobodnih čvorova, a njegova dva podređena se uklanjaju sa ove liste
  5. Jednom luku koji napušta roditelj je dodeljen bit 1, a drugom bit 0
  6. Koraci koji počinju od drugog se ponavljaju sve dok samo jedan slobodni čvor ne ostane na listi slobodnih čvorova. Ovo će se smatrati korijenom drveta.
Koristeći ovaj algoritam, možemo dobiti Huffmanove kodove za dati alfabet, uzimajući u obzir učestalost pojavljivanja znakova.
Aritmetičko kodiranje
Algoritmi aritmetičkog kodiranja kodiraju nizove elemenata u razlomak. U ovom slučaju se uzima u obzir frekvencijska raspodjela elemenata. Trenutno su algoritmi aritmetičkog kodiranja zaštićeni patentima, pa ćemo se osvrnuti samo na osnovnu ideju.
Neka se naša abeceda sastoji od N simbola a1,...,aN i njihove frekvencije pojavljivanja p1,...,pN, redom. Podijelimo poluinterval. Ovi koraci su važni da bi koder mogao efikasno raditi u sljedećem koraku.

1.2. PrEP

Kao ključni korak algoritma kompresije, diskretna kosinusna transformacija (u daljem tekstu DCT) je tip Fourierove transformacije i, kao i ova druga, ima inverznu transformaciju (DCCT). Ako sliku posmatramo kao skup prostornih valova, gdje osi X i Y odgovaraju širini i visini slike, a osa Z prikazuje vrijednosti boja odgovarajućih piksela, tada se možemo pomaknuti sa prostornog predstavljanje slike na njenu spektralna reprezentacija i nazad. DCT pretvara N x N matricu piksela u matricu frekvencijskih koeficijenata odgovarajuće veličine.



Rice. 4.

U rezultujućoj matrici, niskofrekventne komponente se nalaze bliže gornjem levom uglu, a komponente više frekvencije se pomeraju dole udesno. Zbog činjenice da se glavni dio grafičkih slika na ekranu sastoji od niskofrekventnih informacija, koristeći rezultirajuću matricu možete različito odbaciti najmanje važna informacija sa minimalnim gubitkom vida. Dakle, DCT vam omogućava da odaberete informacije koje se mogu bezbedno odbaciti bez unošenja ozbiljnih izobličenja u sliku. Teško je zamisliti kako bi se ovaj zadatak mogao izvršiti na originalnoj slici.

Iz formula (slika 4) jasno je da je za izračunavanje jednog elementa rezultirajuće matrice potrebno O(N 2) vremena, pa je gotovo nemoguće transformirati cijelu matricu. Tim za razvoj JPEG-a predložio je najbolje rješenje za ovaj problem: podijeliti originalnu matricu na kvadrate standardne veličine 8x8 i transformirajte svaki od njih. Korišćenje većih blokova će poboljšati kvalitet kompresije, ali ne u nedogled, jer je verovatnoća da su veoma udaljene tačke slične jedna drugoj premala.

Vrijedi napomenuti da se tijekom izračunavanja koriste samo 32 unaprijed izračunate kosinusne vrijednosti, što vam omogućava značajno povećanje brzine konverzije. To nesumnjivo dovodi do djelomičnog gubitka informacija, ali je njihov obim relativno beznačajan.

Blago povećanje performansi može se postići ako se u proračunima koristi samo cjelobrojna aritmetika, koja je, međutim, relevantna samo za starije kompjuteri, budući da se u modernim računarima cijena operacija nad brojevima s pokretnim zarezom ne razlikuje od operacija nad cijelim brojevima. Također, korištenje cjelobrojne aritmetike negativno utiče na kvalitet komprimirane slike, što ovu metodu čini neprihvatljivom za savremenih kompjutera. Pošto je DCT vrsta Fourierove transformacije, ovdje se mogu koristiti sve metode za povećanje performansi Fourierove transformacije.

1.3. Zaokruživanje

Sljedeća faza, u kojoj dolazi do glavnog gubitka informacija, je zaokruživanje ili kvantizacija. Kao što vidite, DCT ne vrši nikakvu kompresiju ili kodiranje. Njegov glavni zadatak je transformirati originalnu sliku u oblik pogodan za naknadne operacije na njemu.

Zaokruživanje je proces smanjenja količine informacija potrebnih za pohranjivanje DCT matrice, uz djelomičan gubitak tačnosti. Prema JPEG standardu, za to se koristi matrica zaokruživanja (RO). Svaki element originalne DCT matrice odgovara MO elementu. Rezultirajuća matrica se dobiva dijeljenjem originalne matrice sa MO. U ovom slučaju, niskofrekventne vrijednosti u DCT matrici odgovaraju manjim MO koeficijentima, što omogućava zadržavanje značajnijih, niskofrekventnih informacija i odbacivanje manje važnih visokofrekventnih informacija. Zbog činjenice da su niskofrekventne komponente koncentrisane u lijevoj strani gornji ugao DCT matrice, MO vrijednosti rastu s lijeva na desno i odozgo prema dolje.


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

Primjer matrice zaokruživanja s faktorom kvalitete 2.

Rezultati zaokruživanja i kvaliteta rekonstruisane slike direktno zavise od odabrane matrice zaokruživanja. JPEG standard vam omogućava da koristite bilo koji MO, ali ISO je kroz opsežna eksperimentalna testiranja razvio skup matrica koje vam omogućavaju postizanje optimalnih rezultata.

1.4. Kompresija

Posljednja faza algoritma JPEG kodiranja je kompresija. Nakon obrade DCT matrice pomoću MO, u rezultujućoj matrici pojavljuje se veliki broj nula, posebno u visokofrekventnom području (donji desni kut).

Prvi korak je zamjena vrijednosti u gornjem lijevom kutu rezultirajuće matrice relativnom vrijednošću. Budući da su susjedni blokovi slike međusobno slični, kodiranje sljedećeg elementa (0,0) kroz razliku s prethodnim će biti efikasnije. Drugi korak je direktna primjena algoritma kodiranja ponavljanja (LZW) na proces velika količina uzastopne nule. Eksperimentalna ispitivanja su pokazala da se najbolji rezultati mogu postići ako se matriks obiđe u cik-cak, kao što je prikazano na slici ispod.

Rice. 5.

Konačno, u trećem i posljednjem koraku, rezultirajući rezultat se kompresuje kao normalni podaci korištenjem Huffman algoritma ili aritmetičkog kodiranja ovisno o implementaciji. Ova faza se naziva “entropijsko kodiranje” (u JPEG terminologiji).

1.5. Dekodiranje

Pošto je DCT Fourierova transformacija, postoji inverzna diskretna kosinusna transformacija (IDCT). Algoritam za dekodiranje ponavlja algoritam kodiranja obrnutim redoslijedom.

2.JPEG2000

U početku je novi standard razvijen kao osnova za budući standard kompresije bez gubitaka JPEG-LS, ali je kasnije odbačen zbog pojave efikasnijih algoritama. Zbog razvoja tehnologije, JPEG standard je postepeno gubio na važnosti. Programeri JPEG2000 su se nadali da će stvoriti standard koji će ispraviti mnoge greške u postojećim standardima. Među njihovim zadacima bili su:

  • Eliminacija nije efektivna kompresija u području niske frekvencije. Postojeći algoritmi su dobro obavili kompresiju srednjih i visokofrekventnih područja, ali su pokazali loše rezultate u niskofrekventnom području.
  • Kompresija bez gubitaka i gubitaka. U vrijeme razvoja nije postojao standard koji bi dopuštao kompresiju s gubicima i bez gubitaka u jednom kompresijskom toku.
  • Obrada velikih slika. Postojeći algoritmi nisu dozvoljavali efikasnu kompresiju slika većih od 64Kx64K bez postavljanja pločica.
  • Struktura objedinjenog algoritma kompresije. Trenutna implementacija JPEG podržava 44 modifikacije, od kojih je većina bila specifična za aplikaciju i nije podržana od strane većine dekodera.
  • Otpornost na buku. U vrijeme razvoja JPEG-a, mrežne tehnologije još nisu bile dovoljno razvijene, a dizajneri JPEG-a nisu razmišljali o otpornosti na buku prilikom prijenosa slika preko nesigurnih kanala ili mogućnosti obnavljanja slike ako je oštećena kao rezultat prijenosa.
  • Kompjuterski generisane slike. Originalni algoritmi su dobro radili na digitalnim fotografijama i slikama dobijenim digitalnim fotoaparatom ili skenerom, ali nisu efikasno obrađivali slike stvorene na računaru, na primjer, pomoću uređivača slika.
  • Složeni dokumenti. JPEG je bio vrlo loš pri obradi složenih 2D slika (posebno tekstualnih slika).

Sljedeći dijagram prikazuje osnovne korake JPEG2000 kodera.


Rice. 6.


Rice. 7.

Za razliku od JPEG-a, JPEG2000 koder ne zahtijeva podjelu slike na male kvadratne blokove, budući da DWT (diskretna talasna transformacija) koja se koristi tokom rada algoritma radi na fragmentima bilo koje veličine. S druge strane, ponekad, ako je količina memorije koja je dostupna koderu za rad manja od količine memorije potrebne za kodiranje cijele slike, slika se dijeli na kvadratne pločice, koje se kodiraju nezavisno jedna od druge. Zatim ćemo razmotriti kodiranje jedne pločice. Preostali koraci su slični JPEG-u.

Rice. 8.

2.2. Vlaknaste ploče

JPEG2000 koristi Diskretnu Wavelet Transformaciju da podijeli sliku na visokofrekventne i niskofrekventne regije. DWP obrađuje svaki red i stupac izvorne slike koristeći frekvencijski filter.

Rice. 9.

Zbog činjenice da svaki prolaz pomoću frekventnog filtera na izlazu udvostručuje količinu informacija, nakon obrade veličina slike se smanjuje za pola. Nakon jedne faze obrade lesonita, obrađeni fragment se dijeli na četiri segmenta:

  • LL - niske frekvencije po redovima i kolonama
  • HL – visoke frekvencije u redovima i niske frekvencije u kolonama
  • LH – niske frekvencije u redovima i visoke frekvencije u kolonama
  • HH – visoke frekvencije u redovima i kolonama

Prema standardu, broj faza može biti od 0 do 32. Za redovnu sliku koristi se od 4 do 8 stupnjeva. U svakoj narednoj fazi obrađuje se samo niskofrekventni region (LL), jer visokofrekventni regioni obično ne sadrže važne informacije.


Rice. 10.

Rice. jedanaest.

2.3. Zaokruživanje

Da bi se zaokružili DWT koeficijenti, koristi se konstantni kvantizator sa mrtvom zonom. (Sl. 14) Za svaki fragment se koristi konstantna vrijednost koraka zaokruživanja za sve koeficijente ovog fragmenta. Formula za izračunavanje zaokruženih vrijednosti prikazana je na slici 12. Ovdje je y početna vrijednost koeficijenta, znak(y) određuje predznak koeficijenta, a Δb je vrijednost koraka zaokruživanja. Mrtva zona kvantizer je interval sa rasponom od 2Δb oko nule, daje veći broj nula na izlazu.

2.4. Kodiranje

Kodiranje rezultirajućih zaokruženih koeficijenata vrši se blok po blok. Prema standardu JPEG2000, neposredno prije kodiranja, fragmenti se dijele na dovoljno male blokove (na primjer, veličine 32x32 ili 64x64) tako da su svi blokovi jednog fragmenta iste veličine. Particioniranje na blokove se vrši kako bi se implementirala fleksibilnija organizacija komprimiranih informacija radi povećanja otpornosti na buku i tako dalje.


Rice. 16.

U JPEG2000, svaki blok je kodiran zasebno. Algoritam kodiranja prelazi matricu koeficijenta zaokruživanja svakog bloka u trakama, kao što je prikazano na slici 17. Blokovi su podijeljeni u blokove nominalne visine 4. Trake se zatim skeniraju od vrha do dna, a stupci u svakoj traci su prelazi se s lijeva na desno.


Rice. 17.

Tokom procesa kodiranja, koeficijenti u bloku su virtualno predstavljeni kao bitne ravni. Jednu od ovih ravni čine predznaci koeficijenata; preostale ravni odgovaraju različitim znamenkama vrijednosti koeficijenta (položaj bita u ravnini odgovara položaju koeficijenta u bloku). Kodiranje se vrši ravninom: prvo se kodira ravan koja odgovara najznačajnijoj cifri koeficijenata, zatim sljedeća u opadajućem redoslijedu, itd. Može se dogoditi da N bitnih ravni najvišeg prioriteta (NPB ravni) ne sadrže jedinice. U ovom slučaju, prva ravan po redu koja sadrži barem jednu jedinicu postaje NPB ravan. Prazne ravni koje joj prethode se izostavljaju tokom kodiranja, a informacija o njihovom broju se unosi u zaglavlje bloka.

Aritmetičko kodiranje je zasnovano na kontekstualnom modelu. Kontekst se formira kao funkcija vrijednosti bitova koji okružuju bit koji se kodira. Svaka bitna ravan, osim NBP-a, obično se kodira u tri prolaza. Tokom prvog prolaza koda, informacije o značaju koeficijenata se distribuiraju. Tokom kodiranja, svakom koeficijentu u kodiranom bloku se dodeljuje parametar značajnosti. Koeficijent se naziva značajnim ako u bitnim ravnima koje su u ovom trenutku već kodirane, postoji barem jedan bit ovog koeficijenta različit od nule.

Za svaki bit ravni, ako odgovarajući koeficijent još nije značajan i ako je barem jedan susjedni koeficijent već značajan, kodira se činjenica značajnosti za trenutni koeficijent, odnosno vrijednost ovog bita trenutnog kodiranog ravan je zapravo kodiran. Ako se ispostavi da je kodirani bit različit od nule, odmah nakon obrade, kodira se odgovarajući bit bitne ravni predznaka koeficijenta (sign encoding).

Tokom drugog prolaza, bitovi koeficijenata koji su trenutno značajni i netaknuti u prvom prolazu se kodiraju. Za razliku od prethodnog prolaza, kada se odluka o kodiranju donosila na osnovu informacija o značaju susjednih koeficijenata, tokom ovog prolaza bitovi se kodiraju bez greške.

Treći i posljednji prolaz obrađuje one bitove koji nisu obrađeni tokom prvog i drugog prolaza. Tokom ovoga završna faza aritmetičko kodiranje koristi se zajedno sa grupnim kodiranjem.

Suštinski detalj predviđen standardom je mogućnost preskakanja prolaza koda, što je još jedan izvor povećanja efikasnosti zbog gubitka informacija (prvi, najočigledniji izvor je kvantizacija). Ova funkcija se aktivno koristi za kontrolu brzine generiranja koda.

2.5. Organizacija podataka

Važna prednost standarda koji se razmatra je mogućnost pristupa pojedinačnim elementima slike bez potpunog dekodiranja njegovog prikaza. Ova mogućnost je osigurana, prvo, podjelom originalne slike na područja koja se ne preklapaju (pločice), koje su kodirane kao zasebne slike, i drugo, predstavljanjem koda pojedinačne pločice u obliku dijelova (slojeva), svaki od što je ukupni kod koeficijenata koji odgovaraju određenoj njegovoj (pločici) površini. Slojevi su zauzvrat podijeljeni u takozvane pakete koji sadrže kod blokova koeficijenata za različitim nivoima raspadanje. Da bi dekodirao bilo koji oblast slike, dovoljno je odrediti kojim pločicama pripada, i koji slojevi koji se odnose na te pločice sadrže kod blokova koeficijenata potrebnih za obnavljanje tražene površine.



Rice. 20.

Naravno, "prikladan" prikaz slike možda neće biti od koristi u smislu efikasnosti kompresije. Doista, sa smanjenjem veličine strukturnih elemenata (pločice, površine pločica koje formiraju slojeve, itd.), efikasnost kompresije se donekle smanjuje. Standard nam u ovom slučaju ostavlja izbor: s jedne strane, imamo mogućnost da dobijemo informacijske reprezentacije koje nam omogućavaju da brzo izdvojimo i uredimo dijelove slike, s druge strane, standard ne sprječava stvaranje predstave informacija koje su efikasne po obimu.

Kako bi se osigurala otpornost na buku i lak pristup informacijama, standard JPEG2000 obezbjeđuje sistem markera i segmenata markera. Segmenti markera sadrže parametre informacija ograničenih markerima. Podaci koji počinju markerom mogu se ispravno interpretirati bez ikakvih dodatnih informacija (to ne znači da se cjelina može rekonstruirati iz fragmenata), što omogućava djelimično obnavljanje slike čiji je prikaz oštećen. Uvođenje elemenata otpornosti na buku daje zeleno svjetlo upotrebi standarda u svim vrstama telekomunikacijskih aplikacija.

Postizanje visoke kvalitete kompresije je, naravno, bio jedan od glavnih zadataka prilikom kreiranja standarda, i tu su programeri napravili jasan napredak. Standard JPEG2000 je otprilike 2 puta efikasniji od JPEG standarda kada je komprimiran sa gubitkom i 5-20% kada je komprimiran bez gubitka. Naravno, efikasnost kompresije bez gubitaka u ovom slučaju nije tako visoka kao, recimo, JPEG-LS standard, ali je sasvim prihvatljiva. Što se tiče efikasnosti kompresije sa gubicima, ovdje standard omogućava da dobijete rezultate koji su blizu najboljim rezultatima za ovu vrstu metoda danas.

3.JPEG-LS

Format JPEG-LS zasnivao se na formatu LOCO-I(Kompresija za slike niske složenosti bez gubitaka). Algoritam kompresije LOCO-I bez gubitaka, usvojen kao osnova za razvoj JPEG-LS standarda, po prvi put je omogućio ne samo način rada bez gubitaka, već i skoro bez gubitaka (kompresija sa ograničenim gubicima koje definiše korisnik). Za razliku od JPEG2000 načina rada bez gubitaka, JPEG-LS se pokazao zaista uspješnim: uz veću efikasnost kompresije, novi standard pruža veliku brzinu kompresije/dekompresije i nije previše zahtjevan za računarske resurse.

Važno je shvatiti da JPEG-LS format:

  • nije proširenje ili modifikacija JPEG metode;
  • ne koristi ni DCT ni aritmetičko kodiranje;
  • koristi slabu kvantizaciju samo u načinu rada "gotovo bez gubitaka".

3.1. Upoznavanje sa osnovnim konceptima i principima rada

Kompresija podataka bez gubitaka sastoji se od dva odvojena nezavisna dijela: modeliranja i kodiranja. Hajde da definišemo neke termine koje ćemo aktivno koristiti u budućnosti:

Encoder je „odgovoran“ za proces kodiranja, odnosno: prima kao ulaz originalnu sliku u digitalnom formatu i sve potrebne parametre definisane standardom, te pomoću posebnog skupa procedura kreira skup podataka koji sadrži komprimiranu sliku. Dekoder "odgovara" na proces dekodiranja i konvertovanja fragmenata, odnosno: primanje podataka sa kompresovanom slikom i svim potrebnim parametrima kao ulaz, daje rekonstruisanu sliku

JPEG-LS dekoder se malo razlikuje od kodera, pa se ovaj algoritam kompresije može nazvati gotovo simetričnim. Evo pojednostavljenog dijagrama koji pokazuje principe kodiranja:



Rice. 21.

Neke informacije o originalna slika: kao što je prikazano na dijagramu ispod (slika 22), originalna slika se može sastojati od Nf komponenti. Svaka komponenta Ci sadrži dvodimenzionalni niz piksela (uzoraka) x i kolona i y i redova. Veličine komponenti zavise od dva parametra: X i Y, gdje je X maksimum među vrijednostima x i, a Y je maksimum među y i vrijednostima svih komponenti. (U standardu JPEG-LS, čitavo poglavlje je posvećeno razlikama u radu sa višekomponentnim slikama u odnosu na jednokomponentne slike, ali u ovom članku ćemo se fokusirati samo na rad sa jednokomponentnim slikama).



Rice. 22.

Slika prikazuje orijentaciju svake komponente: gore, dolje, lijevo i desno. Redoslijed kojim se pikseli podvrgavaju procedurama kodiranja određuje se na sljedeći način: slijeva nadesno (s lijeva na desno) i odozgo prema dolje (od vrha do dna) po komponentama.

Kontekstni pikseli a, b, c, d se koriste za predviđanje trenutnog piksela x. Ovisno o kontekstu, koder bira način rada: serijski (način rada) ili redovni način rada. Serijska moda je izabran ako je vjerovatno da će se y i z podudarati, redovno- inače. Hajde da ovdje napravimo napomenu u vezi sa prisustvom opcije "skoro bez gubitaka": Kada je ova opcija omogućena, serijski mod će biti odabran ako su y i z skoro identični prema parametru tolerancije NEAR.

U slučaju korištenja serijske mode, počinjemo s pretraživanjem trenutna linija iz piksela x i pronađite najveću dužinu niza piksela koji se poklapaju sa kontekstualnim pikselom a. Dakle, unutar tekuće linije dobijamo niz identičnih piksela koji se po vrijednosti poklapaju sa poznatim pikselom a. Sve što ostaje je kodirati dužinu serije. (Ovo se radi pomoću niza od 32 elementa J.) Možda ste već pretpostavili da kada je omogućena opcija „gotovo bez gubitaka“, niz piksela blizu a se bira pomoću parametra NEAR.

Pogledajmo sada naše radnje u slučaju korištenja redovnog načina rada. Vrijednosti piksela a, b i c se koriste za izračunavanje predviđanja piksela x (Px). Tada se izračunava takozvana greška prognoze (Errval). Njegova vrijednost je jednaka razlici između vrijednosti x i Px. Errval se prilagođava nekim pojmom koji ovisi o kontekstu, a zatim se kodira korištenjem Golomb kodova. Golomb kod zavisi od a, b, c, d i Errval istih piksela, koji su pohranjeni u posebnim nizovima A i N. Kada je omogućena opcija „skoro bez gubitaka“, greška predviđanja se dalje kvantizira prije kodiranja.


Rice. 23.

3.2. Encoder

JPEG-LS se uglavnom koristi kao metoda kompresije informacija bez gubitaka, stoga je oporavljena datoteka slike obično identična originalnoj datoteci. Na način gotovo bez gubitaka, originalna slika i rekonstruirana slika mogu se razlikovati. Rekonstruisani piksel ćemo označiti sa Rp, a originalni piksel sa p.

U fazi inicijalizacije, koder izvodi sljedeće operacije:

  • Parametri se izračunavaju RANGE = floor((MAXVAL + 2 * NEAR) / (2 * BLIZA + 1)) + 1, qbpp = ceil(log RANGE), bpp = max(2, ceil(log(MAXVAL + 1)) ), LIMIT = 2 * (bpp + max(8, bpp)) . (U slučaju kodiranja bez gubitaka, NEAR = 0, RANGE = MAXVAL + 1. Ako je omogućen način rada "gotovo bez gubitaka", NEAR > 0). MAXVAL i NEAR su parametri koje postavlja aplikacija koja implementira algoritam.
  • Indeksni nizovi N, A, B i C su inicijalizirani. Objasnimo njihovu svrhu: N se koristi za pohranjivanje učestalosti pojavljivanja svakog konteksta, A - za akumulaciju vrijednosti greške predviđanja, B - za izračunavanje sistematskog odstupanja, C - za pohranjivanje vrijednosti korekcije greška prognoze.
  • Varijable za način rada su inicijalizirane 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) .
  • Dvije pomoćne varijable Nn su inicijalizirane, Nn=0 za kodiranje burst piksela.

Hajde da predstavimo neke funkcije i varijable koje će se kasnije koristiti:

GetNextSample() Funkcija: prima informacije o sljedećem pikselu izvorne slike i postavlja odgovarajuće vrijednosti varijabli x, a, b, c, d, Ix, Ra, Rb, Rc, Rd. Ako je očitani piksel na kraju reda, GetNextSample() postavlja EOLine = 1. U svim ostalim slučajevima, EOLline = 0. Vrijednosti Ra, Rb, Rc, Rd nasljeđuju svoje vrijednosti iz prethodno izračunate Rx vrijednosti. EOLine Globalna varijabla: postavljena funkcijom GetNextSample(): jednaka 1 ako je trenutni piksel posljednji u redu, jednaka 0 u suprotnom. AppendToBitStream(a,b) Funkcija: Dodaje nenegativan broj u binarnom obliku u kodirani tok bitova pomoću b bitova. Najznačajniji bitovi se prvo dodaju. Quantize(a) Funkcija: Koristi se za kvantiziranje greške predviđanja u načinu rada "gotovo bez gubitaka". ComputeRx() Funkcija: Vraća rekonstruisanu Rx vrijednost za trenutni piksel (koristi kvantiziranu "grešku predviđanja").

Iz gornje slike (slika 23) jasno je da pikseli a, b, c i d igraju značajnu ulogu u kodiranju piksela x. Hajde da pokušamo da shvatimo šta se dešava kada ovi pikseli nedostaju. Dakle, kod kodiranja gornje linije nedostaju kontekstualni pikseli c, b i d, pa se njihove vrijednosti smatraju nula. Ako je trenutni piksel na početku ili kraju linije, tada su pikseli a, c ili d nedefinirani. U ovom slučaju, a i d koriste rekonstruisanu Rb vrijednost piksela b (ili nulu za gornji red), a c koristi rekonstruiranu vrijednost a kada kodira prvi znak prethodnog reda. Dakle, koder mora obaviti dio posla dekodera rekonstruirajući neke piksele.

Koder počinje sa sljedeća tri koraka:

Nakon uspostavljanja konteksta Q, koder predviđa piksel x. Prvo, predviđanje Px se izračunava pomoću takozvanog „prediktora za otkrivanje ivice“:

ako je (Rc > = max(Ra, Rb)) Px = min(Ra, Rb);
drugo(
ako (Rc<= min(Ra, Rb))
Px= max(Ra, Rb);
ostalo
Px = Ra + Rb - Rc;
}

Hajde da objasnimo suštinu „pravila ivice“. Da biste to učinili, razmotrite slučaj b< а. При этом условии «правило края» выбирает b в качестве прогноза х во многих случаях, когда вертикальный край изображения находится непосредственно слева от х. Аналогично, пиксель а выбирается в качестве прогноза х во многих случаях, когда горизонтальный край находится непосредственно над х. Если край не обнаруживается, то «правило края» вычисляет прогноз в виде а + b - с, что имеет простую геометрическую интерпретацию. Если каждый пиксель является точкой трехмерного пространства, то прогноз а + b - с помещает Рх на ту же плоскость, что и точки а, b и с.

Sljedeći korak je korekcija predviđanja iz pristranosti korištenjem broja SIGN (ovisno o tri broja zona Qi), vrijednosti korekcije C(Q) (izvedene iz sistematskih predrasuda i o kojima se ovdje ne govori) i parametra MAXVAL.

ako (ZNAK == +1)
Px = Px + C(Q);
ostalo
Px = Px - C(Q);

Ako (Px > MAXVAL)
Px = MAXVAL;
inače ako (Px< 0)
Px = 0;

Nakon što se pronađe predviđanje Px, koder izračunava grešku predviđanja Errval kao razliku x - Px, ali mijenja predznak ako je vrijednost SIGN negativna.

Na način gotovo bez gubitaka, greška se kvantizira i enkoder koristi ovu rekonstruiranu vrijednost Rx piksela x na isti način kao što bi to učinio dekoder. Osnovni korak kvantizacije je sljedeći:

if (Errval > 0)
Errval = (Errval + BLIZU) / (2 * BLIZU + 1);
ostalo
Errval = - (Errval - BLIZU) / (2 * BLIZU + 1);

Ovo koristi parametar NEAR, ali postoje neki detalji koji ovdje nisu prikazani. Glavni korak rekonstrukcije je pronaći Rx = Px + SIGN * Errval * (2 * BLIZA + 1) .

Greška prognoze (nakon moguće kvantizacije) se smanjuje po modulu. (Nakon toga, spreman je za glavni korak kodiranja).

ako (Errval< 0)
Errval = Errval + RANGE;
if (Errval >= ((RANGE + 1) / 2))
Errval = Errval - RANGE;

Golomb kodovi (glavni parametar je označen sa b). U JPEG-LS ovaj parametar je označen kao m. Ako je broj m već izabran, tada se Golombov kod nenegativnog cijelog broja n sastoji od dva dijela: unarnog koda cijelog dijela broja n/m i binarno predstavljanje n mod m. Ovaj kod je idealan za cijele brojeve koji imaju geometrijsku distribuciju (tj. kada je vjerovatnoća broja n (1 - r) * r n , 0< r < 1) . Для каждого геометрического распределения найдется такое число m, что код Голомба, построенный по m, имеет наименьшую возможную среднюю длину. Najjednostavniji slučaj, kada je m stepen 2 (m = 2 k), dovodi do jednostavnih operacija kodiranja/dekodiranja. Šifra broja n u ovom slučaju se sastoji od k nižih cifara broja n, kojem prethodi unarni kod broja sastavljen od preostalih viših cifara broja n. Ovaj specijalni Golomb kod je označen sa G(k).

Na primjer, izračunajmo G(2) kod broja n = 19 = 10011 2 . Pošto je k = 2, onda je m = 4. Počnimo s dvije najmanje značajne cifre, 11 2, broja n. Oni su jednaki 3, što je isto kao n mod m (3 = 19 mod 4). Preostale najznačajnije cifre, 100 2, daće broj 4, koji je jednak celom delu n/m (19/4 = 4,75). Unarni kod od 4 je 00001, tako da je G(2) kod od n = 19 00001|11.

U praksi uvijek postoji konačan broj nenegativnih cijelih brojeva. Označimo najveći broj sa I. Najveća dužina G(0) je I + 1, a pošto I mogu biti veliki, poželjno je ograničiti veličinu Golombovog koda. Ovo se radi pomoću posebnog Golomb koda LG(k, glimit) koji zavisi od dva parametra k i glimit. Prvo morate formirati broj q od najznačajnijih cifara broja n. Ako je 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) бит.

Greške prognoze nisu nužno pozitivni brojevi. One su jednake nekim razlikama, koje mogu biti nula ili negativne. Međutim, Golomb kodovi su napravljeni za pozitivni brojevi. Stoga, prije kodiranja, negativne vrijednosti greške treba da se odraze u skup nenegativnih brojeva. Da biste to učinili, koristite sljedeće mapiranje:
MErrval =
2 * Errval ako je Errval >= 0,
2 * |Errval| ako Errval< 0.

Ovaj prikaz mijenja negativne i pozitivne vrijednosti u nizu 0, -1, +1, -2, +2, -3,... .

Tabela ispod navodi neke od grešaka predviđanja, prikazane vrijednosti i njihove LG(2, 32) kodove, pod pretpostavkom da je abeceda veličine 256 (tj. I = 255 i ceil(log I) = 8).

Tabela: greške prognoze, displeji i LG kodovi (2, 32)

Greška prognoze Prikazana vrijednost Kod
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

Sada moramo razgovarati o izboru parametra k za Golombove kodove. Ovo se radi adaptivno. Parametar k ovisi o kontekstu i njegova vrijednost se ažurira svaki put kada se pronađe piksel s tim kontekstom. Izračun k se može izraziti jednostavnom linijom:
za (k=0; (N[Q]<gdje su A i N nizovi indeksa od 0 do 364. Ova formula koristi kontekst Q kao indeks dva niza. Na početku, k se inicijalizira na nulu, a zatim se petlja izvršava. U svakoj iteraciji petlje, element niza N[Q] se pomjera ulijevo za k bitova i upoređuje sa A[Q]. Ako je pomaknuta vrijednost N[Q] veća ili jednaka A[Q], tada se bira trenutna vrijednost k. U suprotnom, k se povećava za 1 i test se ponavlja.

Nakon pronalaženja broja k, greška predviđanja Errval se pretvara u broj MErrval, koji je kodiran pomoću koda LG(k, LIMIT). LIMIT broj je parametar. Ažuriranje nizova A i N (zajedno sa pomoćnim nizom B) ilustrovano je sljedećim fragmentom koda (parametar RESET postavlja aplikacija):

B[Q] = B[Q] + Errval * (2 * BLIZU + 1);
A[Q] = A[Q] + abs(Errval);
ako (N[Q] == RESET) (
A[Q] = A[Q]>>1;
B[Q] = B[Q]>>1;
N[Q] = N[Q]>>1;
}
N[Q] = N[Q] + 1;

Sada razgovarajmo o izračunavanju sistematskog odstupanja prognoze. Vrijednost za ispravljanje predviđanja C[Q] mora se ažurirati na kraju kodiranja piksela x. Za to su potrebne dvije varijable - B[Q] i N[Q]. N[Q] je broj pojavljivanja konteksta Q od inicijalizacije. B[Q] je sistematsko odstupanje koje omogućava da se vrijednost C[Q] ažurira najviše jednom po iteraciji. Dakle, prediktorska vrijednost C[Q] se izračunava prema sljedećem kodu:

ako (B[Q]<= -N[Q]) {
B[Q] = B[Q] + N[Q];
ako (C[Q] > MIN_C)
C[Q] = C[Q] - 1;
ako (B[Q]<= -N[Q])
B[Q] = -N[Q] + 1;
}
inače ako (B[Q] > 0) (
B[Q] = B[Q] - N[Q];
ako (C[Q]< MAX_C)
C[Q] = C[Q] + 1;
ako (B[Q] > 0)
B[Q] = 0;
}

Konstante MIN_C i MAX_C su minimum i maksimum moguće značenje indeksni niz C, jednak -128 i 127, respektivno.

Kodiranje u serijskom načinu rada se obavlja drugačije. Podsjetimo da enkoder odabire ovaj način rada kada detektuje uzastopne piksele x čije se Ix vrijednosti poklapaju i jednake su rekonstruiranoj vrijednosti Ra kontekstnog piksela a. Za opciju "gotovo bez gubitaka", pikseli u nizu moraju imati Ix vrijednosti koje zadovoljavaju nejednakost |Ix - Ra|<= NEAR . Серия не должна выходить за пределы текущей строки. Длина серии кодируется (сам пиксель кодировать не нужно, поскольку он равен Ra), и если конец серии находится раньше конца строки, то после ее закодированной длины будет сразу записан код следующего пикселя (который прерывает серию). Две основные задачи кодера в этой моде состоят

  1. u praćenju serije i kodiranju njene dužine;
  2. u kodiranju piksela koji je prekinuo seriju.

Serija se može pratiti na sljedeći način:

RUNval = Ra;
RUNcnt = 0;
dok (abs(Ix - RUNval)<= NEAR) {
RUNcnt = RUNcnt + 1;
Rx = RUNval;
if (EOline == 1)
break;
ostalo
GetNextSample();
}

Objasnimo neke od uvedenih vrijednosti: RUNcnt je ponavljajući broj piksela (za serijski način), a RUNval je trenutna vrijednost rekonstruiranog ponavljajućeg piksela.

Hajde da opišemo proces kodiranja serije. Prvi fragment koda opisuje kodiranje za segmente pokretanja dužine rm:

dok (RUNcnt >= (1<AppendToBitStream(1, 1);
RUNcnt = RUNcnt - (1<if (RUNindex< 31))
RUNindex = RUNindex + 1;
}

Sljedeći kod ilustruje kodiranje za segmente pokretanja dužine manje od rm:

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

Ovdje koder koristi tabelu J, koja se sastoji od 32 unosa, označenih sa rk. J je inicijaliziran vrijednostima
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 .

Za svaku vrijednost rk označavamo rm = 2 rk. Brojevi rm (ima ih ukupno 32) nazivaju se red kodova. Prve 4 vrijednosti rk imaju rm = 2 0 = 1. Za drugu četvorku rm = 2 1 = 2, a za sljedeću četvorku rm = 2 2 = 4. Za posljednji broj rm = 2 15 = 32768. enkoder izvodi opisanu proceduru za pronalaženje dužine rada, koja je pohranjena u varijablu RUNlen. Ova varijabla se zatim kodira cijepanjem na pojmove čije su vrijednosti jednake uzastopnim brojevima rm. Na primjer, ako je RUNlen=6, tada se predstavlja kao 6 = 1 + 1 + 1 + 1 + 2 koristeći prvih pet brojeva rm. Kodira se pomoću 5 bita. Snimanje se vrši pomoću instrukcije AppendToBitStream(l,l). Svaki put kada se upiše 1, odgovarajuća rm vrijednost se oduzima od RUNlen . Ako je RUNlen na početku bio jednak 6, onda se sukcesivno smanjuje na 5, 4, 3, 2 i 0.

Može se dogoditi da dužina serije RUNlen nije jednaka cijelom zbroju brojeva rm. Na primjer, RUNlen = 7. U ovom slučaju, pet bitova od 1 se upisuje kao kod, nakon čega slijedi prefiksni bit i ostatak RUNlen-a (u našem primjeru to je 1), koji je upisan u datoteku kao broj rk bitova (trenutna vrijednost rk u našem primjeru je 2). Ova posljednja operacija se izvodi pozivanjem procedure AppendToBitStream(RUNcnt, J). Bit prefiksa je 0 ako je niz prekinut drugim pikselom u liniji. Ako serija ide do kraja reda, tada je bit prefiksa 1.

Drugi glavni zadatak enkodera, koji je kodiranje burst piksela, radi se na sličan način kao kodiranje trenutnog piksela. Hajde da razgovaramo o detaljima njegove implementacije.

Razmotrite situaciju u kojoj je napredak kodiranja prekinut krajem niza piksela: kako će novi piksel koji je uzrokovao prekid biti kodiran? Ovaj problem se rešava kodiranjem razlike između vrednosti Ix na trenutnoj poziciji x i rekonstruisane vrednosti piksela a ili b (podsetimo se da su to susedni pikseli u odnosu na x – videti sliku 23). U ovom slučaju razmatraju se dvije različite situacije: prvo, kada abs(Ra - Rb)<= NEAR , вторая - в противном случае. По сути кодирование пикселя прерывания серии происходит теми же методами, что и кодирование нового пикселя в регулярной моде с тем лишь дополнением, что Ix должно отличаться от Ra на величину большую NEAR, иначе ход кодирования будет продолжен. Опишем операции, которые должны быть выполнены:

ako (abs(Ra - Rb)<= NEAR)
RItype = 1;
ostalo
RItype = 0;
if (RItype == 1)
Px = Ra;
ostalo
Px = Rb;
Errval = Ix - Rb;

Isječak koda iznad definira indeks RItype i grešku predviđanja za piksel x. Zatim, ako je potrebno, promijenite predznak Errval-a, a za opciju “gotovo bez gubitaka” također kvantizirajte grešku predviđanja:

ako ((RItip == 0) && (Ra > Rb)) (
Errval = -Errval;
ZNAK = -1;
ostalo
ZNAK = 1;
ako (BLIZU > 0) (
Errval = Quantize(Errval);
Rx = ComputeRx();
}
ostalo
Rx = Ix;
Errval = ModRange(Errval, RANGE);

Sada izračunajmo pomoćnu varijablu TEMP, koja će se koristiti za izračunavanje parametra k u Golomb kodovima.

if (RItype == 0)
TEMP = A;
ostalo
TEMP = A + (N>>1);

Postavimo Q = RItype + 365. Parametar k za Golombove kodove ćemo izračunati na sljedeći način: za (k=0; (N[Q]<

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

Ovim se završava opis JPEG-LS kodera. Imajte na umu da je svakako nepotpuna, ali nismo si postavili za cilj kopiranje standarda ove metode. Svi izostavljeni detalji mogu se naći u standardu. Pređimo sada na kratak opis principa rada dekodera.

3.3. Dekoder

Kao što je ranije spomenuto, JPEG-LS metoda je gotovo simetrična, tako da nećemo kopirati opis kodera s manjim promjenama - ove informacije se mogu pročitati u standardu. Zaustavimo se samo na tome kako se dekodiranje odvija u serijskom načinu rada. Nakon što su sve vrijednosti za trenutni piksel izračunate, pročitajte novi bit R iz bitnog toka. Ako je jednako 1, tada:

  1. Slika je dopunjena sa 2 J|RUNindex| piksela sa Ra vrijednošću.
  2. Ako je u prethodnom koraku slika već bila dopunjena sa 2 J|RUNindex| piksela i RUNindex< 31, то RUNindex увеличивается на 1. Если последний пиксель в строке ещё не декодирован, то мы снова считываем биты, в противном случае переходим к вычислению всех требуемых величин.

Ako je bit 0, tada:

  1. Pročitajte J|RUNindex| bit iz toka bitova i pretvara se u broj, a slika se dopunjava pikselima sa Ra vrijednostima u količini koja odgovara izračunatom broju.
  2. Ako je RUNindex > 0, tada se RUNindex smanjuje za 1.
  3. Piksel prekida serije se dekodira i izračunavanje svih potrebnih veličina počinje iznova.

3.4. Format datoteke

Kompresovani fajl sastoji se od:

  • iz segmenata podataka koji sadrže Golomb kodove i dužine izvođenja;
  • iz segmenata markera (informacije potrebne za dekoder);
  • iz segmenta markera "ostatak" (neki rezervisani JPEG markeri).

Ovdje marker nazivamo bajtom jedinica, nakon čega slijedi poseban kod koji signalizira početak novog segmenta. Ako nakon tokena slijedi bajt čiji je najznačajniji bit 1, tada je taj bajt početak segmenta tokena. U suprotnom, segment podataka počinje.

3.5. Golomb kodovi

Već smo više puta spomenuli Golomb kodove. Šta je? Golombov kod nenegativnog cijelog broja "može biti efikasan Huffmanov kod." Zavisi od izbora nekog parametra b. Princip kodiranja je sljedeći:

  • izračunavaju se dvije količine
    q = sprat((n - 1) / b) i
    r = n - qb - 1;
  • kod je konstruiran iz dva dijela: prvi dio je q u unarnom kodu, drugi dio je binarni izraz za r, koji se sastoji od floor(log 2 b) bitova za male ostatke i ceil(log 2 b) bitova za velike .

Ne pružamo matematičko opravdanje za upotrebu Golomb kodova u JPEG-LS, samo napominjemo da ako se ulazni tok podataka sastoji od cijelih brojeva, a vjerovatnoća broja n jednaka je 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. Zaključak

Format JPEG-LS razvijen je prvenstveno za pohranjivanje slika u medicinske svrhe, odnosno za one slučajeve kada je važno imati veliku sliku bez i najmanjeg gubitka kvaliteta. Kao što je već spomenuto, za osnovu je uzet LOCO-I format, razvijen u zidovima HP Labs. Zatim je dalje razvijen kroz zajedničke napore HP-a i Mitsubishija. Obe kompanije su dozvolile da se njihovi patenti na ovom formatu koriste bez plaćanja licence, pa se JPEG-LS može naći i u redovnim PC programima.

Dozvolite mi da objasnim na svom primjeru. Možda mi možete pomoći da razumijem neke stvari. Zadatak koji sam sebi postavio je sljedeći. Prenesite okvir (po komandi) sa WEB kamere u memoriju mobilnog telefona s naknadnim prijenosom na drugi mobilni telefon. Iz vašeg članka nije jasno na kojem formatu treba biti zasnovan, dostupnosti algoritma. Dalje - kosinusna transformacija - samo površno tumačenje, a gdje da pogledam detaljan algoritam sa konkretnim primjerom (recimo, proučavajte matematičku analizu, ali čak i tamo gotovo da nema konkretnih primjera, a ako ih ima, onda cijeli dijelovi proračuni su promašeni. Možda postoji konkretan priručnik, pa pogledajte. Struktura organizacije datoteka je potpuno izbačena, a veze nisu čak ni naznačene: „U rezultirajućoj matrici, niskofrekventne komponente se nalaze bliže gornjem lijevom uglu , a one više frekvencije se pomjeraju dolje udesno”, čini mi se da se to tako radi, ali ne ide (možda griješim!).

Pitanje: kako snimiti, na primjer, samo potrebne informacije iz JPG okvira za dalje dekodiranje u rezoluciji ekrana telefona, bez korištenja PC-a, koristeći MK. Dovoljna je crno-bela verzija okvira. Na koji FFxx treba obratiti pažnju i zabilježiti samo te informacije. Gdje mogu dobiti strukturu okvira WEB kamere? Razumijem da je to pitanje kompleksno i višestruko. Na primjer, na MK-u je nemoguće dešifrirati okvir, a zatim ga komprimirati u traženoj rezoluciji, ali je vjerojatno moguće izrezati barem gornji ugao sa potrebnim formatom.

Bio bih zahvalan na informacijama.

Šta mogu = programirati u VB, MK. Samostalni operativni interaktivni razvoj upravljanja putem mobilnog telefona sa više releja, audio kontrola pomoću mobilnog telefona.

>> Drugi korak je direktna primjena >> ponavljajućeg algoritma kodiranja (LZW)

mozda RLE?

Naravno, u ovom koraku JPEG (pogledajte kontekst) je RLE. Hvala što ste identifikovali grešku.

Najbolji članci na ovu temu