Com funciona el format JPEG

Les imatges JPEG són omnipresents a les nostres vides digitals, però darrere d'aquesta capa de consciència hi ha algorismes que eliminen detalls que no són perceptibles a l'ull humà. El resultat és la màxima qualitat visual en la mida de fitxer més petita, però com funciona exactament tot? A veure què no veuen els nostres ulls!

Com funciona el format JPEG

És fàcil donar per feta la possibilitat d'enviar una foto a un amic i no preocupar-se pel dispositiu, navegador o sistema operatiu que estan utilitzant, però no sempre va ser així. A principis de la dècada de 1980, els ordinadors podien emmagatzemar i mostrar imatges digitals, però hi havia moltes idees en competència sobre la millor manera de fer-ho. No podríeu enviar una imatge d'un ordinador a un altre i esperar que funcioni.

Per resoldre aquest problema, l'any 1986 es va reunir un comitè d'experts d'arreu del món anomenat "Grup mixt d'experts en fotografia» (Joint Photographic Experts Group, JPEG), fundat com a col·laboració entre l'Organització Internacional per a la Normalització (ISO) i la Comissió Electrotècnica Internacional (IEC), dues organitzacions internacionals de normalització amb seu a Ginebra, Suïssa.

Un grup de persones anomenades JPEG va crear l'estàndard de compressió d'imatges digitals JPEG el 1992. Qualsevol que hagi utilitzat Internet probablement s'hagi trobat amb imatges codificades en JPEG. Aquesta és la forma més habitual de codificar, enviar i emmagatzemar imatges. Des de pàgines web fins a correus electrònics i xarxes socials, JPEG s'utilitza milers de milions de vegades al dia, pràcticament cada vegada que veiem una imatge en línia o l'enviem. Sense JPEG, la web seria menys colorida, més lenta i probablement tindria menys imatges de gats!

Aquest article tracta sobre com descodificar una imatge JPEG. En altres paraules, el que es requereix per convertir les dades comprimides emmagatzemades en un ordinador en una imatge que apareix a la pantalla. Val la pena saber-ho, no només perquè és important entendre la tecnologia que fem servir cada dia, sinó també perquè desbloquejant els nivells de compressió, aprenem més sobre la percepció i la visió, i quins detalls són més sensibles als nostres ulls.

A més, jugar amb imatges d'aquesta manera és molt interessant.

Com funciona el format JPEG

Mirant dins JPEG

En un ordinador, tot s'emmagatzema com una seqüència de nombres binaris. Normalment, aquests bits, zeros i uns, s'agrupen en grups de vuit per formar bytes. Quan obriu una imatge JPEG en un ordinador, alguna cosa (un navegador, un sistema operatiu, una altra cosa) ha de descodificar els bytes, restaurant la imatge original com una llista de colors que es poden mostrar.

Si descarregueu aquest dolç foto d'un gat i obriu-lo en un editor de text, veureu un munt de caràcters incoherents.

Com funciona el format JPEG
Aquí estic fent servir el Bloc de notes ++ per examinar el contingut del fitxer, ja que els editors de text habituals com el Bloc de notes a Windows corrompran el fitxer binari després de desar-lo i ja no satisfarà el format JPEG.

Obrir una imatge en un processador de textos confon l'ordinador, igual que confoneu el vostre cervell quan us fregueu els ulls i comenceu a veure taques de color!

Aquests llocs que veus es coneixen com fosfens, i no són el resultat d'un estímul lleuger o d'una al·lucinació generada per la ment. Es produeixen perquè el vostre cervell pensa que qualsevol senyal elèctric dels nervis òptics transmet informació sobre la llum. El cervell ha de fer aquestes suposicions perquè no hi ha manera de saber si un senyal és un so, una visió o una altra cosa. Tots els nervis del cos transmeten exactament els mateixos impulsos elèctrics. Aplicant pressió als ulls, envieu senyals que no són visuals, però activen els receptors de l'ull, que el vostre cervell interpreta -en aquest cas, incorrectament- com quelcom visual. Es pot veure literalment la pressió!

És curiós pensar en com són els ordinadors semblants al cervell, però també és una analogia útil per il·lustrar fins a quin punt el significat de les dades, ja siguin transportades pel cos pels nervis o emmagatzemades en un ordinador, depèn de com s'interpreten. Totes les dades binàries estan formades per 0 i 1, els components bàsics que poden transmetre informació de qualsevol tipus. El vostre ordinador sovint descobreix com interpretar-los mitjançant pistes com ara extensions de fitxer. Ara ho obliguem a interpretar-los com a text, perquè això és el que espera l'editor de text.

Per entendre com descodificar JPEG, hem de veure els mateixos senyals originals: les dades binàries. Això es pot fer mitjançant un editor hexadecimal o directament pàgina web de l'article original! Hi ha una imatge, al costat de la qual al camp de text hi ha tots els seus bytes (excepte la capçalera), presentats en forma decimal. Podeu canviar-los i l'script tornarà a codificar i produirà una imatge nova sobre la marxa.

Com funciona el format JPEG

Pots aprendre molt només jugant amb aquest editor. Per exemple, pots dir en quin ordre s'emmagatzemen els píxels?

El més estrany d'aquest exemple és que canviar alguns números no afecta gens a la imatge, però, per exemple, si substituïu el número 17 pel 0 a la primera línia, la foto quedarà completament arruïnada!

Com funciona el format JPEG

Altres canvis, com substituir el 7 de la línia 1988 pel número 254, canvien el color, però només dels píxels posteriors.

Com funciona el format JPEG

Potser el més estrany és que alguns números canvien no només el color, sinó també la forma de la imatge. Canvieu el 70 a la línia 12 per 2 i mireu la fila superior de la imatge per veure què vull dir.

Com funciona el format JPEG

I independentment de la imatge JPEG que utilitzeu, sempre trobareu aquests misteriosos patrons d'escacs quan editeu els bytes.

Quan es juga amb l'editor, és difícil entendre com es recrea una foto a partir d'aquests bytes, ja que la compressió JPEG consta de tres tecnologies diferents, aplicades seqüencialment en nivells. Estudiarem cadascun per separat per descobrir el comportament misteriós que estem veient.

Tres nivells de compressió JPEG:

  1. Submostreig de colors.
  2. Transformada discreta del cosinus i mostreig.
  3. Codificació de la longitud de l'execució, delta и Huffman

Per fer-vos una idea de la magnitud de la compressió, tingueu en compte que la imatge de dalt representa 79 números, o uns 819 KB. Si l'emmagatzemem sense compressió, cada píxel necessitaria tres números: per als components vermell, verd i blau. Això suposaria 79 números, o aprox. 917 KB. Com a resultat de la compressió JPEG, el fitxer final es va reduir més de 700 vegades!

De fet, aquesta imatge es pot comprimir molt més. A continuació es mostren dues imatges una al costat de l'altra: la foto de la dreta s'ha comprimit a 16 KB, és a dir, 57 vegades més petita que la versió sense comprimir!

Com funciona el format JPEG

Si us fixeu bé, veureu que aquestes imatges no són idèntiques. Totes dues són imatges amb compressió JPEG, però la dreta té un volum molt més petit. També es veu una mica pitjor (mireu els quadrats de color de fons). És per això que JPEG també s'anomena compressió amb pèrdues; Durant el procés de compressió, la imatge canvia i perd alguns detalls.

1. Submostreig de colors

Aquí hi ha una imatge amb només el primer nivell de compressió aplicat.

Com funciona el format JPEG
(Versió interactiva - en original articles). Eliminar un número destrueix tots els colors. Tanmateix, si s'eliminen exactament sis números, pràcticament no té cap efecte sobre la imatge.

Ara els números són una mica més fàcils de desxifrar. Es tracta d'una llista gairebé senzilla de colors, en què cada byte canvia exactament un píxel, però al mateix temps ja té la meitat de la mida de la imatge sense comprimir (que ocuparia uns 300 KB en aquesta mida reduïda). Pots endevinar per què?

Podeu veure que aquests nombres no representen els components estàndard vermell, verd i blau, ja que si substituïm tots els nombres per zeros, obtindrem una imatge verda (en lloc de blanca).

Com funciona el format JPEG

Això és degut a que aquests bytes representen Y (brillantor),

Com funciona el format JPEG

Cb (blaus relativa),

Com funciona el format JPEG

i imatges Cr (envermelliment relatiu).

Com funciona el format JPEG

Per què no utilitzar RGB? Després de tot, així és com funcionen les pantalles més modernes. El vostre monitor pot mostrar qualsevol color, inclosos el vermell, el verd i el blau, amb diferents intensitats per a cada píxel. El blanc s'obté en encendre els tres a plena brillantor i el negre apagant-los.

Com funciona el format JPEG

Això també és molt semblant a com funciona l'ull humà. Els receptors de color dels nostres ulls s'anomenen "cons", i es divideixen en tres tipus, cadascun dels quals és més sensible als colors vermell, verd o blau [els cons de tipus S són sensibles al blau violeta (S de l'anglès Short - espectre d'ona curta), M -tipus - a les parts de l'espectre de color verd-groc (M de l'anglès Mitjà - ona mitjana) i tipus L - a les parts de l'espectre groc-vermell (L de l'anglès Long - d'ona llarga). La presència d'aquests tres tipus de cons (i varetes, que són sensibles a la part verda maragda de l'espectre) dóna a una persona una visió del color. / aprox. trad.]. Palets, un altre tipus de fotoreceptor als nostres ulls, és capaç de detectar canvis de brillantor, però és molt més sensible al color. Els nostres ulls tenen uns 120 milions de bastons i només 6 milions de cons.

És per això que els nostres ulls detecten molt millor els canvis de brillantor que els canvis de color. Si separeu el color de la brillantor, podeu eliminar una mica de color i ningú no notarà res. El submostreig cromàtic és el procés de representar els components de color d'una imatge a una resolució més baixa que els components de luminància. A l'exemple anterior, cada píxel té exactament un component Y, i cada grup individual de quatre píxels té exactament un component Cb i un component Cr. Per tant, la imatge conté quatre vegades menys informació de color que l'original.

L'espai de color YCbCr no només s'utilitza en JPEG. Va ser inventat originalment l'any 1938 per a programes de televisió. No tothom té un televisor en color, de manera que separar el color i la brillantor va permetre que tothom obtingués el mateix senyal, i els televisors sense color només utilitzaven només el component de brillantor.

Per tant, eliminar un número de l'editor arruïna completament tots els colors. Els components s'emmagatzemen en la forma YYYY Cb Cr (de fet, no necessàriament en aquest ordre; l'ordre d'emmagatzematge s'especifica a la capçalera del fitxer). L'eliminació del primer número farà que el primer valor de Cb es percebi com a Y, Cr com a Cb i, en general, tindreu un efecte dòmino que canvia tots els colors de la imatge.

L'especificació JPEG no us obliga a utilitzar YCbCr. Però la majoria dels fitxers l'utilitzen perquè produeix millors imatges reduïdes que RGB. Però no cal que em creguis la paraula. Vegeu vosaltres mateixos a la taula següent com serà el submostreig de cada component individual tant en RGB com en YCbCr.

Com funciona el format JPEG
(Versió interactiva - en original articles).

L'eliminació del blau no és tan notable com la del vermell o el verd. Això és degut als sis milions de cons dels ulls, al voltant del 64% són sensibles al vermell, el 32% al verd i el 2% al blau.

El mostreig inferior del component Y (a baix a l'esquerra) es veu millor. Fins i tot un petit canvi es nota.

Convertir una imatge de RGB a YCbCr no redueix la mida del fitxer, però fa que sigui més fàcil trobar detalls menys visibles que es poden eliminar. La compressió amb pèrdues es produeix en la segona etapa. Es basa en la idea de presentar les dades d'una forma més compressible.

2. Transformada discreta del cosinus i mostreig

Aquest nivell de compressió és, en la seva major part, el que tracta JPEG. Després de convertir els colors a YCbCr, els components es comprimeixen individualment, de manera que ens podem concentrar només en el component Y. I aquí teniu l'aspecte dels bytes del component Y després d'aplicar aquesta capa.

Com funciona el format JPEG
(Versió interactiva - en original articles). A la versió interactiva, fent clic sobre un píxel es desplaça l'editor fins a la línia que el representa. Intenteu eliminar números del final o afegir uns quants zeros a un nombre determinat.

A primera vista, sembla una compressió molt dolenta. Hi ha 100 píxels en una imatge i es necessiten 000 números per representar la seva brillantor (components Y), això és pitjor que no comprimir res!

Tanmateix, tingueu en compte que la majoria d'aquests números són zero. A més, tots aquests zeros al final de les línies es poden eliminar sense canviar la imatge. Queden uns 26 números, i això és gairebé 000 vegades menys!

Aquest nivell conté el secret dels patrons d'escacs. A diferència d'altres efectes que hem vist, l'aparició d'aquests patrons no és cap problema. Són els components bàsics de tota la imatge. Cada línia de l'editor conté exactament 64 números, coeficients de transformació discreta del cosinus (DCT) corresponents a les intensitats de 64 patrons únics.

Aquests patrons es formen a partir de la gràfica del cosinus. Aquí teniu el que semblen alguns d'ells:

Com funciona el format JPEG
8 de 64 probabilitats

A continuació es mostra una imatge que mostra els 64 patrons.

Com funciona el format JPEG
(Versió interactiva - en original articles).

Aquests patrons tenen una importància especial perquè formen la base de les imatges de 8x8. Si no esteu familiaritzat amb l'àlgebra lineal, això vol dir que qualsevol imatge de 8x8 es pot fer a partir d'aquests 64 patrons. DCT és el procés de dividir imatges en blocs de 8x8 i convertir cada bloc en una combinació d'aquests 64 coeficients.

Sembla màgia que qualsevol imatge pugui estar composta per 64 patrons específics. Tanmateix, això és el mateix que dir que qualsevol lloc de la Terra es pot descriure amb dos números: latitud i longitud [indicant hemisferis / aprox. trad.]. Sovint pensem que la superfície de la Terra és bidimensional, de manera que només necessitem dos nombres. Una imatge de 8x8 té 64 dimensions, de manera que necessitem 64 números.

Encara no està clar com ens ajuda això en termes de compressió. Si necessitem 64 números per representar una imatge de 8x8, per què seria millor que només emmagatzemar 64 components de brillantor? Ho fem pel mateix motiu pel qual hem convertit tres números RGB en tres números YCbCr: ens permet eliminar detalls subtils.

És difícil veure exactament quin detall s'elimina en aquesta etapa perquè JPEG aplica DCT als blocs de 8x8. Tanmateix, ningú ens prohibeix aplicar-ho a tota la imatge. A continuació es mostra com es veu el DCT per al component Y aplicat a tota la imatge:

Com funciona el format JPEG

Es poden eliminar més de 60 números del final sense pràcticament cap canvi notable a la foto.

Com funciona el format JPEG

Tanmateix, tingueu en compte que si eliminem a zero els primers cinc nombres, la diferència serà òbvia.

Com funciona el format JPEG

Els números al principi representen canvis de baixa freqüència en la imatge, que els nostres ulls capten millor. Els números cap al final indiquen canvis en les altes freqüències que són més difícils de notar. Per "veure allò que l'ull no pot veure", podem aïllar aquests detalls d'alta freqüència posant a zero els primers 5000 nombres.

Com funciona el format JPEG

Veiem totes les zones de la imatge on es produeix el canvi més gran de píxel a píxel. Destaquen els ulls del gat, els seus bigotis, la manta de felpa i les ombres de l'angle inferior esquerre. Podeu anar més enllà posant a zero els primers 10 nombres:

Com funciona el format JPEG

20: 000

Com funciona el format JPEG

40: 000

Com funciona el format JPEG

60: 000

Com funciona el format JPEG

Aquests detalls d'alta freqüència s'eliminen mitjançant JPEG durant l'etapa de compressió. No hi ha pèrdua en la conversió de colors a coeficients DCT. La pèrdua es produeix en el pas de mostreig, on s'eliminen els valors d'alta freqüència o gairebé zero. Quan baixeu la qualitat d'estalvi de JPEG, el programa augmenta el llindar del nombre de valors eliminats, la qual cosa redueix la mida del fitxer, però fa que la imatge sigui més pixelada. Per això la imatge de la primera secció, que era 57 vegades més petita, semblava així. Cada bloc de 8x8 estava representat per molts menys coeficients DCT en comparació amb la versió de més qualitat.

Podeu crear un efecte tan fantàstic com la transmissió gradual d'imatges. Podeu mostrar una imatge borrosa que es fa més i més detallada a mesura que es baixen més i més coeficients.

Aquí, només per diversió, teniu el que obteniu amb només 24 números:

Com funciona el format JPEG

O només 5000:

Com funciona el format JPEG

Molt borrosa, però d'alguna manera reconeixible!

3. Codificació de longitud d'execució, delta i Huffman

Fins ara, totes les etapes de compressió han estat amb pèrdues. L'última etapa, per contra, transcorre sense pèrdues. No elimina informació, però redueix significativament la mida del fitxer.

Com pots comprimir alguna cosa sense llençar informació? Imagineu com descriurim un rectangle negre simple de 700 x 437.

JPEG utilitza 5000 números per a això, però es poden aconseguir resultats molt millors. Us imagineu un esquema de codificació que descrigui aquesta imatge en el menor nombre de bytes possible?

L'esquema mínim que podria inventar en fa servir quatre: tres per representar un color i un quart per indicar quants píxels té aquest color. La idea de representar valors que es repeteixen d'aquesta manera condensada s'anomena codificació de longitud d'execució. No té pèrdues perquè podem restaurar les dades codificades a la seva forma original.

Un fitxer JPEG amb un rectangle negre és molt més gran que 4 bytes; recordeu que a nivell DCT, la compressió s'aplica a blocs de 8x8 píxels. Per tant, com a mínim, necessitem un coeficient DCT per cada 64 píxels. Necessitem un perquè en comptes d'emmagatzemar un coeficient DCT seguit de 63 zeros, la codificació de la longitud d'execució ens permet emmagatzemar un nombre i indicar que "tots els altres són zeros".

La codificació delta és una tècnica en la qual cada byte conté una diferència d'algun valor, en lloc d'un valor absolut. Per tant, l'edició de determinats bytes canvia el color de la resta de píxels. Per exemple, en lloc d'emmagatzemar

12 13 14 14 14 13 13 14

Podríem començar amb 12 i després simplement indicar quant hem de sumar o restar per obtenir el següent nombre. I aquesta seqüència en codificació delta pren la forma:

12 1 1 0 0 -1 0 1

Les dades convertides no són més petites que les dades originals, però és més fàcil comprimir-les. L'aplicació de la codificació delta abans de la codificació de la durada de l'execució pot ajudar molt, tot i que continua sent compressió sense pèrdues.

La codificació delta és una de les poques tècniques utilitzades fora dels blocs de 8x8. Dels 64 coeficients DCT, un és simplement una funció d'ona constant (color sòlid). Representa la brillantor mitjana de cada bloc per als components luma, o el blau mitjà per als components Cb, etc. El primer valor de cada bloc DCT s'anomena valor DC, i cada valor DC està codificat en delta respecte als anteriors. Per tant, canviar la brillantor del primer bloc afectarà tots els blocs.

El misteri final queda: com canviar el singular arruïna completament tot el panorama? Fins ara, els nivells de compressió no han tingut aquestes propietats. La resposta es troba a la capçalera JPEG. Els primers 500 bytes contenen metadades sobre la imatge: amplada, alçada, etc., i encara no hem treballat amb ells.

Sense capçalera és gairebé impossible (o molt difícil) descodificar JPEG. Semblarà com si estigués tractant de descriure la imatge, i estic començant a inventar paraules per transmetre la meva impressió. La descripció probablement serà força condensada, ja que puc inventar paraules amb exactament el significat que vull transmetre, però per a tots els altres no tindran sentit.

Sembla estúpid, però això és exactament el que passa. Cada imatge JPEG es comprimeix amb codis específics. El diccionari de codi s'emmagatzema a la capçalera. Aquesta tècnica s'anomena codi Huffman i el vocabulari s'anomena taula de Huffman. A la capçalera, la taula està marcada amb dos bytes: 255 i després 196. Cada component de color pot tenir la seva pròpia taula.

Els canvis a les taules afectaran radicalment qualsevol imatge. Un bon exemple és canviar la línia 15 per la 1.

Com funciona el format JPEG

Això passa perquè les taules especifiquen com s'han de llegir els bits individuals. Fins ara només hem treballat amb nombres binaris en forma decimal. Però això ens amaga el fet que si voleu emmagatzemar el número 1 en un byte, semblarà 00000001, ja que cada byte ha de tenir exactament vuit bits, encara que només en calgui un.

Això és potencialment una gran pèrdua d'espai si teniu molts números petits. El codi Huffman és una tècnica que ens permet relaxar aquest requisit que cada número ha d'ocupar vuit bits. Això vol dir que si veieu dos bytes:

234 115

Aleshores, depenent de la taula de Huffman, aquests podrien ser tres números. Per extreure-los, primer cal descompondre'ls en parts individuals:

11101010 01110011

Després mirem la taula per descobrir com agrupar-los. Per exemple, aquests podrien ser els primers sis bits, (111010) o 58 en decimal, seguits de cinc bits (10011) o 19, i finalment els últims quatre bits (0011) o 3.

Per tant, és molt difícil entendre els bytes en aquesta etapa de compressió. Els bytes no representen el que semblen. No entraré en detalls del treball amb la taula en aquest article, però materials sobre aquest tema en línia és suficient.

Un truc interessant que podeu fer amb aquest coneixement és separar la capçalera del JPEG i emmagatzemar-la per separat. De fet, resulta que només tu pots llegir el fitxer. Facebook fa això per fer que els fitxers siguin encara més petits.

El que més es pot fer és canviar una mica la taula de Huffman. Per a altres, semblarà una imatge trencada. I només tu sabràs la manera màgica d'arreglar-ho.

Resumim: doncs, què es necessita per descodificar JPEG? Necessari:

  1. Extraieu les taules de Huffman de la capçalera i descodifiqueu els bits.
  2. Extraieu els coeficients discrets de transformació del cosinus per a cada component de color i luminància per a cada bloc de 8x8, realitzant transformacions de codificació de longitud inversa i delta.
  3. Combina els coseus basats en coeficients per obtenir valors de píxels per a cada bloc de 8x8.
  4. Escala els components de color si s'ha realitzat un submostreig (aquesta informació es troba a la capçalera).
  5. Converteix els valors YCbCr resultants per a cada píxel a RGB.
  6. Mostra la imatge a la pantalla!

Un treball seriós per simplement veure una foto amb un gat! Tanmateix, el que m'agrada és que mostra com és la tecnologia JPEG centrada en l'ésser humà. Es basa en les peculiaritats de la nostra percepció, la qual cosa ens permet aconseguir una compressió molt millor que les tecnologies convencionals. I ara que entenem com funciona JPEG, podem imaginar com aquestes tecnologies es poden transferir a altres àrees. Per exemple, la codificació delta del vídeo pot proporcionar una reducció significativa de la mida del fitxer, ja que sovint hi ha àrees senceres que no canvien d'un fotograma a un altre (per exemple, el fons).

Codi utilitzat a l'article, està obert i conté instruccions sobre com substituir les imatges per les vostres.

Font: www.habr.com

Afegeix comentari