Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Windows 7, XP
  • JPEG, JPEG2000, JPEG-LS. Kompresija slike s gubicima i bez gubitaka

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

Fotografije i slike se međusobno razlikuju ne samo po sadržaju, već i po drugim “računalnim” karakteristikama. Na primjer, prema veličini.

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

Slike se razlikuju i po kvaliteti. Mislim da ste više puta naišli na fotografije izrazito loše kvalitete. To je vidljivo golim okom. Na primjer, dva identične fotografije, ali jedan je kvalitetniji, a drugi lošije kvalitete.

I događa se da se čini da crtežu nedostaju boje. Evo primjera.

A za sve to odgovoran je format ili vrsta datoteke.

Zapravo, slike dolaze u raznim 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.

Međusobno se razlikuju, prije svega, kvalitetom. A kvaliteta se razlikuje po broju (zasićenosti) boja.

Na primjer, slikam sliku različitim bojama. A onda odjednom neki od njih budu gotovi i morate završiti slikanje s onim što imate. Naravno, pokušat ću učiniti sve što je moguće kako to ne bi uvelike utjecalo na rezultat, ali ipak slika neće ispasti onako kako bih želio - izblijedjela, mutna.

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

Ovo je prilično grub primjer. Zapravo, sve je malo kompliciranije, ali mislim da ste shvatili ono što je bitno.

Uobičajeni formati slika

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

GIF je popularan format slike na internetu. Možete ih spremiti u njega bez gubitka kvalitete, ali s ograničenim brojem boja - 256. GIF je stekao posebnu popularnost zbog činjenice da može stvoriti male animirane (pokretne) slike.

JPG je format za fotografije i slike s velikim brojem boja. U njemu možete spremiti sliku bez gubitka kvalitete i s gubitkom.

PNG je moderan format slike. Dobiva se ova vrsta slike mala veličina i bez gubitka kvalitete. Vrlo prikladno: datoteka je mala, a kvaliteta je dobra. Također podržava transparentnost.

TIFF - slike su vrlo dobra kvaliteta, bez kompresije.Sukladno tome, veličina takvih datoteka je ogromna. TIFF se koristi kada je kvaliteta od velike važnosti. Na primjer, prilikom izrade posjetnica, brošura, naslovnica časopisa.

Koji format odabrati

  • BMP - ako je ovo crtež napravljen u programu Paint i čuvat ćete ga samo na računalu.
  • GIF - ako je animacija ili crtež s malim brojem boja za objavu na internetu.
  • PNG - ako se radi o slici koja ima puno boja ili neke prozirne dijelove.
  • JPG (jpeg) - ako je fotografija.
  • TIFF - slika za ispis (vizitke, brošure, plakati i sl.).

Pozdrav, dragi prijatelji. Danas ćemo razgovarati o tome koji je format slike najbolje koristiti na web mjestu, koji su formati grafičkih datoteka danas dostupni za web mjesto i je li potrebno tražiti nove grafičke formate.

Dobivam dosta ovakvih pitanja; mnogi moji studenti pitaju mogu li koristiti nove formate SVG i WebP i gdje je najbolje koristiti te slike. Naravno, možete koristiti nove formate, samo trebate razumjeti koji je format za što 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 stranica na mreži. Ali ljepota ima svoju cijenu

Neoptimizirane slike jedan su od čimbenika koji usporavaju web stranicu, kao što pokazuju usluge provjere.

Stoga ćete uvijek morati odabrati koji format odabrati za sliku. O tome će ovisiti njegova veličina i kvaliteta. I koristiti slike manje veličine i bez gubitka kvalitete, trebali biste znati neke stvari.

Koje slike za web stranice danas koristim?

Sve slike za web stranice dijele se 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, gumbe, ikone i elemente dizajna. Ove su slike popularne među programerima i vlasnicima web stranica. Glavni nedostatak rasterskih slika je što se ne skaliraju dobro.

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

Vektor slike se sastoje od linija i putnih točaka. Informacije o slici pohranjuju se u matematičkim uputama za renderiranje, što omogućuje skaliranje takvih slika koliko god želite bez gubitka kvalitete.

Sve te slike mogu se i koriste na modernim web stranicama. Samo trebate shvatiti da prije postavljanja na stranicu, !

Opis popularnih formata slika za web mjesto

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

JPEG

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

Slike u ovom formatu su prilično dobro optimizirane bez gotovo ikakvog gubitka kvalitete, što vam omogućuje da dobijete manju datoteku bez vizualnog gubitka kvalitete. 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ćuje vam da ne brinete o problemima s prikazom na web 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 razine prozirnosti, dostupan je u dvije vrste: 8 i 24-bitni. Oba podržavaju transparentnost.

8-bitni nije jako popularan, ali 24-bitni se široko koristi za razne slike Na liniji. Zbog transparentnosti, omogućuje vam stvaranje kombiniranih slika. Često se koristi za stvaranje animiranih gumba i ikona gdje je potreban efekt prozirnosti.

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

Format također podržavaju svi preglednici i uređaji, što osigurava da se može prikazati na bilo kojem zaslonu.

Kvaliteta slika izgleda bolja od JPG-a, ali će težina datoteke biti veća. To se mora uzeti u obzir prilikom postavljanja datoteka na web mjesto.

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 naširoko se koristi u izradi bannera, gumba, ikona i tako dalje.

Na modernim web stranicama ovaj se format sve rjeđe koristi.

Zatim, razgovarajmo o relativno novijim formatima SVG i WebP, koji nisu toliko popularni, ali dobivaju popularnost i podršku, te su savršeno prilagođeni zahtjevima brzine učitavanja i prilagodljivosti web stranice.

SVG

To je XML format vektorske datoteke. Format je počeo dobivati ​​popularnost nedavno, jer je prethodno bio slabo podržan u preglednicima. A zbog problema s prikazom, nitko ga nije žurio koristiti.

Danas SVG podržavaju svi moderni preglednici. Ali problemi s prikazom i dalje se javljaju.

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

SVG format je lagan, visoko skalabilan, pruža oštre slike na bilo kojoj razlučivosti zaslona, ​​podržava animaciju, može se kontrolirati putem CSS-a i postaviti u HTML, smanjujući broj zahtjeva.

WebP

Format otvorenog koda koji je razvio Google posebno za Internet. YouTube danas koristi konverziju minijatura videozapisa u WebP.

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

No, unatoč prednostima formata, ne podržavaju ga svi preglednici, na primjer IE, Edge, Firefox i Safari.

Postoje načini zaobilaženja ovih ograničenja, ali one sprječavaju svugdje korištenje formata.

Zaključak

Prijatelji, nadam se da sam sve jasno objasnio i da sada znate koji je format slike najbolje koristiti na web mjestu i zašto ne inzistiram na korištenju jednog određenog formata, već preporučujem integrirani pristup.

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

Raspravimo u komentarima koje formate koristite na svojim stranicama, što vam se sviđa, a što ne.

To je sve za danas, čekam vaše komentare.

Srdačan pozdrav, Maxim Zaitsev.

    S Tri najpopularnija formata datoteka su JPEG, RAW i TIFF. Ponekad možete čuti nesuglasice među fotografima - koji je format datoteke bolji za fotografiju, u kojem formatu je bolje slikati, jer moderni fotoaparati omogućuju fotografiranjetografije u bilo kojem od ovih formata, a ponekad i u nekoliko odjednom!

    Format datoteke u kojem je slika pohranjena u biti je kompromis između kvalitete slike i veličine datoteke.

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

    Dubina boje (kvaliteta prikaza boje, bitna dubina 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 Sljedeća stanica
    • 3-bitna boja (23 = 8 boja) mnoga naslijeđena osobna računala s 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) Legacy Unix radne stanice, VGA niske rezolucije, Super VGA, AGA
    • 12-bitna boja (212 = 4096 boja) na nekim Silicon Graphics sustavima, NeXTstation sustavima i sustavima Amiga HAM moda.

    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 toga, sav RGB bit će 12-bitni i moći će se prikazivati

    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 (256 boja svaki) s 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 kratica za Tagged Image File Format i standard je za tisak i tiskarsku industriju.

    Kao rezultat toga događa se sljedeće:

    1. Ako je vaš fotoaparat tako jednostavan da snima samo JPEG-ove i želite ih dobiti maksimalna kvaliteta, postavite maksimalnu veličinu i minimalnu kompresiju i nemojte se mučiti činjenicom da nemate druge formate. U većini slučajeva, mukotrpno ručno izrađena RAW slika odgovara JPEG-u koji je automatski snimio fotoaparat.

    2. Vjerojatno ne biste trebali fotografirati u TIFF-u. Snimanje u ovom formatu je teže, ali nema primjetne razlike u odnosu na visokokvalitetni JPEG.

    3. Ako imate priliku slikati u , radite s njim. Sami ćete osjetiti da li vam odgovara. U nekim slučajevima samo RAW omogućuje izradu jedinstvena fotografija za veliko povećanje pri ispisu.

    Ostaje još jedno rješenje, reklo bi se univerzalni. Postoji način rada koji vam omogućuje snimanje okvira u dva formata istovremeno: RAW+ JPEG. Snimite važne scene u ovom načinu. Moderna pohrana digitalnih informacija - i memorijske kartice i tvrdi diskovi - to omogućuju. U tom slučaju dobivate JPEG za korištenje fotografije odmah, 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 kamerama ili skenerima visoke rezolucije, tada njihova veličina može biti i veća. Unatoč brzom rastu kapaciteta uređaja za pohranu podataka, različiti algoritmi za kompresiju slike i dalje su vrlo relevantni.
    Svi postojeći algoritmi mogu se podijeliti u dvije velike klase:

    • Algoritmi kompresije bez gubitaka;
    • Algoritmi kompresije s gubitkom.
    Kada govorimo o kompresiji bez gubitaka, mislimo na to da postoji inverzni algoritam algoritmu kompresije koji vam omogućuje da točno vratite izvornu sliku. Za algoritme kompresije s gubitkom obrnuti algoritam ne postoji. Postoji algoritam koji vraća sliku koja ne mora nužno točno odgovarati izvornoj. Algoritmi kompresije i oporavka odabrani su kako bi se postigao visok omjer kompresije uz zadržavanje vizualne kvalitete slike.

    Algoritmi kompresije bez gubitaka

    RLE algoritam
    Svi algoritmi RLE serija temelje se na vrlo jednostavnoj ideji: grupe elemenata koje se ponavljaju zamjenjuju se parom (broj ponavljanja, element koji se ponavlja). Razmotrimo ovaj algoritam na primjeru niza bitova. Ovaj niz će izmjenjivati ​​grupe nula i jedinica. Štoviš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 (brojenje počinje od jedinica), ali te brojeve također treba kodirati. Pretpostavit ćemo da je broj ponavljanja u rasponu od 0 do 7 (odnosno, 3 bita su nam dovoljna da kodiramo broj ponavljanja). Tada je gore razmatrani niz kodiran sljedećim nizom brojeva 5 6 7 0 1 2. Lako je izračunati da je 21 bit potreban za kodiranje izvornog niza, au komprimiranom RLE metoda U obliku, ovaj niz ima 18 bita.
    Iako je ovaj algoritam vrlo jednostavan, njegova učinkovitost je relativno niska. Štoviše, u nekim slučajevima korištenje ovog algoritma ne dovodi do smanjenja, već do povećanja duljine niza. Na primjer, razmotrite sljedeći niz 111 0000 11111111 00. Odgovarajući RL niz izgleda ovako: 3 4 7 0 1 2. Dužina originalnog niza je 17 bita, duljina komprimiranog niza je 18 bita.
    Ovaj je algoritam najučinkovitiji za crno-bijele slike. Također se često koristi kao jedan od međufaza kompresije složenijih algoritama.

    Rječnički algoritmi

    Ideja iza rječničkih algoritama je da su lanci elemenata izvornog niza kodirani. Ovo kodiranje koristi poseban rječnik, koji se dobiva na temelju izvornog niza.
    Postoji čitava obitelj rječničkih algoritama, ali mi ćemo se osvrnuti na najčešći algoritam LZW, nazvan po svojim kreatorima Lepelu, Zivu i Welchu.
    Rječnik u ovom algoritmu je tablica 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 pojedinačnim nizovima, tj. prvi redovi rječnika predstavljaju abecedu kojom kodiramo. Tijekom kompresije traži se najdulji 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 tamo dodaje, a izlazi komprimirani kod koji odgovara lancu koji je već upisan u rječnik. U teoriji nema ograničenja na veličinu rječnika, ali u praksi ima smisla ograničiti ovu veličinu, jer se s vremenom počinju pojavljivati ​​lanci koji se više ne nalaze u tekstu. Osim toga, kada udvostručimo veličinu tablice, moramo dodijeliti dodatni bit za pohranu komprimiranih kodova. Kako bi se takve situacije spriječile uvodi se poseban kod, simbolizirajući inicijalizaciju tablice sa svim pojedinačnim lancima.
    Pogledajmo primjer algoritma kompresije. Komprimirati ćemo liniju cuckoocuckoococoohood. Pretpostavimo da će rječnik sadržavati 32 mjesta, što znači da će svaki njegov kod zauzimati 5 bita. U početku se rječnik popunjava na sljedeći način:

    Ta tablica postoji i na strani onoga tko komprimira informaciju i na strani onoga tko je dekompresira. Sada ćemo pogledati proces kompresije.


    U tablici je prikazan postupak popunjavanja rječnika. Lako je izračunati da rezultirajući komprimirani kod zauzima 105 bita, a izvorni tekst (pod pretpostavkom da potrošimo 4 bita na kodiranje jednog znaka) ima 116 bita.
    U biti, proces dekodiranja se svodi na direktno dekodiranje kodova, a važno je da se tablica inicijalizira na isti način kao i kod kodiranja. Sada pogledajmo algoritam dekodiranja.



    Niz dodan rječniku u i-tom koraku možemo u potpunosti definirati samo na i+1. Očito, i-ti red mora završiti prvim znakom i+1 retka. Da. Upravo smo shvatili kako vratiti rječnik. Zanimljiva je situacija kada je kodirana sekvenca oblika cScSc, gdje je c jedan znak, a S niz, a riječ cS je već u rječniku. Na prvi pogled može se činiti da dekoder neće moći riješiti ovu situaciju, ali zapravo sve linije ove vrste moraju uvijek završavati istim znakom kojim počinju.

    Statistički algoritmi kodiranja
    Algoritmi u ovoj seriji dodjeljuju najkraći komprimirani kod najčešćim elementima sekvenci. Oni. nizovi iste duljine kodirani su komprimiranim kodovima različitih duljina. Štoviše, što se niz češće pojavljuje, to je odgovarajući komprimirani kod kraći.
    Huffmanov algoritam
    Huffmanov algoritam omogućuje vam konstruiranje prefiks kodova. Prefiksne kodove možemo zamisliti kao staze u binarnom stablu: prelazak od čvora do njegovog lijevog potomka odgovara 0 u kodu, a desnog djeteta odgovara 1. Ako označimo listove stabla simbolima biti kodiran, dobivamo reprezentaciju kod prefiksa u obliku binarnog stabla.
    Opišimo algoritam za konstruiranje Huffmanovog stabla i dobivanje Huffmanovih kodova.
  1. Znakovi ulazne abecede tvore listu slobodnih čvorova. Svaki list ima težinu koja je jednaka učestalosti pojavljivanja simbola
  2. Odabrana su dva slobodna čvora stabla s najmanjim težinama
  3. Njihov je roditelj stvoren s težinom jednakom njihovoj ukupnoj težini
  4. Roditelj se dodaje na popis slobodnih čvorova, a njegova dva djeteta se uklanjaju s ovog popisa
  5. Jednom luku koji napušta nadređeni luk dodijeljen je bit 1, drugom je dodijeljen bit 0
  6. Koraci počevši od drugog ponavljaju se sve dok na popisu slobodnih čvorova ne ostane samo jedan slobodni čvor. Ovo će se smatrati korijenom stabla.
Pomoću ovog algoritma možemo dobiti Huffmanove kodove za danu abecedu, uzimajući u obzir učestalost pojavljivanja znakova.
Aritmetičko kodiranje
Algoritmi aritmetičkog kodiranja kodiraju nizove elemenata u razlomak. U ovom slučaju uzima se u obzir frekvencijska distribucija 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 kamerama ili skenerima visoke rezolucije, tada njihova veličina može biti i veća. Unatoč brzom rastu kapaciteta uređaja za pohranu podataka, različiti algoritmi za kompresiju slike i dalje su vrlo relevantni.
Svi postojeći algoritmi mogu se podijeliti u dvije velike klase:

  • Algoritmi kompresije bez gubitaka;
  • Algoritmi kompresije s gubitkom.
Kada govorimo o kompresiji bez gubitaka, mislimo na to da postoji inverzni algoritam algoritmu kompresije koji vam omogućuje da točno vratite izvornu sliku. Ne postoji inverzni algoritam za algoritme kompresije s gubitkom. Postoji algoritam koji vraća sliku koja ne mora nužno točno odgovarati izvornoj. Algoritmi kompresije i oporavka odabrani su kako bi se postigao visok omjer kompresije uz zadržavanje vizualne kvalitete slike.

Algoritmi kompresije bez gubitaka

RLE algoritam
Svi algoritmi serije RLE temelje se na vrlo jednostavnoj ideji: grupe elemenata koje se ponavljaju zamjenjuju se parom (broj ponavljanja, element koji se ponavlja). Razmotrimo ovaj algoritam na primjeru niza bitova. Ovaj niz će izmjenjivati ​​grupe nula i jedinica. Štoviš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 (brojenje počinje od jedinica), ali te brojeve također treba kodirati. Pretpostavit ćemo da je broj ponavljanja u rasponu od 0 do 7 (odnosno, 3 bita su nam dovoljna da kodiramo broj ponavljanja). Zatim je slijed o kojem se gore raspravljalo kodiran 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 uzima 18 bita.
Iako je ovaj algoritam vrlo jednostavan, njegova učinkovitost je relativno niska. Štoviše, u nekim slučajevima korištenje ovog algoritma ne dovodi do smanjenja, već do povećanja duljine niza. Na primjer, razmotrite sljedeći niz 111 0000 11111111 00. Odgovarajući RL niz izgleda ovako: 3 4 7 0 1 2. Dužina originalnog niza je 17 bita, duljina komprimiranog niza je 18 bita.
Ovaj je algoritam najučinkovitiji za crno-bijele slike. Također se često koristi kao jedan od međufaza kompresije složenijih algoritama.

Rječnički algoritmi

Ideja iza rječničkih algoritama je da su lanci elemenata izvornog niza kodirani. Ovo kodiranje koristi poseban rječnik, koji se dobiva na temelju izvornog niza.
Postoji čitava obitelj rječničkih algoritama, ali mi ćemo se osvrnuti na najčešći algoritam LZW, nazvan po svojim kreatorima Lepelu, Zivu i Welchu.
Rječnik u ovom algoritmu je tablica 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 pojedinačnim nizovima, tj. prvi redovi rječnika predstavljaju abecedu kojom kodiramo. Tijekom kompresije traži se najdulji 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 tamo dodaje, a izlazi komprimirani kod koji odgovara lancu koji je već upisan u rječnik. U teoriji nema ograničenja na veličinu rječnika, ali u praksi ima smisla ograničiti ovu veličinu, jer se s vremenom počinju pojavljivati ​​lanci koji se više ne nalaze u tekstu. Osim toga, kada udvostručimo veličinu tablice, moramo dodijeliti dodatni bit za pohranu komprimiranih kodova. Kako bi se spriječile takve situacije, uvodi se poseban kod koji simbolizira inicijalizaciju tablice sa svim lancima od jednog elementa.
Pogledajmo primjer algoritma kompresije. Komprimirati ćemo liniju cuckoocuckoococoohood. Pretpostavimo da će rječnik sadržavati 32 mjesta, što znači da će svaki njegov kod zauzimati 5 bita. U početku se rječnik popunjava na sljedeći način:

Ta tablica postoji i na strani onoga tko komprimira informaciju i na strani onoga tko je dekompresira. Sada ćemo pogledati proces kompresije.

U tablici je prikazan postupak popunjavanja rječnika. Lako je izračunati da rezultirajući komprimirani kod zauzima 105 bita, a izvorni tekst (pod pretpostavkom da potrošimo 4 bita na kodiranje jednog znaka) ima 116 bita.
U biti, proces dekodiranja se svodi na direktno dekodiranje kodova, a važno je da se tablica inicijalizira na isti način kao i kod kodiranja. Sada pogledajmo algoritam dekodiranja.


Niz dodan rječniku u i-tom koraku možemo u potpunosti definirati samo na i+1. Očito, i-ti red mora završiti prvim znakom i+1 retka. Da. Upravo smo shvatili kako vratiti rječnik. Zanimljiva je situacija kada je kodirana sekvenca oblika cScSc, gdje je c jedan znak, a S niz, a riječ cS je već u rječniku. Na prvi pogled može se činiti da dekoder neće moći riješiti ovu situaciju, ali zapravo sve linije ove vrste moraju uvijek završavati istim znakom kojim počinju.

Statistički algoritmi kodiranja
Algoritmi u ovoj seriji dodjeljuju najkraći komprimirani kod najčešćim elementima sekvenci. Oni. nizovi iste duljine kodirani su komprimiranim kodovima različitih duljina. Štoviše, što se niz češće pojavljuje, to je odgovarajući komprimirani kod kraći.
Huffmanov algoritam
Huffmanov algoritam omogućuje vam konstruiranje prefiks kodova. Prefiksne kodove možemo zamisliti kao staze u binarnom stablu: prelazak od čvora do njegovog lijevog potomka odgovara 0 u kodu, a desnog djeteta odgovara 1. Ako označimo listove stabla simbolima biti kodiran, dobivamo binarnu reprezentaciju stabla prefiks koda.
Opišimo algoritam za konstruiranje Huffmanovog stabla i dobivanje Huffmanovih kodova.
  1. Znakovi ulazne abecede tvore listu slobodnih čvorova. Svaki list ima težinu koja je jednaka učestalosti pojavljivanja simbola
  2. Odabrana su dva slobodna čvora stabla s najmanjim težinama
  3. Njihov je roditelj stvoren s težinom jednakom njihovoj ukupnoj težini
  4. Roditelj se dodaje na popis slobodnih čvorova, a njegova dva djeteta se uklanjaju s ovog popisa
  5. Jednom luku koji napušta nadređeni luk dodijeljen je bit 1, drugom je dodijeljen bit 0
  6. Koraci počevši od drugog ponavljaju se sve dok na popisu slobodnih čvorova ne ostane samo jedan slobodni čvor. Ovo će se smatrati korijenom stabla.
Pomoću ovog algoritma možemo dobiti Huffmanove kodove za danu abecedu, uzimajući u obzir učestalost pojavljivanja znakova.
Aritmetičko kodiranje
Algoritmi aritmetičkog kodiranja kodiraju nizove elemenata u razlomak. U ovom slučaju uzima se u obzir frekvencijska distribucija 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. Podijelimo poluinterval. Ovi su koraci važni kako bi koder mogao učinkovito raditi u sljedećem koraku.

1.2. PrEP

Kao ključni korak algoritma kompresije, diskretna kosinusna transformacija (u daljnjem tekstu DCT) je vrsta Fourierove transformacije i, kao i potonja, ima inverznu transformaciju (DCCT). Ako sliku smatramo skupom prostornih valova, gdje osi X i Y odgovaraju širini i visini slike, a os Z prikazuje vrijednosti boja odgovarajućih piksela, tada se možemo pomaknuti od prostorne prikaz slike na svoj spektralni prikaz i natrag. DCT pretvara N x N matricu piksela u matricu frekvencijskih koeficijenata odgovarajuće veličine.



Riža. 4.

U rezultirajućoj matrici niskofrekventne komponente nalaze se bliže gornjem lijevom kutu, a visokofrekventne komponente pomaknute su dolje udesno. Zbog činjenice da se glavni dio grafičkih slika na zaslonu sastoji od niskofrekventnih informacija, pomoću dobivene matrice možete različito odbaciti najmanje važna informacija s minimalnim gubitkom vida. Stoga vam DCT omogućuje odabir informacija koje se mogu sigurno odbaciti bez unošenja ozbiljnih izobličenja u sliku. Teško je zamisliti kako bi se ovaj zadatak mogao izvršiti na izvornoj slici.

Iz formula (sl. 4) jasno je da izračunavanje jednog elementa rezultirajuće matrice zahtijeva 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 standardna veličina 8x8 i transformirajte svaki od njih. Korištenje većih blokova poboljšat će kvalitetu kompresije, ali ne unedogled, jer je vjerojatnost da su vrlo udaljene točke međusobno slične premala.

Važno je napomenuti da se tijekom izračuna koriste samo 32 unaprijed izračunate vrijednosti kosinusa, što vam omogućuje značajno povećanje brzine pretvorbe. To nedvojbeno dovodi do djelomičnog gubitka informacija, ali su njihove količine relativno beznačajne.

Lagano povećanje izvedbe može se postići ako se u izračunima koristi samo cjelobrojna aritmetika, koja je, međutim, relevantna samo za starije računala, budući da se u modernim računalima cijena operacija nad brojevima s pomičnim zarezom ne razlikuje od operacija nad cijelim brojevima. Također, korištenje cjelobrojne aritmetike negativno utječe na kvalitetu komprimirane slike, što ovu metodu čini neprihvatljivom za moderna računala. Budući da je DCT vrsta Fourierove transformacije, ovdje se mogu koristiti sve metode za povećanje učinkovitosti 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 izvornu sliku u oblik prikladan za naknadne operacije na njoj.

Zaokruživanje je proces smanjenja količine informacija potrebnih za pohranu DCT matrice, uz djelomičan gubitak toč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 izvorne matrice s MO. U ovom slučaju, niskofrekventne vrijednosti u DCT matrici odgovaraju manjim MO koeficijentima, što omogućuje zadržavanje značajnijih, niskofrekventnih informacija i odbacivanje manje važnih visokofrekventnih informacija. Zbog činjenice da su niskofrekventne komponente koncentrirane u lijevoj gornji kut DCT matrice, MO vrijednosti rastu s lijeva na desno i od vrha 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 rekonstruirane slike izravno ovise o odabranoj matrici zaokruživanja. JPEG standard omogućuje korištenje bilo kojeg MO-a, ali ISO je opsežnim eksperimentalnim testiranjem razvio skup matrica koje omogućuju postizanje optimalnih rezultata.

1.4. Kompresija

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

Prvi korak je zamijeniti vrijednost u gornjem lijevom kutu rezultirajuće matrice relativnom vrijednošću. Budući da su susjedni blokovi slike slični jedni drugima, kodiranje sljedećeg elementa (0,0) kroz razliku s prethodnim bit će učinkovitije. Drugi korak je izravna primjena algoritma kodiranja ponavljanja (LZW) na proces velika količina uzastopne nule. Eksperimentalno testiranje pokazalo je da se najbolji rezultati mogu postići ako se oko matrice kreće u cik-cak, kao što je prikazano na donjoj slici.

Riža. 5.

Konačno, u trećem i posljednjem koraku, rezultirajući rezultat se sažima poput normalnih podataka pomoću Huffmanovog algoritma ili aritmetičkog kodiranja, ovisno o implementaciji. Ova faza se naziva "entropijsko kodiranje" (u JPEG terminologiji).

1.5. Dekodiranje

Budući da je DCT Fourierova transformacija, postoji inverzna diskretna kosinusna transformacija (IDCT). Algoritam za dekodiranje ponavlja algoritam za kodiranje 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 učinkovitijih algoritama. Zbog razvoja tehnologije, JPEG standard postupno gubi na važnosti. Programeri JPEG2000 nadali su se stvoriti standard koji će ispraviti mnoge pogreške u postojećim standardima. Među njihovim zadacima bili su:

  • Eliminacija nije učinkovita kompresija u području niske frekvencije. Postojeći algoritmi dobro su obavili kompresiju područja srednje i visoke frekvencije, ali su pokazali loše rezultate u području niske frekvencije.
  • Kompresija s gubicima i bez gubitaka. U vrijeme razvoja nije postojao standard koji je dopuštao kompresiju s gubicima i bez gubitaka u jednom toku kompresije.
  • Obrada velike slike. Postojeći algoritmi nisu dopuštali učinkovitu kompresiju slika većih od 64Kx64K bez popločavanja.
  • Unificirana struktura algoritma kompresije. Trenutna implementacija JPEG-a podržavala je 44 modifikacije, od kojih je većina bila specifična za aplikaciju i nije ih podržavala većina 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 smetnje pri prijenosu slika nesigurnim kanalima ili mogućnosti vraćanja slike ako je oštećena kao posljedica prijenosa.
  • Računalno generirane slike. Izvorni algoritmi dobro su radili na digitalnim fotografijama i slikama dobivenim pomoću digitalnog fotoaparata ili skenera, ali nisu učinkovito obrađivali slike stvorene na računalu, na primjer, pomoću programa za uređivanje slika.
  • Složeni dokumenti. JPEG se vrlo loše pokazao pri obradi složenih 2D slika (osobito tekstualnih slika).

Sljedeći dijagram prikazuje osnovne korake kodera JPEG2000.


Riža. 6.


Riža. 7.

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

Riža. 8.

2.2. Vlaknaste ploče

JPEG2000 koristi Discrete Wavelet Transformation za dijeljenje slike na visokofrekventna i niskofrekventna područja. DWP obrađuje svaki redak i stupac izvorne slike pomoću frekvencijski filter.

Riža. 9.

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

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

Prema standardu, broj stupnjeva može biti od 0 do 32. Za redovnu sliku koristi se od 4 do 8 stupnjeva. U svakoj sljedećoj fazi obrađuje se samo niskofrekventna regija (LL), budući da visokofrekventna područja obično ne sadrže važne informacije.


Riža. 10.

Riža. jedanaest.

2.3. Zaokruživanje

Za zaokruživanje DWT koeficijenata koristi se konstantni kvantizator s mrtvom zonom. (Sl. 14) Za svaki fragment koristi se konstantna vrijednost koraka zaokruživanja za sve koeficijente tog 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 kvantizator je interval s rasponom od 2Δb oko nule, daje veći broj nula na izlazu.

2.4. Kodiranje

Kodiranje dobivenih zaokruženih koeficijenata izvodi 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. Podjela na blokove provodi se kako bi se implementirala fleksibilnija organizacija komprimiranih informacija radi povećanja otpornosti na buku i tako dalje.


Riža. 16.

U JPEG2000, svaki blok je zasebno kodiran. Algoritam kodiranja prelazi matricu koeficijenata zaokruživanja svakog bloka u prugama, kao što je prikazano na slici 17. Blokovi su podijeljeni u blokove s nominalnom visinom od 4. Trake se zatim skeniraju od vrha prema dolje, a stupci u svakoj traci su prelazio slijeva na desno.


Riža. 17.

Tijekom procesa kodiranja, koeficijenti u bloku virtualno su predstavljeni kao bitne ravnine. Jedna od tih ravnina sastavljena je od predznaka koeficijenata; preostale ravnine odgovaraju različitim znamenkama vrijednosti koeficijenta (položaj bita u ravnini odgovara položaju koeficijenta u bloku). Kodiranje se provodi u ravnini: prvo se kodira ravnina koja odgovara najznačajnijoj znamenki koeficijenata, zatim sljedeća u silaznom redoslijedu, itd. Može se dogoditi da N bitnih ravnina s najvišim prioritetom (NPB ravnina) ne sadrži one. U ovom slučaju, prva ravnina po redu koja sadrži barem jednu jedinicu postaje NPB ravnina. Prazne ravnine koje mu prethode izostavljaju se tijekom kodiranja, a informacija o njihovom broju unosi se u zaglavlje bloka.

Aritmetičko kodiranje temelji se na kontekstualno osjetljivom modelu. Kontekst se formira kao funkcija vrijednosti bitova koji okružuju bit koji se kodira. Svaka bitna ravnina, osim NBP, obično se kodira u tri prolaza. Tijekom prvog prolaza koda, širi se informacija o značaju koeficijenata. Tijekom kodiranja, svakom koeficijentu u kodiranom bloku dodjeljuje se parametar značajnosti. Koeficijent se naziva značajnim ako u bitnim ravninama koje su u tom trenutku već kodirane, postoji barem jedan bit ovog koeficijenta koji nije nula.

Za svaki bit ravnine, ako odgovarajući koeficijent još nije značajan, a ako je barem jedan susjedni koeficijent već značajan, kodira se činjenica značajnosti za trenutni koeficijent, odnosno vrijednost ovog bita trenutno kodiranog ravnina je zapravo kodirana. Ako se kodirani bit pokaže kao različit od nule, odmah nakon njegove obrade, kodira se odgovarajući bit bitne ravnine predznaka koeficijenata (kodiranje predznaka).

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

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

Bitan detalj koji nudi standard je mogućnost preskakanja prolaza koda, što je još jedan izvor povećanja učinkovitosti zbog gubitka informacija (prvi, najočitiji izvor je kvantizacija). Ova se značajka 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. Ta je mogućnost osigurana, prvo, dijeljenjem izvorne slike na područja (pločice) koja se ne preklapaju, a koja su kodirana 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đenom njegovom (pločicom) području. Slojevi su pak podijeljeni u takozvane pakete koji sadrže kod blokova koeficijenata za različite razine raspad. Kako bi se dekodirao bilo koji područje slike, dovoljno je odrediti kojim pločicama pripada i koji slojevi vezani uz te pločice sadrže šifru blokova koeficijenata nužnih za vraćanje tražene površine.



Riža. 20.

Naravno, "prikladan" prikaz slike možda neće biti od koristi u smislu učinkovitosti kompresije. Doista, sa smanjenjem veličine strukturnih elemenata (pločice, površine pločica koje tvore slojeve itd.), učinkovitost kompresije se donekle smanjuje. Standard nam u ovom slučaju ostavlja izbor: s jedne strane, imamo priliku dobiti prikaze informacija koje nam omogućuju brzo izdvajanje i uređivanje dijelova slike, s druge strane, standard ne sprječava stvaranje prikazi informacija koji su učinkoviti u volumenu.

Kako bi se osigurala otpornost na buku i lakši pristup informacijama, standard JPEG2000 nudi sustav markera i segmenata markera. Segmenti markera sadrže parametre dijelova 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ćuje djelomičnu restauraciju slike čiji je prikaz oštećen. Uvođenje elemenata otpornosti na smetnje daje zeleno svjetlo za korištenje standarda u svim vrstama telekomunikacijskih aplikacija.

Postizanje visoke kvalitete kompresije bio je, naravno, jedan od glavnih zadataka pri stvaranju standarda, i tu su programeri napravili jasan napredak. JPEG2000 standard je otprilike 2 puta učinkovitiji od JPEG standarda kada je komprimiran s gubitkom i za 5-20% kada je kompriman bez gubitka. Naravno, učinkovitost kompresije bez gubitaka u ovom slučaju nije tako visoka kao, recimo, JPEG-LS standard, ali je sasvim prihvatljiva. Što se tiče učinkovitosti kompresije s gubitkom, ovdje standard omogućuje dobivanje rezultata koji su blizu najboljih rezultata za ovu vrstu metoda danas.

3.JPEG-LS

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

Važno je razumjeti da JPEG-LS format:

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

3.1. Uvod u osnovne pojmove i principe rada

Sažimanje podataka bez gubitaka sastoji se od dva odvojena neovisna dijela: modeliranja i kodiranja. Definirajmo neke pojmove koje ćemo aktivno koristiti u budućnosti:

Encoder je “odgovoran” za proces kodiranja, i to: prima kao ulaz izvornu sliku u digitalnom formatu i sve potrebne parametre definirane standardom, te posebnim skupom postupaka kreira skup podataka koji sadrži komprimiranu sliku. Dekoder “odgovara” za proces dekodiranja i pretvaranja fragmenata, naime: prima podatke s komprimiranom slikom i svim potrebnim parametrima kao ulaz, daje rekonstruiranu sliku

JPEG-LS dekoder malo se razlikuje od kodera, tako da se ovaj algoritam kompresije može nazvati gotovo simetričnim. Ovdje je pojednostavljeni dijagram koji prikazuje principe kodiranja:



Riža. 21.

Neke informacije o originalna slika: kao što je prikazano na donjem dijagramu (Sl. 22), izvorna slika može se sastojati od Nf komponenti. Svaka komponenta Ci sadrži dvodimenzionalni niz piksela (uzoraka) od x i stupaca i y i redaka. Veličine komponenti ovise o dva parametra: X i Y, gdje je X maksimum među vrijednostima x i, a Y je maksimum među vrijednostima y i svih komponenti. (U standardu JPEG-LS cijelo je poglavlje posvećeno razlikama u radu s višekomponentnim slikama u usporedbi s jednokomponentnim slikama, ali u ovom ćemo se članku usredotočiti samo na rad s jednokomponentnim slikama).



Riža. 22.

Slika prikazuje orijentaciju svake komponente: gore, dolje, lijevo i desno. Redoslijed kojim se pikseli podvrgavaju postupcima kodiranja određen je na sljedeći način: slijeva nadesno (slijeva nadesno) i odozgo prema dolje (odozgo prema dolje) po komponenti.

Kontekstni pikseli a, b, c, d koriste se za predviđanje trenutnog piksela x. Ovisno o kontekstu, koder odabire način rada: serijski (način rada) ili redovni način rada. Serijska moda odabire se ako je vjerojatno da se y i z podudaraju, redovito- inače. Napravimo ovdje napomenu vezanu uz prisutnost opcije "gotovo bez gubitaka": Kada je ova opcija omogućena, serijski način će biti odabran ako su y i z gotovo identični prema parametru NEAR tolerancije.

U slučaju korištenja serijske mode, počinjemo pregledavati trenutna linija od piksela x i pronađite najveću duljinu niza piksela koji se podudara s kontekstualnim pikselom a. Dakle, unutar tekuće linije dobivamo niz identičnih piksela koji se po vrijednosti podudaraju s poznatim pikselom a. Ostaje samo kodirati duljinu serije. (Ovo se radi korištenjem niza J od 32 elementa.) Možda ste već pogodili da se s uključenom opcijom "gotovo bez gubitaka" odabire niz piksela blizu a pomoću parametra NEAR.

Sada pogledajmo naše postupke u slučaju korištenja uobičajenog načina rada. Vrijednosti piksela a, b i c koriste se za izračunavanje predviđanja piksela x (Px). Zatim se izračunava takozvana greška prognoze (Errval). Njegova vrijednost jednaka je razlici između vrijednosti x i Px. Errval se prilagođava nekim terminom koji ovisi o kontekstu i zatim se kodira pomoću Golombovih kodova. Golombov kod ovisi o a, b, c, d i Errval istih piksela, koji su pohranjeni u posebnim nizovima A i N. Kada je omogućena opcija "gotovo bez gubitaka", pogreška predviđanja se dodatno kvantizira prije kodiranja.


Riža. 23.

3.2. Koder

JPEG-LS se uglavnom koristi kao metoda kompresije podataka bez gubitaka, stoga je obnovljena slikovna datoteka obično identična izvornoj datoteci. Na način gotovo bez gubitaka, izvorna slika i rekonstruirana slika mogu se razlikovati. Rekonstruirani piksel označit ćemo s Rp, a originalni piksel s p.

U fazi inicijalizacije, koder izvodi sljedeće operacije:

  • Parametri se izračunavaju RANGE = floor((MAXVAL + 2 * NEAR) / (2 * NEAR + 1)) + 1, qbpp = ceil(log RANGE), bpp = max(2, ceil(log(MAXVAL + 1)) ), OGRANIČENJE = 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 akumuliranje vrijednosti pogreške predviđanja, B - za izračunavanje sustavnog 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.

Predstavimo neke funkcije i varijable koje ćemo kasnije koristiti:

Funkcija GetNextSample(): 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 retka, tada GetNextSample() postavlja EOLine = 1 . U svim drugim slučajevima, EOLine = 0. Vrijednosti Ra, Rb, Rc, Rd nasljeđuju svoje vrijednosti iz prethodno izračunate Rx vrijednosti. Globalna varijabla EOLine: postavljena funkcijom GetNextSample(): jednako 1 ako je trenutni piksel posljednji u retku, jednako 0 u suprotnom. AppendToBitStream(a,b) Funkcija: Dodaje nenegativan broj u binarnom obliku kodiranom nizu bitova pomoću b bitova. Prvo se dodaju najvažniji bitovi. Funkcija Quantize(a): Koristi se za kvantiziranje pogreške predviđanja u načinu rada "gotovo bez gubitaka". Funkcija ComputeRx(): Vraća rekonstruiranu Rx vrijednost za trenutni piksel (koristi kvantiziranu "pogrešku predviđanja").

Iz gornje slike (Sl. 23) jasno je da pikseli a, b, c i d igraju značajnu ulogu u kodiranju piksela x. Pokušajmo otkriti što se događa kada ti pikseli nedostaju. Dakle, prilikom kodiranja gornjeg retka nedostaju pikseli konteksta 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 rekonstruiranu Rb vrijednost piksela b (ili nulu za gornji red), a c koristi rekonstruiranu vrijednost a kada kodira prvi znak prethodnog retka. 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 izračunava se pomoću takozvanog "prediktora za otkrivanje rubova":

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

Objasnimo bit "pravila ruba". Da biste to učinili, razmotrite slučaj b< а. При этом условии «правило края» выбирает b в качестве прогноза х во многих случаях, когда вертикальный край изображения находится непосредственно слева от х. Аналогично, пиксель а выбирается в качестве прогноза х во многих случаях, когда горизонтальный край находится непосредственно над х. Если край не обнаруживается, то «правило края» вычисляет прогноз в виде а + b - с, что имеет простую геометрическую интерпретацию. Если каждый пиксель является точкой трехмерного пространства, то прогноз а + b - с помещает Рх на ту же плоскость, что и точки а, b и с.

Sljedeći korak je korekcija predviđanja iz pristranosti pomoću broja SIGN (ovisno o tri broja zone Qi), vrijednosti korekcije C(Q) (izvedene iz sustavnih pristranosti i ovdje se ne raspravlja) i parametra MAXVAL.

ako (ZNAK == +1)
Px = Px + C(Q);
drugo
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 pogrešku predviđanja Errval kao razliku x - Px, ali mijenja predznak ako je vrijednost SIGN negativna.

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

ako (Errval > 0)
Errval = (Errval + BLIZU) / (2 * BLIZU + 1);
drugo
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 * NEAR + 1) .

Pogreška prognoze (nakon moguće kvantizacije) prolazi modulo redukciju. (Nakon toga, spreman je za glavni korak kodiranja).

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

Golombovi kodovi (glavni parametar je označen s b). U JPEG-LS ovaj parametar je označen kao m. Ako je broj m već odabran, tada se Golombov kod nenegativnog cijelog broja n sastoji od dva dijela: unarnog koda cijelog dijela broja n/m i binarni prikaz n mod m. Ovaj kod je idealan za cijele brojeve koji imaju geometrijsku distribuciju (to jest, kada je vjerojatnost broja n (1 - r) * r n , 0< r < 1) . Для каждого геометрического распределения найдется такое число m, что код Голомба, построенный по m, имеет наименьшую возможную среднюю длину. Najjednostavniji slučaj, kada je m potencija broja 2 (m = 2 k), vodi do jednostavnih operacija kodiranja/dekodiranja. Kod broja n u ovom slučaju sastoji se od k nižih znamenki broja n, kojima prethodi unarni kod broja sastavljen od preostalih viših znamenki broja n. Ovaj posebni Golombov kod označen je s G(k) .

Na primjer, izračunajmo G(2) kod broja n = 19 = 10011 2 . Kako je k = 2, tada je m = 4. Počnimo s dvije najmanje značajne znamenke, 11 2, broja n. One su jednake 3, što je isto kao n mod m (3 = 19 mod 4). Preostale najznačajnije znamenke, 100 2, dat će broj 4, koji je jednak cjelobrojnom dijelu 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 s I. Najveća duljina G(0) je I + 1, a kako I može biti velik, poželjno je ograničiti veličinu Golombovog koda. To se radi pomoću posebnog Golombovog koda LG(k, glimit) koji ovisi o dva parametra k i glimit. Prvo morate oblikovati broj q od najznačajnijih znamenki 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) бит.

Pogreške u predviđanju nisu nužno pozitivni brojevi. One su jednake nekim razlikama, koje mogu biti nula ili negativne. Međutim, Golombovi kodovi su izgrađeni za pozitivni brojevi. Stoga, prije kodiranja, negativne vrijednosti pogreške trebaju se odražavati u skupu nenegativnih brojeva. Da biste to učinili, upotrijebite sljedeće mapiranje:
MErrval =
2 * Errval ako je Errval >= 0,
2 * |Errval| ako Errval< 0.

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

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

Tablica: pogreške predviđanja, prikazi i LG kodovi (2, 32)

Pogreška prognoze Prikazana vrijednost Kodirati
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 trebamo raspravljati o izboru parametra k za Golombove kodove. To se radi adaptivno. Parametar k ovisi o kontekstu i njegova se vrijednost ažurira svaki put kada se pronađe piksel s tim kontekstom. Izračun k može se izraziti jednostavnim retkom:
za (k=0; (N[Q]<gdje su A i N nizovi indeksa od 0 do 364. Ova formula koristi kontekst Q kao indeks dvaju nizova. Na početku se k inicijalizira na nulu, a zatim se izvodi petlja. U svakoj iteraciji petlje, element niza N[Q] pomaknut je ulijevo za k bitova i uspoređen s A[Q]. Ako je pomaknuta vrijednost N[Q] veća ili jednaka A[Q], tada se odabire trenutna vrijednost k. Inače, k se povećava za 1 i test se ponavlja.

Nakon pronalaska broja k, pogreška predviđanja Errval pretvara se u broj MErrval, koji se kodira pomoću koda LG(k, LIMIT). LIMIT broj je parametar. Ažuriranje polja A i N (zajedno s pomoćnim poljem B) ilustrirano je sljedećim fragmentom koda (parametar RESET postavlja aplikacija):

B[Q] = B[Q] + Errval * (2 * BLIZU + 1);
A[Q] = A[Q] + abs(Errval);
if (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 sustavnog odstupanja prognoze. Vrijednost C[Q] za ispravljanje predviđanja mora se ažurirati na kraju kodiranja piksela x. Ovo zahtijeva dvije varijable - B[Q] i N[Q]. N[Q] je broj pojavljivanja konteksta Q od inicijalizacije. B[Q] je sustavno odstupanje koje dopušta da se vrijednost C[Q] ažurira najviše jednom po iteraciji. Dakle, prediktorska vrijednost C[Q] izračunava se 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 je (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 odnosno 127.

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

  1. u praćenju niza i kodiranju njegove duljine;
  2. u kodiranju piksela koji je prekinuo niz.

Serije se mogu pratiti na sljedeći način:

RUNval = Ra;
RUNcnt = 0;
dok (abs(Ix - RUNval)<= NEAR) {
RUNcnt = RUNcnt + 1;
Rx = RUNval;
ako (EOLine == 1)
pauza;
drugo
GetNextSample();
}

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

Opišimo proces kodiranja serije. Prvi fragment koda opisuje kodiranje za segmente izvođenja duljine rm:

dok (RUNcnt >= (1<DodajToku Bitova(1, 1);
RUNcnt = RUNcnt - (1<ako (RUNindex< 31))
RUNindex = RUNindex + 1;
}

Sljedeći kod ilustrira kodiranje za segmente izvođenja duljine manje od rm:

if (EOLine == 0) (
DodajToku Bitova(0, 1);
DodavanjeBitStream(RUNcnt, J);
ako (RUNindex > 0)) (
RUNindex = RUNindex - 1;
}
else if (RUNcnt > 0)
DodajToku Bitova(1, 1);

Ovdje koder koristi tablicu J, koja se sastoji od 32 unosa, označenih s rk. J se inicijalizira s 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 kodnim redom. 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. koder izvodi postupak opisan za pronalaženje duljine izvođenja, koja je pohranjena u varijabli RUNlen. Ova se varijabla zatim kodira dijeljenjem na članove č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. Kodiran je pomoću 5 bita. Snimanje se izvodi pomoću instrukcije AppendToBitStream(l,l). Svaki put kada se napiše 1, odgovarajuća rm vrijednost se oduzima od RUNlen. Ako je RUNlen na početku bio jednak 6, tada se sukcesivno smanjuje na 5, 4, 3, 2 i 0.

Može se dogoditi da duljina niza RUNlen nije jednaka cjelobrojnom zbroju brojeva rm. Na primjer, RUNlen = 7 . U ovom slučaju, pet bitova od 1 zapisano je kao kod, nakon čega slijedi bit prefiksa i ostatak od RUNlen (u našem primjeru je 1), koji se zapisuje u datoteku kao broj rk bitova (trenutna vrijednost rk u našem primjeru je 2). Ova zadnja operacija izvodi se pozivanjem procedure AppendToBitStream(RUNcnt, J). Bit prefiksa je 0 ako je niz prekinut drugim pikselom u liniji. Ako niz ide do kraja retka, bit prefiksa je 1.

Drugi glavni zadatak kodera, a to je kodiranje burst piksela, obavlja se na sličan način kao kodiranje trenutnog piksela. Razgovarajmo o detaljima njegove provedbe.

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

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

Gornji isječak koda definira RItype indeks i pogrešku predviđanja za piksel x. Zatim, ako je potrebno, promijenite predznak Errval, a za opciju "gotovo bez gubitaka" također kvantizirajte pogrešku predviđanja:

if ((RItype == 0) && (Ra > Rb)) (
Errval = -Errval;
ZNAK = -1;
drugo
ZNAK = 1;
ako (BLIZU > 0) (
Errval = Kvantiziraj(Errval);
Rx = ComputeRx();
}
drugo
Rx = Ix;
Errval = ModRange(Errval, RANGE);

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

ako (RItype == 0)
TEMP = A;
drugo
TEMP = A + (N>>1);

Postavimo Q = RItype + 365. Izračunat ćemo parametar k za Golombove kodove 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);
if (N[Q] == RESET) (
A[Q] = A[Q]>>1;
N[Q] = N[Q]>>1;
Nn[Q] = Nn[Q]>>1;
}
N[Q] = N[Q] + 1;

Ovim je završen opis JPEG-LS kodera. Imajte na umu da je sigurno nepotpun, ali nismo si postavili cilj kopirati standard ove metode. Svi izostavljeni detalji mogu se pronaći u standardu. Sada prijeđimo na kratki 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 izmjenama - ove informacije se mogu pročitati u standardu. Zadržimo se samo na tome kako se dekodiranje odvija u serijskom načinu. Nakon što su izračunate sve vrijednosti za trenutni piksel, pročitajte novi bit R iz toka bitova. Ako je jednak 1, tada:

  1. Slika je dopunjena s 2 J|RUNindex| piksela s Ra vrijednošću.
  2. Ako je u prethodnom koraku slika već dopunjena s 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 nadopunjuje pikselima s 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čun svih potrebnih veličina počinje ponovno.

3.4. Format datoteke

Komprimirana datoteka sastoji se od:

  • iz segmenata podataka koji sadrže Golombove kodove i duljine serija;
  • iz segmenata markera (informacije potrebne za dekoder);
  • iz segmenta markera "ostatak" (neki rezervirani JPEG markeri).

Ovdje marker nazivamo bajtom jedinica, iza kojeg slijedi poseban kod koji signalizira početak novog segmenta. Ako token slijedi bajt čiji je najvažniji bit 1, tada je taj bajt početak segmenta tokena. U suprotnom, počinje podatkovni segment.

3.5. Golombovi kodovi

Već smo više puta spominjali Golombove kodove. Što je? Golombov kod nenegativnog cijelog broja "može biti učinkovit Huffmanov kod." Ovisi o izboru nekog parametra b. Princip kodiranja je sljedeći:

  • izračunavaju se dvije količine
    q = kat((n - 1) / b) i
    r = n-qb-1;
  • kod se sastoji od 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 dajemo matematičko opravdanje za korištenje Golombovih kodova u JPEG-LS, samo napominjemo da ako se ulazni tok podataka sastoji od cijelih brojeva, a vjerojatnost 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 kvalitete. Kao što je već spomenuto, kao osnova je uzet LOCO-I format, razvijen unutar HP Labsa. Zatim je dalje razvijen kroz zajedničke napore HP-a i Mitsubishija. Obje tvrtke dopustile su korištenje svojih patenata na ovaj format bez plaćanja licence, tako da se JPEG-LS može naći i u regularnim PC programima.

Dopustite mi da objasnim na vlastitom primjeru. Možda mi možete pomoći da shvatim neke stvari. Zadatak koji sam sebi postavio je sljedeći. Prijenos okvira (komandom) s WEB kamere u memoriju mobitela s naknadnim prijenosom na drugi mobitel. Iz vašeg članka nije jasno na kojem bi se formatu trebala temeljiti dostupnost algoritma. Dalje - kosinusna transformacija - samo površna interpretacija, a gdje mogu pogledati detaljan algoritam s konkretnim primjerom (recimo, proučavati matematičku analizu, ali ni tu gotovo da nema konkretnih primjera, a ako ih ima, onda cijele dijelove izračuni su propušteni. Možda postoji poseban priručnik, pa pogledajte. Struktura organizacije datoteka potpuno je izbačena, a poveznice nisu čak ni naznačene: "U rezultirajućoj matrici niskofrekventne komponente nalaze se bliže gornjem lijevom kutu , a visokofrekventne su pomaknute dolje udesno”, čini mi se da se to tako radi, ali ne ide (možda se varam!).

Pitanje: kako snimiti, na primjer, samo potrebne informacije iz JPG okvira za daljnje dekodiranje u razlučivosti zaslona telefona, bez korištenja osobnog računala, pomoću MK. Dovoljna je crno-bijela verzija okvira. Na koji FFxx treba obratiti pozornost i bilježiti samo te podatke. Gdje mogu nabaviti strukturu okvira WEB kamere? Shvaćam da je problem složen i višestruk. Na primjer, na MK-u je nemoguće dešifrirati okvir i zatim ga komprimirati s potrebnom rezolucijom, ali vjerojatno je moguće izrezati barem gornji kut s potrebnim formatom.

Bio bih zahvalan na informaciji.

Što mogu = programirati u VB, MK. Samostalni operativni interaktivni razvoj upravljanja putem mobitela s nekoliko releja, audio upravljanje putem mobitela.

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

možda RLE?

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

Najbolji članci na temu