Como funciona o formato JPEG

As imaxes JPEG son omnipresentes nas nosas vidas dixitais, pero detrás deste verniz de conciencia hai algoritmos que eliminan detalles que non son perceptibles para o ollo humano. O resultado é a maior calidade visual no menor tamaño de ficheiro, pero como funciona exactamente todo? ¡A ver o que exactamente non ven os nosos ollos!

Como funciona o formato JPEG

É fácil dar por sentada a posibilidade de enviar unha foto a un amigo e non preocuparse polo dispositivo, navegador ou sistema operativo que están a usar, pero non sempre foi así. A principios da década de 1980, os ordenadores podían almacenar e mostrar imaxes dixitais, pero había moitas ideas en competencia sobre a mellor forma de facelo. Non podería simplemente enviar unha imaxe dun ordenador a outro e esperar que funcione.

Para resolver este problema, en 1986 reuniuse un comité de expertos de todo o mundo chamado "Grupo mixto de expertos en fotografía» (Joint Photographic Experts Group, JPEG), fundado como un esforzo conxunto entre a Organización Internacional de Normalización (ISO) e a Comisión Electrotécnica Internacional (IEC), dúas organizacións internacionais de normalización con sede en Xenebra, Suíza.

Un grupo de persoas chamado JPEG creou o estándar de compresión de imaxe dixital JPEG en 1992. Calquera que usou Internet probablemente atopou imaxes codificadas JPEG. Esta é a forma máis común de codificar, enviar e almacenar imaxes. Desde páxinas web ata correos electrónicos e redes sociais, JPEG úsase miles de millóns de veces ao día, practicamente cada vez que vemos unha imaxe en liña ou a enviamos. Sen JPEG, a web sería menos colorida, máis lenta e probablemente tería menos imaxes de gatos.

Este artigo trata sobre como decodificar unha imaxe JPEG. Noutras palabras, o que se require para converter os datos comprimidos almacenados nun ordenador nunha imaxe que aparece na pantalla. Vale a pena sabelo, non só porque é importante comprender a tecnoloxía que usamos todos os días, senón tamén porque ao desbloquear os niveis de compresión, aprendemos máis sobre a percepción e a visión, e a que detalles son máis sensibles os nosos ollos.

Ademais, xogar coas imaxes deste xeito é moi interesante.

Como funciona o formato JPEG

Mirando dentro de JPEG

Nun ordenador, todo gárdase como unha secuencia de números binarios. Normalmente estes bits, ceros e uns, agrúpanse en grupos de oito para formar bytes. Cando abres unha imaxe JPEG nun ordenador, algo (un navegador, un sistema operativo, algo máis) debe decodificar os bytes, restaurando a imaxe orixinal como unha lista de cores que se poden mostrar.

Se descargas este doce foto dun gato e ábreo nun editor de texto, verás unha morea de caracteres incoherentes.

Como funciona o formato JPEG
Aquí estou usando Notepad++ para examinar o contido do ficheiro, xa que os editores de texto habituais como o Bloc de notas en Windows corromperán o ficheiro binario despois de gardalo e xa non satisfarán o formato JPEG.

Abrir unha imaxe nun procesador de textos confunde o ordenador, do mesmo xeito que confundes o teu cerebro cando fregas os ollos e comezas a ver manchas de cor.

Estes lugares que ves son coñecidos como fosfenos, e non son o resultado dun estímulo luminoso ou dunha alucinación xerada pola mente. Prodúcense porque o teu cerebro pensa que calquera sinais eléctrico dos nervios ópticos transmite información sobre a luz. O cerebro necesita facer estas suposicións porque non hai forma de saber se un sinal é un son, unha visión ou outra cousa. Todos os nervios do corpo transmiten exactamente os mesmos impulsos eléctricos. Ao aplicar presión aos teus ollos, envías sinais que non son visuais, pero activas os receptores do ollo, que o teu cerebro interpreta -neste caso, incorrectamente- como algo visual. Podes ver literalmente a presión!

É curioso pensar en que as computadoras son similares ao cerebro, pero tamén é unha analoxía útil para ilustrar ata que punto o significado dos datos, xa sexan transportados polo corpo polos nervios ou almacenados nun ordenador, depende de como se interpreten. Todos os datos binarios están formados por XNUMX e XNUMX, os compoñentes básicos que poden transmitir información de calquera tipo. O teu ordenador a miúdo descobre como interpretalos usando pistas como extensións de ficheiros. Agora obrigámolo a interpretalos como texto, porque iso é o que espera o editor de texto.

Para entender como decodificar JPEG, necesitamos ver os propios sinais orixinais: os datos binarios. Isto pódese facer usando un editor hexadecimal ou directamente páxina web do artigo orixinal! Hai unha imaxe, a carón da cal no campo de texto están todos os seus bytes (agás a cabeceira), presentados en forma decimal. Podes cambialos, e o script volverá codificar e producirá unha nova imaxe sobre a marcha.

Como funciona o formato JPEG

Podes aprender moito só xogando con este editor. Por exemplo, podes dicir en que orde se almacenan os píxeles?

O estraño deste exemplo é que cambiar algúns números non afecta en absoluto á imaxe, pero, por exemplo, se substitúes o número 17 por 0 na primeira liña, a foto quedará completamente estragada.

Como funciona o formato JPEG

Outros cambios, como substituír o 7 na liña 1988 polo número 254, cambia a cor, pero só dos píxeles posteriores.

Como funciona o formato JPEG

Quizais o máis estraño é que algúns números non só cambian a cor, senón tamén a forma da imaxe. Cambia o 70 na liña 12 por 2 e mira a fila superior da imaxe para ver o que quero dicir.

Como funciona o formato JPEG

E non importa a imaxe JPEG que uses, sempre atoparás estes misteriosos patróns de xadrez ao editar os bytes.

Cando se xoga co editor, é difícil entender como se recrea unha foto a partir destes bytes, xa que a compresión JPEG consta de tres tecnoloxías diferentes, aplicadas secuencialmente en niveis. Estudaremos cada un por separado para descubrir o misterioso comportamento que estamos a ver.

Tres niveis de compresión JPEG:

  1. Submostraxe de cores.
  2. Transformada coseno discreta e mostraxe.
  3. Codificación de lonxitude de execución, delta и Huffman

Para facerche unha idea da magnitude da compresión, teña en conta que a imaxe superior representa 79 números, ou uns 819 KB. Se o almacenamos sen compresión, cada píxel necesitaría tres números: para os compoñentes vermello, verde e azul. Isto ascendería a 79 números, ou aprox. 917 KB. Como resultado da compresión JPEG, o ficheiro final reduciuse máis de 700 veces.

De feito, esta imaxe pódese comprimir moito máis. A continuación móstranse dúas imaxes: a foto da dereita comprimiuse a 16 KB, é dicir, 57 veces máis pequena que a versión sen comprimir.

Como funciona o formato JPEG

Se observas con atención, verás que estas imaxes non son idénticas. Ambas son imaxes con compresión JPEG, pero a correcta ten un volume moito menor. Tamén se ve un pouco peor (mira os cadrados de cor de fondo). É por iso que JPEG tamén se denomina compresión con perdas; Durante o proceso de compresión, a imaxe cambia e perde algúns detalles.

1. Submostraxe de cores

Aquí tes unha imaxe con só o primeiro nivel de compresión aplicado.

Como funciona o formato JPEG
(Versión interactiva - en orixinal artigos). Eliminar un número destrúe todas as cores. Non obstante, se se eliminan exactamente seis números, practicamente non terá ningún efecto na imaxe.

Agora os números son un pouco máis fáciles de descifrar. Esta é case unha simple lista de cores, na que cada byte cambia exactamente un píxel, pero ao mesmo tempo xa ten a metade do tamaño da imaxe sen comprimir (que ocuparía uns 300 KB neste tamaño reducido). Podes adiviñar por que?

Podes ver que estes números non representan os compoñentes estándar vermello, verde e azul, xa que se substituímos todos os números por ceros, obteremos unha imaxe verde (en lugar de branca).

Como funciona o formato JPEG

Isto é porque estes bytes significan Y (brillo),

Como funciona o formato JPEG

Cb (azul relativo),

Como funciona o formato JPEG

e imaxes Cr (vermelhidão relativa).

Como funciona o formato JPEG

Por que non usar RGB? Despois de todo, así funcionan as pantallas máis modernas. O teu monitor pode mostrar calquera cor, incluíndo vermello, verde e azul, con diferentes intensidades para cada píxel. O branco obtense acendendo os tres a pleno brillo e o negro apagalos.

Como funciona o formato JPEG

Isto tamén é moi semellante ao funcionamento do ollo humano. Os receptores de cor dos nosos ollos chámanse "conos", e divídense en tres tipos, cada un dos cales é máis sensible ás cores vermellas, verdes ou azuis [os conos de tipo S son sensibles no azul violeta (S do inglés espectro de onda curta - curta), M -tipo - no verde-amarelo (M do inglés Medium - onda media) e tipo L - nas partes amarela-vermello (L do inglés Long - longa onda) partes do espectro. A presenza destes tres tipos de conos (e varas, que son sensibles na parte verde esmeralda do espectro) dálle a unha persoa unha visión de cor. / aprox. transl.]. Sticks, outro tipo de fotorreceptores dos nosos ollos, é capaz de detectar cambios no brillo, pero é moito máis sensible á cor. Os nosos ollos teñen uns 120 millóns de bastoncillos e só 6 millóns de conos.

É por iso que os nosos ollos detectan moito mellor os cambios de brillo que os cambios de cor. Se separas a cor do brillo, podes eliminar un pouco de cor e ninguén notará nada. A submostraxe cromática é o proceso de representar os compoñentes de cor dunha imaxe cunha resolución inferior á das compoñentes de luminancia. No exemplo anterior, cada píxel ten exactamente un compoñente Y, e cada grupo individual de catro píxeles ten exactamente un compoñente Cb e un Cr. Polo tanto, a imaxe contén catro veces menos información de cor que a orixinal.

O espazo de cor YCbCr úsase non só en JPEG. Inventouse orixinalmente en 1938 para programas de televisión. Non todos teñen un televisor en cor, polo que separar a cor e o brillo permitiu que todos obtivesen o mesmo sinal, e os televisores sen cor simplemente usaban só o compoñente de brillo.

Entón, eliminar un número do editor arruina por completo todas as cores. Os compoñentes almacénanse na forma YYYY Cb Cr (de feito, non necesariamente nesa orde - a orde de almacenamento especifícase na cabeceira do ficheiro). Eliminar o primeiro número fará que o primeiro valor de Cb se perciba como Y, Cr como Cb e, en xeral, terás un efecto dominó que cambia todas as cores da imaxe.

A especificación JPEG non obriga a usar YCbCr. Pero a maioría dos ficheiros utilízano porque produce imaxes reducidas mellor que RGB. Pero non tes que crer na miña palabra. Vexa por si mesmo na táboa seguinte como será a submostraxe de cada compoñente individual tanto en RGB como en YCbCr.

Como funciona o formato JPEG
(Versión interactiva - en orixinal artigos).

A eliminación do azul non é tan notable como a do vermello ou do verde. Isto é debido aos seis millóns de conos dos teus ollos, preto do 64% son sensibles ao vermello, o 32% ao verde e o 2% ao azul.

A mostraxe inferior do compoñente Y (abaixo á esquerda) vese mellor. Mesmo un pequeno cambio é perceptible.

A conversión dunha imaxe de RGB a YCbCr non reduce o tamaño do ficheiro, pero fai máis doado atopar detalles menos visibles que se poden eliminar. A compresión con perdas ocorre na segunda etapa. Baséase na idea de presentar os datos nunha forma máis comprimible.

2. Transformada coseno discreta e mostraxe

Este nivel de compresión é, na súa maior parte, do que se trata JPEG. Despois de converter as cores a YCbCr, os compoñentes comprímense individualmente, polo que podemos concentrarnos só no compoñente Y. E aquí está o aspecto dos bytes do compoñente Y despois de aplicar esta capa.

Como funciona o formato JPEG
(Versión interactiva - en orixinal artigos). Na versión interactiva, ao facer clic nun píxel desprázase o editor ata a liña que o representa. Proba a eliminar números do final ou a engadir uns ceros a un número determinado.

A primeira vista, parece unha compresión moi mala. Hai 100 píxeles nunha imaxe e necesítanse 000 números para representar o seu brillo (compoñentes Y), é peor que non comprimir nada.

Non obstante, teña en conta que a maioría destes números son cero. Ademais, todos eses ceros ao final das liñas pódense eliminar sen cambiar a imaxe. Quedan preto de 26 números, e isto é case 000 veces menos!

Este nivel contén o segredo dos patróns de xadrez. A diferenza doutros efectos que vimos, a aparición destes patróns non é unha falla. Son os bloques de construción de toda a imaxe. Cada liña do editor contén exactamente 64 números, coeficientes de transformada coseno discreta (DCT) correspondentes ás intensidades de 64 patróns únicos.

Estes patróns fórmanse a partir da gráfica do coseno. Aquí tes como parecen algúns deles:

Como funciona o formato JPEG
8 de 64 probabilidades

A continuación móstrase unha imaxe que mostra os 64 patróns.

Como funciona o formato JPEG
(Versión interactiva - en orixinal artigos).

Estes patróns son de especial importancia porque forman a base das imaxes de 8x8. Se non está familiarizado coa álxebra lineal, isto significa que se pode facer calquera imaxe de 8x8 a partir destes 64 patróns. DCT é o proceso de dividir imaxes en bloques de 8x8 e converter cada bloque nunha combinación destes 64 coeficientes.

Parece maxia que calquera imaxe poida estar composta por 64 patróns específicos. Non obstante, isto é o mesmo que dicir que calquera lugar da Terra pode describirse con dous números: latitude e lonxitude [indicando hemisferios / aprox. transl.]. Moitas veces pensamos que a superficie terrestre é bidimensional, polo que só necesitamos dous números. Unha imaxe de 8x8 ten 64 dimensións, polo que necesitamos 64 números.

Aínda non está claro como nos axuda isto en termos de compresión. Se necesitamos 64 números para representar unha imaxe de 8x8, por que sería mellor que almacenar 64 compoñentes de brillo? Facemos isto pola mesma razón pola que convertemos tres números RGB en tres números YCbCr: permítenos eliminar detalles sutís.

É difícil ver exactamente que detalles se eliminan nesta fase porque JPEG aplica DCT aos bloques de 8x8. Porén, ninguén nos prohibe aplicalo a toda a imaxe. Aquí está o aspecto do DCT para o compoñente Y aplicado a toda a imaxe:

Como funciona o formato JPEG

Pódense eliminar máis de 60 números do final sen practicamente cambios notables na foto.

Como funciona o formato JPEG

Non obstante, teña en conta que se eliminamos a cero os primeiros cinco números, a diferenza será obvia.

Como funciona o formato JPEG

Os números do comezo representan cambios de baixa frecuencia na imaxe, que os nosos ollos captan mellor. Os números cara ao final indican cambios nas frecuencias altas que son máis difíciles de notar. Para "ver o que o ollo non pode ver", podemos illar estes detalles de alta frecuencia reducindo a cero os primeiros 5000 números.

Como funciona o formato JPEG

Vemos todas as áreas da imaxe onde se produce o maior cambio de píxel a píxel. Destacan os ollos do gato, os seus bigotes, a manta de felpa e as sombras da esquina inferior esquerda. Podes ir máis lonxe eliminando os primeiros 10 números:

Como funciona o formato JPEG

20 000:

Como funciona o formato JPEG

40 000:

Como funciona o formato JPEG

60 000:

Como funciona o formato JPEG

Estes detalles de alta frecuencia son eliminados por JPEG durante a etapa de compresión. Non hai perdas na conversión de cores a coeficientes DCT. A perda prodúcese no paso de mostraxe, onde se eliminan os valores de alta frecuencia ou case cero. Cando baixa a calidade do aforro JPEG, o programa aumenta o limiar para o número de valores eliminados, o que reduce o tamaño do ficheiro, pero fai que a imaxe sexa máis pixelada. Por iso a imaxe da primeira sección, que era 57 veces máis pequena, tiña este aspecto. Cada bloque 8x8 estaba representado por moitos menos coeficientes DCT en comparación coa versión de maior calidade.

Podes crear un efecto tan xenial como a transmisión gradual de imaxes. Podes mostrar unha imaxe borrosa que se faga cada vez máis detallada a medida que se descargan máis e máis coeficientes.

Aquí, só por diversión, tes o que obtén con só 24 números:

Como funciona o formato JPEG

Ou só 5000:

Como funciona o formato JPEG

Moi borroso, pero dalgún xeito recoñecible!

3. Codificación de lonxitude de execución, delta e Huffman

Ata agora, todas as fases de compresión foron con perdas. A última etapa, pola contra, transcorre sen perdas. Non elimina información, pero reduce significativamente o tamaño do ficheiro.

Como podes comprimir algo sen tirar información? Imaxina como describiriamos un rectángulo negro simple de 700 x 437.

JPEG usa 5000 números para iso, pero pódense conseguir resultados moito mellores. Podes imaxinar un esquema de codificación que describa tal imaxe no menor número de bytes posible?

O esquema mínimo que puiden inventar usa catro: tres para representar unha cor e un cuarto para indicar cantos píxeles ten esa cor. A idea de representar valores que se repiten deste xeito condensado chámase codificación de duración. Non ten perdas porque podemos restaurar os datos codificados á súa forma orixinal.

Un ficheiro JPEG cun rectángulo negro é moito máis grande que 4 bytes; lembre que no nivel DCT, a compresión aplícase a bloques de 8x8 píxeles. Polo tanto, como mínimo, necesitamos un coeficiente DCT por cada 64 píxeles. Necesitamos un porque en lugar de almacenar un coeficiente DCT seguido de 63 ceros, a codificación de lonxitude de execución permítenos almacenar un número e indicar que "todos os demais son ceros".

A codificación delta é unha técnica na que cada byte contén unha diferenza dalgún valor, en lugar dun valor absoluto. Polo tanto, editar certos bytes cambia a cor de todos os demais píxeles. Por exemplo, en vez de almacenar

12 13 14 14 14 13 13 14

Poderiamos comezar con 12 e despois simplemente indicar canto necesitamos sumar ou restar para obter o seguinte número. E esta secuencia en codificación delta toma a forma:

12 1 1 0 0 -1 0 1

Os datos convertidos non son máis pequenos que os datos orixinais, pero é máis fácil comprimilos. Aplicar a codificación delta antes da codificación de lonxitude de execución pode axudar moito mentres segue a ser unha compresión sen perdas.

A codificación delta é unha das poucas técnicas utilizadas fóra dos bloques de 8x8. Dos 64 coeficientes DCT, un é simplemente unha función de onda constante (cor sólida). Representa o brillo medio de cada bloque para os compoñentes luma, ou o azul medio para os compoñentes Cb, etc. O primeiro valor de cada bloque DCT chámase valor DC, e cada valor DC está codificado en delta con respecto aos anteriores. Polo tanto, cambiar o brillo do primeiro bloque afectará a todos os bloques.

O misterio final permanece: como cambiar o singular arruina por completo todo o panorama? Ata agora, os niveis de compresión non tiveron tales propiedades. A resposta está na cabeceira JPEG. Os primeiros 500 bytes conteñen metadatos sobre a imaxe: ancho, alto, etc., e aínda non traballamos con eles.

Sen cabeceira é case imposible (ou moi difícil) decodificar JPEG. Parecerá como se estivese tentando describirche a imaxe e empezo a inventar palabras para transmitir a miña impresión. A descrición probablemente será bastante condensada, xa que podo inventar palabras co significado que quero transmitir, pero para todos os demais non terán sentido.

Parece estúpido, pero iso é exactamente o que pasa. Cada imaxe JPEG está comprimida con códigos específicos para ela. O dicionario de códigos gárdase na cabeceira. Esta técnica chámase código de Huffman e o vocabulario chámase táboa de Huffman. Na cabeceira, a táboa está marcada con dous bytes: 255 e despois 196. Cada compoñente de cor pode ter a súa propia táboa.

Os cambios nas táboas afectarán radicalmente a calquera imaxe. Un bo exemplo é cambiar a liña 15 a 1.

Como funciona o formato JPEG

Isto ocorre porque as táboas especifican como se deben ler os bits individuais. Ata agora só traballamos con números binarios en forma decimal. Pero isto escóndesnos o feito de que se queres almacenar o número 1 nun byte, parecerá 00000001, xa que cada byte debe ter exactamente oito bits, aínda que só sexa necesario un deles.

Isto é potencialmente un gran desperdicio de espazo se tes moitos números pequenos. O código Huffman é unha técnica que nos permite relaxar este requisito de que cada número debe ocupar oito bits. Isto significa que se ves dous bytes:

234 115

Entón, dependendo da táboa de Huffman, estes poderían ser tres números. Para extraelos, primeiro debes dividilos en partes individuais:

11101010 01110011

Despois miramos a táboa para descubrir como agrupalos. Por exemplo, estes poden ser os primeiros seis bits, (111010) ou 58 en decimal, seguidos de cinco bits (10011) ou 19 e, finalmente, os últimos catro bits (0011) ou 3.

Polo tanto, é moi difícil comprender os bytes nesta fase de compresión. Os bytes non representan o que parecen. Non entrarei en detalles sobre o traballo coa táboa neste artigo, pero materiais sobre este tema en liña é suficiente.

Un truco interesante que podes facer con este coñecemento é separar a cabeceira do JPEG e almacenala por separado. De feito, resulta que só ti podes ler o ficheiro. Facebook fai isto para facer que os ficheiros sexan aínda máis pequenos.

O que máis se pode facer é cambiar un pouco a táboa de Huffman. Para outros parecerá unha imaxe rota. E só ti coñecerás a forma máxica de solucionalo.

Imos resumir: entón, que se necesita para decodificar JPEG? Necesario:

  1. Extrae a(s) táboa(s) de Huffman da cabeceira e decodifica os bits.
  2. Extrae os coeficientes discretos de transformación de coseno para cada compoñente de cor e luminancia para cada bloque de 8x8, realizando transformacións de codificación delta e de lonxitude inversa.
  3. Combina cosenos baseados en coeficientes para obter valores de píxeles para cada bloque de 8x8.
  4. Escala os compoñentes de cor se se realizou a submostraxe (esta información está na cabeceira).
  5. Converte os valores YCbCr resultantes para cada píxel en RGB.
  6. Mostra a imaxe na pantalla!

Un traballo serio para simplemente ver unha foto cun gato! Non obstante, o que me gusta é que mostra como é a tecnoloxía JPEG centrada no ser humano. Baséase nas peculiaridades da nosa percepción, o que nos permite conseguir unha compresión moito mellor que as tecnoloxías convencionais. E agora que entendemos como funciona JPEG, podemos imaxinar como se poden transferir estas tecnoloxías a outras áreas. Por exemplo, a codificación delta no vídeo pode proporcionar unha redución significativa no tamaño do ficheiro, xa que moitas veces hai áreas enteiras que non cambian dun cadro a outro (por exemplo, o fondo).

Código utilizado no artigo, está aberto e contén instrucións sobre como substituír as imaxes polas túas propias.

Fonte: www.habr.com

Engadir un comentario