Miten JPEG-muoto toimii

JPEG-kuvat ovat kaikkialla digitaalisessa elämässämme, mutta tämän tietoisuuden taustalla on algoritmeja, jotka poistavat yksityiskohdat, joita ihmissilmä ei havaitse. Tuloksena on paras visuaalinen laatu pienimmässä tiedostokoossa – mutta miten se tarkalleen ottaen toimii? Katsotaan mitä silmämme eivät tarkalleen näe!

Miten JPEG-muoto toimii

Mahdollisuutta lähettää valokuva ystävälle on helppo pitää itsestäänselvyytenä ja olla välittämättä siitä, mitä laitetta, selainta tai käyttöjärjestelmää he käyttävät - mutta näin ei aina ollut. 1980-luvun alussa tietokoneet pystyivät tallentamaan ja näyttämään digitaalisia kuvia, mutta parhaasta tavasta oli olemassa monia kilpailevia ideoita. Et voinut vain lähettää kuvaa tietokoneelta toiselle ja toivoa, että se toimisi.

Tämän ongelman ratkaisemiseksi koottiin vuonna 1986 asiantuntijakomitea ympäri maailmaa nimellä "Yhteinen valokuvausasiantuntijaryhmä” (Joint Photography Experts Group, JPEG), perustettiin osana Genevessä (Sveitsissä) päämajaansa pitävän kansainvälisen standardointijärjestön Kansainvälisen standardointijärjestön (ISO) ja Kansainvälisen sähköteknisen komission (IEC) yhteistä työtä.

JPEG-niminen ihmisryhmä loi digitaalisen JPEG-kuvanpakkausstandardin vuonna 1992. Jokainen Internetiä käyttänyt on todennäköisesti törmännyt JPEG-koodattuihin kuviin. Tämä on yleisin tapa koodata, lähettää ja tallentaa kuvia. Web-sivuilta sähköpostiin ja sosiaaliseen mediaan JPEG-muotoa käytetään miljardeja kertoja päivässä – melkein joka kerta, kun katsomme tai lähetämme kuvan verkossa. Ilman JPEG-kuvia verkko olisi vähemmän kirkas, hitaampi ja siinä olisi todennäköisesti vähemmän kissakuvia!

Tämä artikkeli käsittelee JPEG-kuvan purkamista. Toisin sanoen siitä, mitä tarvitaan, jotta tietokoneelle tallennetut pakatut tiedot muunnetaan kuvaruudulle ilmestyväksi kuvaksi. Tämä on syytä tietää, ei vain siksi, että se on tärkeää päivittäin käyttämämme teknologian ymmärtämiseksi, vaan myös siksi, että paljastamalla puristustasot tunnemme paremmin havainnon ja näön sekä sen, mitä yksityiskohtia silmämme ovat eniten. herkkä.

Sitä paitsi kuvilla on erittäin mielenkiintoista leikkiä tällä tavalla.

Miten JPEG-muoto toimii

JPEG:n sisään katsominen

Tietokoneessa kaikki tallennetaan binäärilukujen sarjana. Yleensä nämä bitit, nollat ​​ja ykköset, ryhmitellään kahdeksaan, jolloin ne muodostavat tavuja. Kun avaat JPEG-kuvan tietokoneellasi, jonkin (selain, käyttöjärjestelmä, mikä tahansa) on purettava tavut ja palautettava alkuperäinen kuva näytettäväksi väriluetteloksi.

Jos lataat tämän söpön valokuva kissasta ja avaa se tekstieditorissa, näet joukon sekavia merkkejä.

Miten JPEG-muoto toimii
Tässä käytän Notepad++:aa tiedoston sisällön tarkastamiseen, koska yleiset tekstieditorit, kuten Windowsin Notepad, sotkevat binaarin tallennuksen jälkeen, eikä se sovi JPEG-muotoon.

Kuvan avaaminen tekstieditorilla hämmentää tietokonettasi, aivan kuten hämmennät aivosi, kun hieroat silmiäsi ja alat nähdä värillisiä pisteitä!

Nämä näkemäsi paikat tunnetaan nimellä fosfeenit, eivätkä ne ole seurausta altistumisesta valoärsykkeelle tai mielen synnyttämille hallusinaatioille. Ne syntyvät, koska aivosi ajattelevat, että optisten hermojen sähköiset signaalit kuljettavat tietoa valosta. Aivojen on tehtävä tällaisia ​​oletuksia, koska ei ole mahdollista tietää, onko signaali ääni, visio vai jotain muuta. Kaikki kehon hermot välittävät täsmälleen samoja sähköimpulsseja. Kun painat silmiäsi, lähetät signaaleja, jotka eivät ole visuaalisia, vaan aktivoivat silmän reseptoreita, jotka aivosi tulkitsevat - tässä tapauksessa väärin - visuaaliseksi. Voit kirjaimellisesti nähdä paineen!

On hassua ajatella, kuinka samanlaisia ​​tietokoneet ovat aivojen kanssa, mutta se on myös hyödyllinen analogia, joka havainnollistaa, kuinka paljon tiedon merkitys – joko hermojen kautta kehon läpi vai tietokoneeseen tallennettuina – riippuu siitä, miten se tulkitaan. Kaikki binääridata koostuu XNUMX:sta ja XNUMX:stä, peruskomponenteista, jotka pystyvät välittämään kaikenlaista tietoa. Tietokoneesi arvaa usein kuinka tulkita ne käyttämällä vihjeitä, kuten tiedostotunnisteita. Nyt saamme sen tulkitsemaan ne tekstiksi, koska sitä tekstieditori odottaa.

Ymmärtääksemme, kuinka JPEG-tiedosto puretaan, meidän on nähtävä itse alkuperäiset signaalit - binääridata. Tämä voidaan tehdä hex-editorilla tai suoraan alkuperäisen artikkelin verkkosivu! Siellä on kuva, jonka vieressä tekstikentässä sen kaikki tavut (paitsi otsikko) esitetään desimaalimuodossa. Voit muuttaa niitä ja käsikirjoitus koodaa uudelleen ja tuottaa uuden kuvan lennossa.

Miten JPEG-muoto toimii

Voit oppia paljon pelaamalla tämän editorin kanssa. Voitko esimerkiksi kertoa, missä järjestyksessä pikselit tallennetaan?

Outoa tässä esimerkissä on se, että joidenkin numeroiden muuttaminen ei vaikuta kuvaan ollenkaan, mutta esimerkiksi jos korvaat numeron 17 ensimmäisellä rivillä 0:lla, kuva pilaantuu täysin!

Miten JPEG-muoto toimii

Muut muutokset, kuten rivin 7 muuttaminen rivillä 1988 254:ksi, muuttavat väriä, mutta vain seuraavat pikselit.

Miten JPEG-muoto toimii

Ehkä oudoin asia on, että jotkut numerot eivät muuta vain kuvan väriä, vaan myös muotoa. Muuta rivillä 70 oleva 12 arvoksi 2 ja katso kuvan yläriviä nähdäksesi mitä tarkoitan.

Miten JPEG-muoto toimii

Ja riippumatta siitä, mitä JPEG-kuvaa käytät, löydät aina nuo salaperäiset shakkikuviot, kun muokkaat tavuja.

Editorilla leikkiessä on vaikea keksiä, kuinka näistä tavuista luodaan valokuva uudelleen, koska JPEG-pakkaus koostuu kolmesta eri tekniikasta, joita sovelletaan peräkkäin tasoilla. Tutkimme jokaista niistä erikseen paljastaaksemme havaitsemamme salaperäisen käyttäytymisen.

Kolme JPEG-pakkaustasoa:

  1. Värien alinäytteenotto.
  2. Diskreetti kosinimuunnos ja diskretisointi.
  3. Run pituus koodaus, delta и Huffman

Jotta saat käsityksen pakkauksen laajuudesta, huomaa, että yllä oleva kuva edustaa 79 819 numeroa, mikä on noin 79 kt. Jos tallentaisimme sen ilman pakkausta, tarvitsemme kolme numeroa jokaista pikseliä kohden - punaiselle, vihreälle ja siniselle komponentille. Tämä olisi 917 700 numeroa tai noin. 917 kb. JPEG-pakkauksen seurauksena lopullinen tiedosto on pienentynyt yli 10 kertaa!

Itse asiassa tämä kuva voidaan pakata paljon enemmän. Alla on kaksi kuvaa vierekkäin - oikealla oleva kuva on pakattu 16 kt:n kokoon, eli 57 kertaa pienempi kuin pakkaamaton versio!

Miten JPEG-muoto toimii

Jos katsot tarkasti, huomaat, että nämä kuvat eivät ole identtisiä. Molemmat ovat kuvia JPEG-pakkauksella, mutta oikealla on paljon pienempi tilavuus. Se näyttää myös hieman huonommalta (katso taustavärin neliöitä). Siksi JPEG:tä kutsutaan myös häviöiseksi pakkaukseksi; pakkausprosessin aikana kuva muuttuu ja menettää joitakin yksityiskohtia.

1. Värien alinäytteenotto

Tässä on kuva, jossa on käytössä vain ensimmäinen pakkaustaso.

Miten JPEG-muoto toimii
(Interaktiivinen versio sisään alkuperäinen artikkelit). Yhden numeron poistaminen tuhoaa kaikki värit. Kuitenkin, jos tarkalleen kuusi numeroa poistetaan, sillä ei ole juurikaan vaikutusta kuvaan.

Nyt numerot on hieman helpompi tulkita. Tämä on melkein yksinkertainen lista väreistä, jokainen tavu vaihtuu tasan yhden pikselin, mutta se on jo puolet pakkaamattoman kuvan koosta (joka vaatisi noin 300 KB näin pienennetyssä koossa). Arvaa miksi?

Näet, että nämä luvut eivät edusta standardi punaista, vihreää ja sinistä komponenttia, koska jos korvaamme kaikki luvut nollilla, saamme vihreän kuvan (ei valkoista).

Miten JPEG-muoto toimii

Tämä johtuu siitä, että nämä tavut tarkoittavat Y:tä (kirkkaus),

Miten JPEG-muoto toimii

Cb (suhteellinen sininen),

Miten JPEG-muoto toimii

and Cr (suhteellinen punoitus) kuvat.

Miten JPEG-muoto toimii

Mikset käytä RGB:tä? Loppujen lopuksi useimmat nykyaikaiset näytöt toimivat tällä tavalla. Näyttösi voi näyttää minkä tahansa värin, mukaan lukien punaisen, vihreän ja sinisen, eri intensiteetillä jokaista pikseliä kohden. Valkoinen saadaan kytkemällä kaikki kolme päälle täydellä kirkkaudella, ja musta sammuttaa ne.

Miten JPEG-muoto toimii

Se on myös hyvin samanlainen kuin ihmisen silmän toiminta. Silmien värireseptoreita kutsutaan "kartioita“, ja ne on jaettu kolmeen tyyppiin, joista jokainen on herkempi joko punaiselle, vihreälle tai siniselle [S-tyypin kartiot ovat herkkiä violetin-sinisenä (S englanniksi. Lyhyt - lyhytaallonpituusspektri), M-tyyppi - vihreä-keltainen (M englannista. Medium - keskiaalto), ja L-tyyppi - kelta-punaisissa (L englanniksi. Long - pitkäaaltoisissa) spektrin osissa. Näiden kolmen tyyppisten kartioiden (ja sauvojen, jotka ovat herkkiä spektrin smaragdinvihreässä osassa) läsnäolo antaa ihmiselle värinäön. / n. käännös.]. tikkuja, toinen silmiemme fotoreseptorityyppi, pystyy havaitsemaan kirkkauden muutokset, mutta on paljon herkempi väreille. Silmissämme on noin 120 miljoonaa sauvaa ja vain 6 miljoonaa kartiota.

Siksi silmämme huomaavat kirkkauden muutokset paljon paremmin kuin värimuutokset. Jos erotat värin kirkkaudesta, voit poistaa vähän väriä, eikä kukaan huomaa mitään. Kroma-alinäytteenotto on prosessi, jossa kuvan värikomponentit esitetään pienemmällä resoluutiolla kuin luminanssikomponentit. Yllä olevassa esimerkissä jokaisessa pikselissä on täsmälleen yksi Y-komponentti ja jokaisessa yksittäisessä neljän pikselin ryhmässä on täsmälleen yksi Cb- ja yksi Cr-komponentti. Siksi kuva sisältää neljä kertaa vähemmän väritietoa kuin alkuperäinen.

YCbCr-väriavaruutta ei käytetä vain JPEG-kuvissa. Se keksittiin alun perin vuonna 1938 televisiolähetyksiä varten. Kaikilla ei ole väritelevisiota, joten värien ja kirkkauden erottaminen antoi kaikille mahdollisuuden saada sama signaali, ja televisiot, joissa ei ollut väriä, käyttivät vain kirkkauskomponenttia.

Siksi yhden numeron poistaminen editorista tuhoaa kaikki värit kokonaan. Komponentit tallennetaan muodossa YYYY Cb Cr (itse asiassa, ei välttämättä tässä järjestyksessä - tallennusjärjestys määritellään tiedoston otsikossa). Ensimmäisen numeron poistaminen saa aikaan Cb:n ensimmäisen arvon Y, Cr:n Cb:n ja yleensä saat dominoefektin, joka vaihtaa kuvan kaikki värit.

JPEG-määritys ei edellytä YCbCr:n käyttöä. Mutta useimmissa tiedostoissa sitä käytetään, koska se antaa paremman kuvanlaadun alinäytteenoton jälkeen kuin RGB. Mutta sinun ei tarvitse uskoa sanaani. Katso itse alla olevasta taulukosta, miltä kunkin yksittäisen komponentin alinäytteenotto näyttäisi sekä RGB:ssä että YCbCr:ssä.

Miten JPEG-muoto toimii
(Interaktiivinen versio sisään alkuperäinen artikkelit).

Sinisen poisto ei ole yhtä havaittavissa kuin punaisen tai vihreän. Tämä johtuu siitä, että silmissäsi on kuusi miljoonaa kartiota, noin 64 % on herkkiä punaiselle, 32 % vihreälle ja 2 % siniselle.

Y-komponentin (alhaalla vasemmalla) näytteistys näkyy parhaiten. Pienikin muutos on havaittavissa.

Kuvan muuntaminen RGB:stä YCbCr:ksi ei pienennä tiedostokokoa, mutta helpottaa vähemmän havaittavien poistettavien yksityiskohtien löytämistä. Häviöllinen pakkaus tapahtuu toisessa vaiheessa. Se perustuu ajatukseen tietojen esittämisestä paremmin pakattavassa muodossa.

2. Diskreetti kosinimuunnos ja diskretisointi

Tämä pakkaustaso määrittää suurimmaksi osaksi JPEG:n olemuksen. Kun värit on muunnettu YCbCr:ksi, komponentit pakataan yksitellen, joten voimme jatkossa keskittyä vain Y-komponenttiin.Ja tältä näyttää Y-komponentin tavut tämän tason käytön jälkeen.

Miten JPEG-muoto toimii
(Interaktiivinen versio sisään alkuperäinen artikkelit). Interaktiivisessa versiossa pikselin napsauttaminen vierittää editoria sitä kuvaavalle riville. Yritä poistaa numerot lopusta tai lisätä muutama nolla tiettyyn numeroon.

Ensi silmäyksellä se näyttää erittäin huonolta pakkaukselta. Kuvassa on 100 000 pikseliä, ja niiden kirkkauden osoittamiseen tarvitaan 102 400 numeroa (Y-komponentit) - se on pahempaa kuin pakkaamatta mitään!

Huomaa kuitenkin, että useimmat näistä luvuista ovat nollia. Lisäksi kaikki rivien lopun nollat ​​voidaan poistaa muuttamatta kuvaa. Numeroita on jäljellä noin 26 000, mikä on lähes 4 kertaa vähemmän!

Tämä taso sisältää shakkikuvioiden salaisuuden. Toisin kuin muut näkemämme tehosteet, näiden kuvioiden ulkonäkö ei ole häiriö. Ne ovat koko kuvan rakennuspalikoita. Kukin editorin rivi sisältää tarkalleen 64 numeroa, diskreetti kosinimuunnos (DCT) kertoimet, jotka vastaavat 64 yksilöllisen kuvion intensiteettiä.

Nämä kuviot muodostetaan kosinikaavion perusteella. Tältä jotkut niistä näyttävät:

Miten JPEG-muoto toimii
8/64 kertoimet

Alla on kuva, joka näyttää kaikki 64 kuviota.

Miten JPEG-muoto toimii
(Interaktiivinen versio sisään alkuperäinen artikkelit).

Nämä kuviot ovat erityisen tärkeitä, koska ne muodostavat 8x8-kuvien perustan. Jos et ole perehtynyt lineaariseen algebraan, tämä tarkoittaa, että näistä 8 kuviosta voidaan saada mikä tahansa 8x64-kuva. DCT on prosessi, jossa kuvat jaetaan 8x8 lohkoihin ja muunnetaan jokainen lohko näiden 64 kertoimen yhdistelmäksi.

Se, että mikä tahansa kuva voidaan koota 64 tietystä kuviosta, vaikuttaa taikalta. Tämä on kuitenkin sama kuin sanoisi, että mitä tahansa paikkaa maapallolla voidaan kuvata kahdella numerolla - leveysaste ja pituusaste [osoittaa pallonpuoliskoja / n. käännös.]. Ajattelemme usein maapallon pintaa kaksiulotteisena, joten tarvitsemme vain kaksi numeroa. 8x8 kuvalla on 64 mitat, joten tarvitsemme 64 numeroa.

Ei ole vielä selvää, kuinka tämä auttaa meitä pakkaamisessa. Jos tarvitsemme 64 numeroa edustamaan 8x8 kuvaa, miksi tämä olisi parempi kuin vain 64 luminanssikomponentin tallentaminen? Teemme tämän samasta syystä kuin muutimme kolme RGB-numeroa kolmeksi YCbCr-numeroksi: sen avulla voimme poistaa hienovaraisia ​​yksityiskohtia.

Tässä vaiheessa on vaikea nähdä tarkalleen, mitä yksityiskohtia poistetaan, koska JPEG käyttää DCT:tä 8x8-lohkoihin. Kukaan ei kuitenkaan kiellä meitä soveltamasta sitä koko kuvaan. Tältä näyttää Y-komponentin DCT, kun sitä sovelletaan koko kuvaan:

Miten JPEG-muoto toimii

Yli 60 000 numeroa voidaan poistaa lopusta ilman havaittavia muutoksia valokuvassa.

Miten JPEG-muoto toimii

Huomaa kuitenkin, että jos nollaamme viisi ensimmäistä numeroa, ero on ilmeinen.

Miten JPEG-muoto toimii

Alussa olevat numerot edustavat matalataajuisia muutoksia kuvassa, ja silmämme havaitsevat ne parhaiten. Numerot lopussa osoittavat korkeita taajuuksia, joita on vaikea havaita. Nähdäksemme sen, mitä silmä ei näe, voimme eristää nämä korkeataajuiset yksityiskohdat nollaamalla pois ensimmäiset 5000 numeroa.

Miten JPEG-muoto toimii

Näemme kaikki kuvan alueet, joissa tapahtuu suurin muutos pikselistä toiseen. Kissan silmät, hänen viikset, froteepeitto ja varjot vasemmassa alakulmassa erottuvat. Voit mennä pidemmälle nollaamalla ensimmäiset 10 000 numeroa:

Miten JPEG-muoto toimii

20 000:

Miten JPEG-muoto toimii

40 000:

Miten JPEG-muoto toimii

60 000:

Miten JPEG-muoto toimii

JPEG poistaa nämä korkeataajuiset yksityiskohdat pakkausvaiheen aikana. Värien muuntaminen DCT-kertoimiksi on häviötöntä. Häviöt muodostuvat näytteenottovaiheessa, jossa korkeataajuiset tai lähellä nollaa olevat arvot poistetaan. Kun alennat JPEG-tallennuksen laatua, ohjelma nostaa poistettavien arvojen kynnystä, mikä pienentää tiedostokokoa, mutta tekee kuvasta pikselöidymmän. Joten ensimmäisen osan kuva, joka oli 57 kertaa pienempi, näytti tältä. Jokainen 8x8-lohko edusti paljon pienempää määrää DCT-kertoimia korkealaatuiseen versioon verrattuna.

Voit tehdä jotain niin siistiä kuin kuvien asteittainen suoratoisto. Voit näyttää epäselvän kuvan, joka muuttuu yhä yksityiskohtaisemmiksi, kun lisää kertoimia ladataan.

Tässä vain huvin vuoksi, mitä tapahtuu, kun käytetään vain 24 000 numeroa:

Miten JPEG-muoto toimii

Tai vain 5000:

Miten JPEG-muoto toimii

Erittäin epäselvä mutta tunnistettava!

3. Ajonpituuksien, delta ja Huffman koodaus

Toistaiseksi kaikki pakkausvaiheet ovat olleet häviöllisiä. Viimeinen vaihe päinvastoin menee ilman tappiota. Se ei poista tietoja, mutta pienentää merkittävästi tiedoston kokoa.

Kuinka voit pakata jotain hävittämättä tietoja? Kuvittele, kuinka kuvailisimme yksinkertaista mustaa 700 x 437 suorakulmiota.

JPEG käyttää tähän 5000 numeroa, mutta paljon parempia tuloksia voidaan saavuttaa. Voitko kuvitella koodausmallin, joka kuvaa tällaisen kuvan mahdollisimman harvoissa tavuissa?

Minimaalijärjestelmä, jonka voisin keksiä, käyttää neljää: kolmea väriä varten ja neljättä värin pikseleiden määrää. Ajatusta toistuvien arvojen esittämisestä tällaisella pakatulla tavalla kutsutaan run-length-koodaukseksi. Se on häviötön, koska voimme palauttaa koodatut tiedot alkuperäisessä muodossaan.

Mustalla suorakulmiolla varustetun JPEG-tiedoston koko on paljon suurempi kuin 4 tavua - muista, että DCT-tasolla pakkausta sovelletaan 8x8 pikselin lohkoihin. Siksi tarvitsemme vähintään yhden DCT-kertoimen jokaista 64 pikseliä kohden. Tarvitsemme sellaisen, koska sen sijaan, että tallentaisimme yhden DCT-kertoimen ja sen jälkeen 63 nollaa, run-length-koodaus antaa meille mahdollisuuden tallentaa yhden numeron ja merkitä "kaikki muut ovat nollia".

Delta-koodaus on tekniikka, jossa jokainen tavu sisältää eron jostakin arvosta absoluuttisen arvon sijaan. Siksi tiettyjen tavujen muokkaaminen muuttaa kaikkien muiden pikselien väriä. Esimerkiksi varastoinnin sijaan

12 13 14 14 14 13 13 14

Voisimme aloittaa luvulla 12 ja sitten kirjoittaa vain, kuinka paljon lisätään tai vähennetään, jotta saadaan seuraava luku. Ja tämä sekvenssi deltakoodauksessa on muodossa:

12 1 1 0 0 -1 0 1

Muunnettu data ei ole pienempi kuin alkuperäinen data, mutta se on helpompi pakata. Delta-koodauksen käyttäminen ennen run-length-koodausta voi auttaa paljon, mutta silti häviötön pakkaus.

Delta-koodaus on yksi harvoista tekniikoista, joita käytetään 8x8-lohkojen ulkopuolella. 64 DCT-kertoimesta yksi on yksinkertaisesti vakioaaltofunktio (tasainen väri). Se edustaa kunkin lohkon keskimääräistä kirkkautta luminanssikomponenteille tai keskimääräistä sinisyyttä Cb-komponenteille ja niin edelleen. Kunkin DCT-lohkon ensimmäistä arvoa kutsutaan DC-arvoksi, ja jokainen DC-arvo on deltakoodattu suhteessa edellisiin. Siksi ensimmäisen lohkon kirkkauden muuttaminen vaikuttaa kaikkiin lohkoihin.

Viimeinen mysteeri jää: kuinka yksikön muuttaminen pilaa koko kuvan kokonaan? Toistaiseksi pakkaustasoilla ei ole ollut tällaisia ​​ominaisuuksia. Vastaus löytyy JPEG-otsikosta. Ensimmäiset 500 tavua sisältävät metatietoja kuvasta - leveys, korkeus jne., emmekä ole vielä työskennelleet niiden kanssa.

Ilman otsikkoa on lähes mahdotonta (hyvin, erittäin vaikeaa) purkaa JPEG. Näyttää siltä, ​​että yritän kuvailla sinulle kuvaa ja olen alkanut keksiä sanoja välittääkseni vaikutelmani. Kuvaus on luultavasti hyvin ytimekäs, koska voin keksiä sanoja, joilla on täsmälleen sellainen merkitys, jonka haluan välittää, mutta kaikille muille niistä ei ole järkeä.

Kuulostaa typerältä, mutta niin se menee. Jokainen JPEG-kuva on pakattu sille ominaisilla koodeilla. Koodisanakirja tallennetaan otsikkoon. Tätä tekniikkaa kutsutaan "Huffman-koodiksi" ja sanakirjaa kutsutaan Huffman-taulukoksi. Otsikossa taulukko on merkitty kahdella tavulla - 255 ja sitten 196. Jokaisella värikomponentilla voi olla oma taulukko.

Taulukon muutokset vaikuttavat dramaattisesti mihin tahansa kuvaan. Hyvä esimerkki on muuttaa 15. rivillä 1 arvoon 12.

Miten JPEG-muoto toimii

Tämä johtuu siitä, että taulukot määrittelevät, kuinka yksittäiset bitit luetaan. Toistaiseksi olemme työskennelleet vain binäärilukujen kanssa desimaalimuodossa. Mutta tämä piilottaa meiltä sen tosiasian, että jos haluat tallentaa luvun 1 tavuun, se näyttää 00000001:ltä, koska jokaisessa tavussa on oltava täsmälleen kahdeksan bittiä, vaikka niistä vain yksi tarvittaisiin.

Tämä voi olla suurta tilanhukkaa, jos sinulla on paljon pieniä numeroita. Huffman-koodi on tekniikka, jonka avulla voimme lieventää tätä vaatimusta, jonka mukaan jokaisen numeron on täytettävä kahdeksan bittiä. Tämä tarkoittaa, että jos näet kaksi tavua:

234 115

Sitten Huffman-taulukosta riippuen se voi olla kolme numeroa. Voit purkaa ne ensin jakaa ne yksittäisiksi bitteiksi:

11101010 01110011

Sitten siirrymme taulukkoon ymmärtääksemme, kuinka ne ryhmitellään. Se voi olla esimerkiksi kuusi ensimmäistä bittiä (111010) tai 58 desimaalilukuna, jota seuraa viisi bittiä (10011) tai 19 ja lopuksi viimeiset neljä bittiä (0011) tai 3.

Siksi on erittäin vaikea ymmärtää tavuja tässä pakkausvaiheessa. Tavut eivät edusta sitä, miltä ne näyttävät. En mene tässä artikkelissa taulukon kanssa työskentelyn yksityiskohtiin, mutta tarvikkeet tästä aiheesta verkossa riittää.

Yksi hienoista temppuista, joita voit tehdä tällä tiedolla, on erottaa otsikko JPEG-tiedostosta ja tallentaa se erikseen. Itse asiassa käy ilmi, että vain sinä voit lukea tiedoston. Facebook tekee tämän vähentääkseen tiedostoja entisestään.

Mitä muuta voidaan tehdä, on muuttaa Huffman-taulukkoa melko vähän. Toisille se näyttää pilaantuneelta kuvalta. Ja vain sinä tiedät taikavaihtoehdon korjata se.

Yhteenvetona: mitä siis tarvitaan JPEG:n purkamiseen? Välttämätön:

  1. Pura Huffman-taulukko(t) otsikosta ja pura bitit.
  2. Poimi diskreetit kosinimuunnoskertoimet jokaiselle väri- ja luminanssikomponentille jokaiselle 8x8 lohkolle muuttamalla käänteisesti run-length-koodausta ja deltaa.
  3. Yhdistä kertoimiin perustuvia kosineja saadaksesi pikseliarvot jokaiselle 8x8 lohkolle.
  4. Skaalaa värikomponentit, jos alinäytteenotto suoritettiin (tämä tieto on otsikossa).
  5. Muunna kunkin pikselin tuloksena saadut YCbCr-arvot RGB:ksi.
  6. Tuo kuva näytölle!

Vakavaa työtä yksinkertaisesti valokuvan katselemiseen kissan kanssa! Pidän siitä kuitenkin, että se osoittaa, kuinka ihmiskeskeinen JPEG-tekniikka on. Se perustuu havaintomme ominaisuuksiin, mikä antaa meille mahdollisuuden saavuttaa paljon parempi pakkaus kuin perinteiset tekniikat. Ja nyt, kun ymmärrät, miten JPEG toimii, voit kuvitella, kuinka näitä tekniikoita voidaan siirtää muille alueille. Esimerkiksi videon deltakoodaus voi pienentää merkittävästi tiedostokokoa, koska usein on kokonaisia ​​alueita, jotka eivät muutu kehyksestä toiseen (esimerkiksi tausta).

Artikkelissa käytetty koodi, on auki ja sisältää ohjeet kuvien korvaamiseen omillasi.

Lähde: will.com

Lisää kommentti