5. Vliv komprese na uložené informace

V minulé kapitole jsme si vyzkoušeli, jak pomocí nepatrných změn v barvách pixelů můžeme do obrázku uložit nějakou schovanou informaci. A v téhle kapitole si ukážeme, jaký to má háček a jak to souvisí s takzvanou kompresí obrázků.

Úvod tématu
4. Schování zprávy do obrázku
Kvíz

Co je to vlastně komprese dat?

V kapitole 2 jsme si říkali o tom, jak se na počítači obrázky ukládají v podobě tří čísel (kolik červené, kolik zelené a kolik modré složky smíchat) pro každý pixel.

To znamená, že pokud si vezmeme obrázek o rozměrech třeba 1920 × 1080 pixelů (to je takzvaná Full HD kvalita), což je dnes běžná velikost počítačové obrazovky, potřebujeme na jeho uložení 1920 × 1080 × 3 čísel. Na uložení čísla od 0 do 255 je v počítači potřeba jeden bajt, takže dohromady by nám takový obrázek zabral 1920 × 1080 × 3 = 6220800 bajtů, čili asi šest megabajtů.
A teď si ještě představte, že bychom si chtěli místo jednoho obrázku uložit video, ve kterém se střídá třeba 30 obrázků za sekundu. A že bychom toho videa chtěli třeba dvě hodiny, což je délka jednoho filmu. V takovém případě bychom museli uložit celkem 1920 (pixelů na šířku) × 1080 (pixelů na výšku) × 3 (základní barvy) × 30 (obrázků každou sekundu) × 60 (sekund v každé minutě) × 60 (minut v každé hodině) × 2 (hodiny) = 1343692800000 bajtů. To by bylo víc než jeden terabajt dat na uložení jediného dvouhodinového filmu.

Tak velké počítačové disky dnes sice existují, ale nikdo by nechtěl zaplnit celý svůj disk pouhým jedním filmem. A navíc jsou zatím tak velké disky jenom v počítačích — kdybyste si třeba takhle chtěli natočit dvouhodinové video z dovolené na svůj telefon, takovýmhle způsobem by se vám do telefonu rozhodně nevešlo.

A tady přichází ke slovu komprese dat — dalo by se to přeložit třeba jako „zmáčknutí“. Představte si třeba záběr filmu, ve kterém je zrovna celá obrazovka černá. Mohli bychom to sice uložit poctivě jako šest milionů nul za sebou: „0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …“, ale taky bychom to mohli zmáčknout, zestručnit a říct něco jako „1920 × 1080 trojic nul“.

A když se třeba v následujícím snímku objeví jednopixelová šedá tečka? Poctivě bychom to opět museli uložit jako něco ve stylu „0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …“. Ale taky můžeme doufat, že divák by si jedné malé tečky nevšimnul, a tak můžeme znova říct „1920 × 1080 trojic nul“. To teď sice není úplně pravda, protože jsme při tom v zájmu stručnosti vynechali tu malou šedou tečku, ale v rychle běžícím filmu to třeba nevadí a divák si ničeho nevšimne.


Kde se s kompresí obrázků setkáváme?

S takovýmhle zmáčknutím obrázků a videa se potkáváme na každém kroku. Pokaždé, když vidíme nějaký obrázek uložený ve formátu JPEG (anglicky se čte „džejpeg“), čili s příponou „.jpg“, jedná se o obrázek, který je nějakým podobným způsobem komprimovaný, aby na disku nebo třeba paměťové kartě nezabíral tolik místa. V tomhle formátu například běžné telefony a foťáky ukládají pořízené fotky, aby se jich tam vešlo hodně.

U videa to funguje podobně a jsou používané ještě další chytré triky, jak zařídit, aby se celý film vešel třeba jen na jedno DVD.


Na co se komprese obrázků nehodí? A proč?

Problém JPEG komprese je v tom, že je takzvaně „ztrátová“ — část informace se nám při uložení obrázku ztratí, podobně, jako jsme v tom příkladu před chvílí vynechali tu informaci o té malé šedé tečce. JPEG soubory jsou plné zkratek ve stylu „celý tenhle kousek obrázku je tímhle odstínem zelené (i když to tak docela není pravda)“, jen aby nebylo potřeba poctivě popisovat každý pixel samostatně a zabírat popisem všech těch odstínů spoustu místa na disku.

To nám může snadno projít třeba u realistických fotografií, kde se malé nepřesnosti v odstínech poznávají těžko. Pokud bychom ale zkusili ve formátu JPEG uložit nějaký jednoduchý, přehledný obrázek — jako třeba tabulku, graf, kreslený vtip nebo jiný obrázek obsahující jasně ohraničené tvary, čáry a písmena — výsledkem bude znatelně nekvalitní uložení.

Můžeme si to předvést na malém příkladu: uhodneš, na které zvětšené ukázce je obrázek uložený ve ztrátovém formátu JPEG, a na které v jiném formátu, bez ztrát? (K prohlédnutí si možná budeš potřebovat obrázky rozkliknout do plné velikosti.)

Když se podíváme pozorně, u druhého obrázku si jasně všimneme nějakých šmouh, které kolem těch písmen nemají být.

„Přesný důvod toho, proč jsou u JPEG obrázku šmouhy navíc, místo toho, aby tam něco na první pohled chybělo, souvisí se spoooustou složité matematiky. Nevím, jak tebe, ale mě docela unavilo už jen to násobení o pár odstavců výš, takže řešení téhle záhady prozatím vynechám.“

Proto taky není dobrý nápad ukládat jako JPEG úplně všechny obrázky — některé si zkrátka zaslouží nějaký lepší formát, i když za to zaplatíme tím, že nám budou zabírat víc místa na disku. Například většina obrázků v celém tomhle povídání je v jiném, bezztrátovém formátu PNG. V tom samém formátu byly uložené taky všechny obrázky, se kterými jsme si hráli v minulé kapitole.

„Dovedeš si představit, jaký by to byl trapas, kdybychom v povídání o obrázcích a přesných barvách pixelů používali obrázky s nějakými záhadnými šmouhami navíc?“

A co udělá ztrátová komprese s ukrytými obrázky?

Na samotný závěr si teď můžeme vyzkoušet, co se stane, když vezmeme nějaký obrázek s ukrytou zprávou a neuložíme ho jako bezztrátové PNG, ale pomocí ztrátové JPEG komprese.

Spusť si tedy znovu ImageJ a otevři si v něm obrázek „Vincent+DruhaKocka.png“. Pokud sis s obrázky hrál(a) v minulé kapitole, tak už víš, že je v téhle fotce schovaný tygr. Zkusme si ale fotku uložit ve fromátu JPEG:

Bez popisku

Jako název vyber třeba něco jako „Vincent+DruhaKocka-komprimovane.jpg“.

Pak v ImageJ okno s obrázkem zavři (to je důležité, jinak bychom pracovali pořád s tím bezztrátovým originálem ve formátu PNG), a otevři ten nově vytvořený JPEG soubor „Vincent+DruhaKocka-komprimovane.jpg“.

Co se teď stane, když použijeme příkaz „Plugins/Mjuni/Display Odd Pixels“?

Bez popisku

Vidíme, že schovaný obrázek tygra byl JPEG kompresí úplně zničený — komprese totiž v zájmu šetření dat některé barvy pixelů zaokrouhlovala, některé zjednodušeně prohlásila za stejné jako sousední, a vůbec se při tom neohlížela na naše pracně nastavené sudé a liché hodnoty, které měly zakódovat toho tygra.

Můžeme si ještě to samé zkusit třeba s obrázkem „Vlajka+Pismeno.png“: uložíme ho ve formátu JPEG jako „Vlajka+Pismeno-komprimovane.jpg“, zavřeme to původní okno, otevřeme ten nově vytvořený soubor a dáme „Plugins/Mjuni/Display Odd Pixels“:

Bez popisku

Vidíme, že část z toho schovaného písmene E přežila i tu kompresi. To proto, že jak ten hlavní, tak ten schovávaný obrázek byly složené z jednoduchých, jednobarevných ploch, kde komprese nenadělá tolik změn. I přesto ale vidíme, že se výsledek hodně liší od toho krásného E, které jsme si vytáhli z původního obrázku ve formátu PNG.

Teď už tedy víme nejen to, jak se do obrázku dají schovat nějaké tajné zprávy, ale taky to, že když na obrázek použijeme ztrátovou kompresi jako JPEG, nějaká část uložených dat — ať už samotného obrázku, nebo čehokoliv schovaného uvnitř — se nám ztratí. Proto třeba profesionální fotografové nebo grafici neradi používají JPEG, aby jejich obrázky neztrácely kvalitu.

Používáte starou verzi internetového prohlížeče. Doporučujeme aktualizovat Váš prohlížeč na nejnovější verzi.

Další info