Jak funguje formát JPEG

Obrázky JPEG jsou v našich digitálních životech všudypřítomné, ale za tímto pláštěm vědomí se skrývají algoritmy, které odstraňují detaily, které lidské oko nevidí. Výsledkem je nejvyšší vizuální kvalita při nejmenší velikosti souboru – ale jak přesně to celé funguje? Podívejme se, co přesně naše oči nevidí!

Jak funguje formát JPEG

Je snadné považovat za samozřejmost možnost poslat fotografii příteli a nemusíte se starat o to, jaké zařízení, prohlížeč nebo operační systém používají – ale ne vždy tomu tak bylo. Na počátku osmdesátých let mohly počítače ukládat a zobrazovat digitální obrázky, ale existovalo mnoho konkurenčních nápadů o nejlepším způsobu, jak toho dosáhnout. Nemohli jste jen poslat obrázek z jednoho počítače do druhého a doufat, že to funguje.

K vyřešení tohoto problému se v roce 1986 sešel výbor odborníků z celého světa pod názvem „Společná skupina fotografických expertů“ (Joint Photographic Experts Group, JPEG), založená jako součást společné práce Mezinárodní organizace pro normalizaci (ISO) a Mezinárodní elektrotechnické komise (IEC), dvou mezinárodních normalizačních organizací se sídlem v Ženevě (Švýcarsko).

Skupina lidí jménem JPEG vytvořila v roce 1992 standard komprese digitálního obrazu JPEG. Každý, kdo používal internet, se pravděpodobně setkal s obrázky ve formátu JPEG. Toto je nejběžnější způsob kódování, odesílání a ukládání obrázků. Od webových stránek přes e-mail až po sociální média se JPEG používá miliardkrát denně – téměř pokaždé, když si prohlížíme nebo posíláme obrázek online. Bez souborů JPEG by byl web méně jasný, pomalejší a pravděpodobně by měl méně obrázků koček!

Tento článek je o tom, jak dekódovat obrázek JPEG. Jinými slovy o tom, co je potřeba k převodu komprimovaných dat uložených v počítači na obrázek, který se objeví na obrazovce. Stojí za to o tom vědět, nejen proto, že je to důležité pro pochopení technologie, kterou denně používáme, ale také proto, že odhalením úrovní komprese lépe poznáme vnímání a vidění a také jaké detaily jsou naše oči nejvíce citlivý na.

Kromě toho je velmi zajímavé hrát si tímto způsobem s obrázky.

Jak funguje formát JPEG

Pohled do JPEGu

V počítači je vše uloženo jako posloupnost binárních čísel. Obvykle jsou tyto bity, nuly a jedničky, seskupeny do osmiček a tvoří bajty. Když otevřete obrázek JPEG v počítači, něco (prohlížeč, operační systém, cokoliv) musí dekódovat bajty a obnovit původní obrázek jako seznam barev, které lze zobrazit.

Pokud si stáhnete tento roztomilý fotka kočky a otevřete jej v textovém editoru, uvidíte spoustu neuspořádaných postav.

Jak funguje formát JPEG
Zde používám Notepad++ ke kontrole obsahu souboru, protože běžné textové editory jako Notepad z Windows binárku po uložení pokazí a nevejde se do formátu JPEG.

Otevření obrázku v textovém editoru je matoucí váš počítač, stejně jako si pletete mozek, když si promnete oči a začnete vidět barevné skvrny!

Tato místa, která vidíte, jsou známá jako fosfenya nejsou výsledkem vystavení světelnému podnětu nebo halucinacím generovaným myslí. Vyskytují se, protože váš mozek si myslí, že jakékoli elektrické signály v optických nervech nesou informace o světle. Mozek potřebuje vytvořit takové předpoklady, protože neexistuje způsob, jak zjistit, zda je signál zvuk, vize nebo něco jiného. Všechny nervy v těle přenášejí úplně stejné elektrické impulsy. Když vyvíjíte tlak na oči, vysíláte signály, které nejsou vizuální, ale aktivují receptory v oku, které váš mozek interpretuje – v tomto případě nesprávně – jako něco vizuálního. Ten tlak je doslova vidět!

Je legrační přemýšlet o tom, jak podobné jsou počítače mozku, ale je to také užitečná analogie, která ilustruje, jak moc význam dat – ať už přenášených tělem nervy nebo uložených v počítači – závisí na tom, jak jsou interpretována. Všechna binární data se skládají z XNUMXs a XNUMXs, základních komponent schopných zprostředkovat jakýkoli druh informací. Váš počítač často hádá, jak je interpretovat pomocí vodítek, jako jsou přípony souborů. Nyní je necháváme interpretovat jako text, protože to textový editor očekává.

Abychom pochopili, jak dekódovat JPEG, potřebujeme vidět samotné původní signály – binární data. To lze provést pomocí hex editoru nebo přímo na webová stránka původního článku! Je zde obrázek, vedle kterého jsou v textovém poli všechny jeho bajty (kromě hlavičky) uvedeny v desítkové podobě. Můžete je změnit a skript se za běhu překóduje a vytvoří nový obrázek.

Jak funguje formát JPEG

Pouhým hraním si s tímto editorem se můžete hodně naučit. Dokážete například říct, v jakém pořadí jsou pixely uloženy?

Na tomto příkladu je zvláštní to, že změna některých čísel se na obrázku vůbec neprojeví a například když na prvním řádku nahradíte číslo 17 0, tak se fotka úplně zkazí!

Jak funguje formát JPEG

Jiné změny, jako je změna 7 na řádku 1988 na 254, změní barvu, ale pouze následující pixely.

Jak funguje formát JPEG

Asi nejpodivnější je, že některá čísla mění nejen barvu, ale i tvar obrázku. Změňte 70 na řádku 12 na 2 a podívejte se na horní řádek obrázku, abyste viděli, co tím myslím.

Jak funguje formát JPEG

A bez ohledu na to, jaký obrázek JPEG použijete, při úpravě bajtů vždy najdete tyto záhadné šachové vzory.

Při hraní s editorem je těžké přijít na to, jak znovu vytvořit fotografii z těchto bajtů, protože komprese JPEG se skládá ze tří různých technologií, které se aplikují postupně v úrovních. Budeme studovat každou z nich samostatně, abychom odhalili tajemné chování, které pozorujeme.

Tři úrovně komprese JPEG:

  1. Podvzorkování barev.
  2. Diskrétní kosinová transformace a diskretizace.
  3. Kódování délky běhu, delta и huffman

Abyste měli představu o rozsahu komprese, všimněte si, že výše uvedený obrázek představuje 79 819 čísel, což je asi 79 KB. Pokud bychom jej ukládali bez komprese, potřebovali bychom pro každý pixel tři čísla – pro červenou, zelenou a modrou složku. To by činilo 917 700 čísel nebo ca. 917 kb. V důsledku komprese JPEG se výsledný soubor zmenšil více než 10krát!

Ve skutečnosti lze tento obrázek komprimovat mnohem více. Níže jsou dva obrázky vedle sebe - fotografie vpravo byla zkomprimována na 16 KB, tedy 57krát méně než nekomprimovaná verze!

Jak funguje formát JPEG

Když se podíváte pozorně, uvidíte, že tyto obrázky nejsou totožné. Oba jsou obrázky s kompresí JPEG, ale ten pravý je objemově mnohem menší. Také to vypadá trochu hůř (podívejte se na barevné čtverečky pozadí). Proto se JPEG také nazývá ztrátová komprese; během procesu komprese se obraz změní a ztratí některé detaily.

1. Podvzorkování barev

Zde je obrázek s aplikovanou pouze první úrovní komprese.

Jak funguje formát JPEG
(Interaktivní verze v originál články). Odstranění jednoho čísla zničí všechny barvy. Pokud je však odstraněno právě šest čísel, nemá to na obrázek žádný nebo malý vliv.

Nyní jsou čísla o něco snazší dešifrovat. To je skoro jednoduchý seznam barev, každý byte se změní přesně o jeden pixel, ale to už je poloviční velikost nekomprimovaného obrázku (což by v takto zmenšené velikosti zabralo cca 300 KB). Hádej proč?

Můžete vidět, že tato čísla nepředstavují standardní červenou, zelenou a modrou složku, protože pokud všechna čísla nahradíme nulami, dostaneme zelený obrázek (nikoli bílý).

Jak funguje formát JPEG

Je to proto, že tyto bajty znamenají Y (jas),

Jak funguje formát JPEG

Cb (relativní modrá),

Jak funguje formát JPEG

a obrázky Cr (relativní zarudnutí).

Jak funguje formát JPEG

Proč nepoužít RGB? Ostatně takto funguje většina moderních obrazovek. Váš monitor může zobrazit libovolnou barvu, včetně červené, zelené a modré, s různou intenzitou pro každý pixel. Bílá se získá zapnutím všech tří na plný jas a černá je vypne.

Jak funguje formát JPEG

Je to také velmi podobné tomu, jak funguje lidské oko. Barevné receptory v našich očích se nazývají "šišky“, a jsou rozděleny do tří typů, z nichž každý je citlivější buď na červenou, nebo zelenou nebo modrou barvu [Čípky typu S jsou citlivé na fialovo-modrou (S z angl. Short - krátkovlnné spektrum), M-typ - v zeleno-žluté (M z angl. Medium - medium wave), a L-type - ve žluto-červené (L z angl. Long - long-wave) části spektra. Přítomnost těchto tří typů čípků (a tyčinek citlivých ve smaragdově zelené části spektra) dává člověku barevné vidění. / Cca. překlad]. Tyčinky, druhý typ fotoreceptoru v našich očích, je schopen detekovat změny jasu, ale je mnohem citlivější na barvu. Naše oči mají asi 120 milionů tyčinek a pouze 6 milionů čípků.

Naše oči proto mnohem lépe zaznamenají změny jasu než změny barvy. Pokud oddělíte barvu od jasu, můžete ubrat trochu barvy a nikdo si ničeho nevšimne. Chroma subsampling je proces reprezentace barevných složek obrazu s nižším rozlišením než složky jasu. Ve výše uvedeném příkladu má každý pixel přesně jednu složku Y a každá jednotlivá skupina čtyř pixelů má přesně jednu složku Cb a jednu Cr. Obrázek tedy obsahuje čtyřikrát méně barevných informací než originál.

Barevný prostor YCbCr se nepoužívá pouze v JPEGech. Původně byl vynalezen v roce 1938 pro televizní pořady. Ne každý má barevný televizor, takže oddělení barev a jasu umožnilo všem získat stejný signál a televizory bez barev pouze využívaly pouze složku jasu.

Odstraněním jednoho čísla z editoru se proto úplně zničí všechny barvy. Komponenty jsou uloženy ve tvaru YYYY Cb Cr (ve skutečnosti ne nutně v tomto pořadí - pořadí uložení je uvedeno v záhlaví souboru). Odstranění prvního čísla způsobí, že první hodnota Cb bude vnímána jako Y, Cr jako Cb a obecně dojde k dominovému efektu, který změní všechny barvy obrázku.

Specifikace JPEG nevyžaduje, abyste používali YCbCr. Ale většina souborů jej používá, protože poskytuje lepší kvalitu obrázků po převzorkování ve srovnání s RGB. Ale nemusíte mě brát za slovo. Podívejte se sami v tabulce níže, jak by vypadalo podvzorkování každé jednotlivé složky v RGB i YCbCr.

Jak funguje formát JPEG
(Interaktivní verze v originál články).

Odstranění modré není tak nápadné jako červené nebo zelené. To kvůli šesti milionům čípků ve vašich očích je asi 64 % citlivých na červenou, 32 % na zelenou a 2 % na modrou.

Nejlépe je vidět dílčí vzorkování složky Y (vlevo dole). I malá změna je patrná.

Převod obrázku z RGB na YCbCr nezmenšuje velikost souboru, ale usnadňuje nalezení méně nápadných detailů, které lze odstranit. Ve druhém stupni dochází ke ztrátové kompresi. Je založen na myšlence prezentace dat ve více komprimovatelné podobě.

2. Diskrétní kosinusová transformace a diskretizace

Tato úroveň komprese z větší části definuje podstatu JPEG. Po převodu barev na YCbCr se komponenty komprimují jednotlivě, takže se od této chvíle můžeme soustředit pouze na složku Y. A zde je, jak vypadají bajty složky Y po aplikaci této úrovně.

Jak funguje formát JPEG
(Interaktivní verze v originál články). V interaktivní verzi se kliknutím na pixel posune editor na řádek, který jej představuje. Zkuste odstranit čísla od konce nebo k určitému číslu přidat pár nul.

Na první pohled to vypadá na velmi špatnou kompresi. Na obrázku je 100 000 pixelů a k označení jejich jasu (složek Y) je potřeba 102 400 čísel – to je horší než nekomprimovat vůbec nic!

Všimněte si však, že většina těchto čísel je nula. Všechny tyto nuly na konci řádků lze navíc odstranit beze změny obrazu. Zbývá asi 26 000 čísel, což je téměř 4x méně!

Tato úroveň obsahuje tajemství šachových vzorů. Na rozdíl od jiných efektů, které jsme viděli, vzhled těchto vzorů není závada. Jsou stavebními kameny celého obrazu. Každý řádek editoru obsahuje přesně 64 čísel, koeficienty diskrétní kosinové transformace (DCT) odpovídajících intenzitám 64 jedinečných vzorů.

Tyto vzory jsou tvořeny na základě kosinusového grafu. Zde je návod, jak některé z nich vypadají:

Jak funguje formát JPEG
8 z 64 kurzů

Níže je obrázek zobrazující všech 64 vzorů.

Jak funguje formát JPEG
(Interaktivní verze v originál články).

Tyto vzory jsou zvláště důležité, protože tvoří základ obrázků 8x8. Pokud nejste obeznámeni s lineární algebrou, pak to znamená, že z těchto 8 vzorů lze získat jakýkoli obrázek 8x64. DCT je proces rozdělení obrázků na bloky 8x8 a převod každého bloku na kombinaci těchto 64 koeficientů.

Skutečnost, že jakýkoli obrázek může být složen z 64 konkrétních vzorů, působí jako kouzlo. To je však totéž, jako bychom řekli, že jakékoli místo na Zemi lze popsat dvěma čísly - zeměpisnou šířkou a délkou [udává polokoule / cca. překlad]. Často uvažujeme o povrchu Země jako o dvourozměrném, takže nám stačí dvě čísla. Obrázek 8x8 má 64 rozměrů, potřebujeme tedy 64 čísel.

Zatím není jasné, jak nám to pomáhá z hlediska komprese. Pokud potřebujeme 64 čísel k reprezentaci obrázku 8x8, proč by to bylo lepší než pouhé uložení 64 jasových složek? Děláme to ze stejného důvodu, proč jsme změnili tři čísla RGB na tři čísla YCbCr: umožňuje nám to odstranit jemné detaily.

Je těžké přesně vidět, jaké detaily jsou v této fázi odstraněny, protože JPEG aplikuje DCT na bloky 8x8. Nikdo nám však nezakazuje aplikovat to na celý obraz. Zde je návod, jak vypadá DCT pro komponent Y, když je aplikován na celý obrázek:

Jak funguje formát JPEG

Více než 60 000 čísel lze odstranit od konce prakticky bez znatelných změn na fotografii.

Jak funguje formát JPEG

Všimněte si však, že pokud vynulujeme prvních pět čísel, rozdíl bude zřejmý.

Jak funguje formát JPEG

Čísla na začátku představují změny nízké frekvence v obraze a naše oči je zachycují nejlépe. Čísla ke konci označují změny ve vysokých frekvencích, které jsou hůře postřehnutelné. Abychom „viděli, co oko nevidí“, můžeme tyto vysokofrekvenční detaily izolovat vynulováním prvních 5000 čísel.

Jak funguje formát JPEG

Vidíme všechny oblasti obrázku, kde dochází k největší změně pixel od pixelu. Vyniknou oči kočky, jeho vousy, froté deka a stíny v levém dolním rohu. Můžete jít dále vynulováním prvních 10 000 čísel:

Jak funguje formát JPEG

20 000 XNUMX:

Jak funguje formát JPEG

40 000 XNUMX:

Jak funguje formát JPEG

60 000 XNUMX:

Jak funguje formát JPEG

Tyto vysokofrekvenční detaily jsou odstraněny JPEG během fáze komprese. Převod barev na koeficienty DCT je bezeztrátový. Ztráty se tvoří v kroku vzorkování, kde jsou odstraněny hodnoty vysoké frekvence nebo blízké nule. Když snížíte kvalitu ukládání JPEG, program zvýší práh pro počet hodnot, které mají být odstraněny, čímž se zmenší velikost souboru, ale obrázek bude více pixelový. Takže obrázek v první sekci, který byl 57krát menší, vypadal takto. Každý blok 8x8 představoval mnohem menší počet DCT koeficientů ve srovnání s kvalitnější verzí.

Můžete dělat něco tak skvělého, jako je postupné streamování obrázků. Můžete zobrazit rozmazaný obrázek, který se při stahování více koeficientů stává stále podrobnějším.

Zde jen pro zajímavost, co se stane při použití pouze 24 000 čísel:

Jak funguje formát JPEG

Nebo jen 5000:

Jak funguje formát JPEG

Velmi rozmazané, ale rozpoznatelné!

3. Kódování délek běhů, delta a Huffman

Doposud byly všechny stupně komprese ztrátové. Poslední etapa se naopak obejde beze ztrát. Neodstraňuje informace, ale výrazně snižuje velikost souboru.

Jak můžete něco komprimovat, aniž byste zahodili informace? Představte si, jak bychom popsali jednoduchý černý obdélník 700 x 437.

JPEG k tomu používá 5000 čísel, ale lze dosáhnout mnohem lepších výsledků. Dokážete si představit kódovací schéma, které takový obrázek popisuje na co nejmenší počet bajtů?

Minimální schéma, které jsem mohl vymyslet, používá čtyři: tři pro barvu a čtvrté pro počet pixelů, které má barva. Myšlenka reprezentace opakovaných hodnot takto komprimovaným způsobem se nazývá run-length kódování. Je bezeztrátový, protože můžeme obnovit zakódovaná data v jejich původní podobě.

Velikost souboru JPEG s černým obdélníkem je mnohem větší než 4 bajty – nezapomeňte, že na úrovni DCT se komprese aplikuje na bloky 8x8 pixelů. Proto minimálně potřebujeme jeden koeficient DCT na každých 64 pixelů. Potřebujeme jeden, protože místo ukládání jediného koeficientu DCT následovaného 63 nulami nám kódování délky běhu umožňuje uložit jediné číslo a označovat „všechny ostatní jsou nuly“.

Delta kódování je technika, kdy každý bajt obsahuje spíše rozdíl od nějaké hodnoty než absolutní hodnotu. Úpravou určitých bajtů se tedy změní barva všech ostatních pixelů. Například místo uložení

12 13 14 14 14 13 13 14

Mohli bychom začít s 12 a pak jen napsat, kolik přidat nebo odečíst, abychom dostali další číslo. A tato sekvence v delta kódování má podobu:

12 1 1 0 0 -1 0 1

Převedená data nejsou menší než původní data, ale je jednodušší je komprimovat. Použití delta kódování před run-length kódováním může hodně pomoci a přitom stále zůstává bezeztrátovou kompresí.

Delta kódování je jednou z mála technik používaných mimo bloky 8x8. Ze 64 DCT koeficientů je jeden jednoduše konstantní vlnová funkce (plná barva). Představuje průměrný jas každého bloku pro jasové složky nebo průměrnou modrost pro Cb složky a tak dále. První hodnota každého bloku DCT se nazývá hodnota DC a každá hodnota DC je zakódována delta vzhledem k předchozím. Změna jasu prvního bloku tedy ovlivní všechny bloky.

Poslední záhadou zůstává: jak změna jednotného čísla zcela zkazí celý obrázek? Dosud úrovně komprese takové vlastnosti neměly. Odpověď leží v hlavičce JPEG. Prvních 500 bajtů obsahuje metadata o obrázku – šířku, výšku atd. a zatím jsme s nimi nepracovali.

Bez hlavičky je téměř nemožné (dobře, velmi obtížné) dekódovat JPEG. Bude to vypadat, že se vám snažím popsat obrázek a začínám vymýšlet slova, jak vyjádřit svůj dojem. Popis bude pravděpodobně velmi stručný, jelikož dokážu vymyslet slova přesně s významem, který chci sdělit, ale pro ostatní nebudou dávat smysl.

Zní to hloupě, ale přesně to se stává. Každý obrázek JPEG je komprimován pomocí kódů, které jsou pro něj specifické. Slovník kódů je uložen v záhlaví. Tato technika se nazývá "Huffmanův kód" a slovník se nazývá Huffmanova tabulka. V záhlaví je tabulka označena dvěma bajty - 255 a poté 196. Každá barevná složka může mít svou tabulku.

Změny tabulky drasticky ovlivní jakýkoli obrázek. Dobrým příkladem je změna 15 na 1 na 12. řádku.

Jak funguje formát JPEG

Tabulky totiž určují, jak se mají jednotlivé bity číst. Dosud jsme pracovali pouze s binárními čísly v desítkovém tvaru. Tím se nám ale skrývá skutečnost, že pokud chcete uložit číslo 1 do bajtu, bude to vypadat jako 00000001, protože každý bajt musí mít přesně osm bitů, i když je potřeba jen jeden z nich.

To je potenciálně velké plýtvání místem, pokud máte hodně malých čísel. Huffmanův kód je technika, která nám umožňuje zmírnit požadavek, že každé číslo musí zabírat osm bitů. To znamená, že pokud vidíte dva bajty:

234 115

Potom, v závislosti na Huffmanově tabulce, to mohou být tři čísla. Chcete-li je extrahovat, musíte je nejprve rozdělit na jednotlivé bity:

11101010 01110011

Pak se otočíme ke stolu, abychom pochopili, jak je seskupit. Může to být například prvních šest bitů (111010) nebo 58 v desítkové soustavě, následovaných pěti bity (10011) nebo 19 a nakonec posledními čtyřmi bity (0011) nebo 3.

Proto je velmi obtížné porozumět bajtům v této fázi komprese. Byty nepředstavují to, co se zdají. Nebudu se v tomto článku rozepisovat do detailů práce s tabulkou, ale materiály na toto téma online je dostačující.

Jedním ze skvělých triků, které můžete s těmito znalostmi udělat, je oddělit záhlaví od JPEG a uložit jej samostatně. Ve skutečnosti se ukázalo, že soubor můžete číst pouze vy. Facebook to dělá, aby dále redukoval soubory.

Co jiného lze udělat, je docela změnit Huffmanův stůl. Pro ostatní to bude vypadat jako zkažený obrázek. A jen vy budete znát magickou možnost, jak to opravit.

Abych to shrnul: co je tedy potřeba k dekódování JPEG? Nezbytné:

  1. Extrahujte Huffmanovy tabulky z hlavičky a dekódujte bity.
  2. Extrahujte diskrétní kosinové transformační koeficienty pro každou barevnou a jasovou složku pro každý blok 8x8 inverzní transformací run-length kódování a delta.
  3. Kombinujte kosiny na základě koeficientů, abyste získali hodnoty pixelů pro každý blok 8x8.
  4. Měřte barevné složky, pokud bylo provedeno dílčí vzorkování (tato informace je v záhlaví).
  5. Převeďte výsledné hodnoty YCbCr pro každý pixel na RGB.
  6. Přeneste obrázek na obrazovku!

Vážná práce pro pouhé prohlížení fotografie s kočkou! Líbí se mi na něm však to, že ukazuje, jak je technologie JPEG zaměřená na člověka. Vychází z rysů našeho vnímání, což nám umožňuje dosáhnout mnohem lepší komprese než konvenční technologie. A nyní, když rozumíte tomu, jak JPEG funguje, si dokážete představit, jak lze tyto technologie přenést do jiných oblastí. Například delta kódování ve videu může vést k výraznému zmenšení velikosti souboru, protože často existují celé oblasti, které se snímek od snímku nemění (například pozadí).

Kód použitý v článku, je otevřená a obsahuje pokyny pro nahrazení obrázků svými vlastními.

Zdroj: www.habr.com

Přidat komentář