Přípona souboru | .jp2, .j2k, .jpf, .jpx, .jpm, .mj2 |
---|---|
Typ internetového média | image/jp2, image/jpx, image/jpm, video/mj2 |
Uniform Type Identifier | public.jpeg-2000 |
Tvůrce | Joint Photographic Experts Group |
Standard(y) | ISO/IEC 15444 |
Otevřený formát | ? |
JPEG 2000 je standard pro kompresi obrazu založený na vlnkové transformaci. Umožňuje použít ztrátovou i bezeztrátovou kompresní metodu. Při stejném kompresním poměru poskytuje lepší kvalitu než starší standard JPEG. Naopak při použití bezeztrátové metody dosahuje většinou lepšího kompresního poměru formát PNG.
U ztrátové komprese lze při kompresi specifikovat jednu či více kvalit (v závislosti na použitém kodéru, např. zadáním cílových hodnot PSNR), nebo přesně zadat jeden či více datových toků (případně kompresních poměrů, v závislosti na kodéru). Vytvořený codestream je pak hierarchicky rozdělen do několika vrstev s postupně se zvyšující kvalitou / datovým tokem. To je zásadní rozdíl proti předcházející metodě JPEG, ve které nelze předem (bez provedení komprese) přesně datový tok určit, ani nelze do jednoho toku uložit obraz ve více kvalitách.
Předzpracování sestává z převodu barevného modelu a případného rozřezání obrázku na dlaždice.
Pro ztrátový mód komprese se nejprve provede tzv. ICT (Irreversible Component Transform), tj. převod z RGB na YCbCr (jas a dvě barvonosné složky),[1]
nebo pro případ bezeztrátové komprese RCT (Reversible Component Transform)
RCT lze provést pouze s celočíselnou aritmetikou. Po převodu se každá složka komprimuje samostatně. Obraz je rozřezán na pravidelné dlaždice libovolné velikosti. Všechny dlaždice mají stejnou velikost (kromě okrajů). Lze vzít celý obraz jako jednu dlaždici. Pak nedochází ke vzniku blokových artefaktů. Pokud mají některé komponenty menší rozlišení, dlaždice jsou rozděleny na stejných místech jako ty s vyšším rozlišením).
Následuje komprese každé dlaždice odděleně. K tomu se použije diskrétní vlnková transformace s biortogonálními spline vlnkami 9/7 (v aritmetice s pohyblivou řádovou čárkou) nebo s biortogonálními spline vlnkami 5/3 (v celočíselné aritmetice, v případě bezeztrátové komprese).
Diskrétní vlnkovou transformací je obraz reprezentován v několika rozlišeních (tzv. pyramida rozlišení). To dává kodéru možnost organizovat codestream takovým způsobem, že se na straně příjemce postupně zvyšuje rozlišení dekódovatelného obrazu. Reprezentace přitom není redundantní. Každé vyšší rozlišení se složí ze čtyřech podpásem předcházejícího rozlišení. Kvantizace jednotlivých podpásem – reálné koeficienty (v pohyblivé řádové čárce) se kvantizují na celá čísla pomocí uniformní kvantizace, krok kvantizace lze volit zvlášť pro každé podpásmo (a tím též řídit granularitu přírůstku kvality). Pro bezeztrátový režim komprese kvantizace odpadá.
Po kvantizaci je každé podpásmo rozděleno na nepřekrývající se oblasti (precint), které později odpovídají paketům. Jsou voleny tak, aby napříč podpásmy tvořily bloky v originálním obrazu. Ty jsou dále rozděleny na bloky kódovaní (code-block) stejné velikosti (kromě bloků na kraji obrazu). Všechny bity všech koeficientů v bloku jsou pak kódovány algoritmem EBCOT.
EBCOT (Embedded Bitplane Coding with Optimal Truncation) je algoritmus pro kódování koeficientů v bloku v pořadí od nejvýznamnějšího po nejméně významný bit.
Bit je významný, pokud v této nebo v předchozích bitových rovinách v něm byla 1.
Znaménko se kóduje společně s prvním bitem.
Takto získané bity se kódují binárním kontextovým aritmetickým kodérem, tzv. MQ kodérem. Kontext kódovaného bitu je tvořen stavem jeho 8 sousedů (okno 3×3 bity). Výsledný proud bitů je rozdělen na pakety.
Paket má hlavičku, kde jsou informace o obsažených blocích: počet nulových a obsazených bitových rovin, zdali blok vůbec obsahuje data a další.
Pomocí vypouštění méně důležitých paketů se řídí kvalita, při bezeztrátové kompresi se žádný paket vypustit nesmí. To je zásadní rozdíl proti metodě JPEG, ve které je kvalita pevně svázána s kompresí. Pro změnu kvality je u JPEGu třeba celý obraz znovu zkomprimovat. U JPEG 2000 rekomprese nutná není, dochází pouze k reorganizaci codestreamu, což není výpočetně náročné.
Pakety ze všech podpásem jsou složeny do tzv. vrstev. Způsob, jakým jsou však bloky děleny do paketů, není ve standardu definován a je to na kodéru, stejně tak pořadí paketů ve vrstvě. Jednou z možností organizace codestreamu je ta, že data budou řazena tak, aby se s přibývajícími vrstvami kvalita obrazu rovnoměrně zvyšovala. Další možností je postupné zvyšování rozlišení, nebo sekvenční přenos (jako je to běžné u metody JPEG).
Standard však nedefinuje způsob, jak najít optimální délku paketu pro všechny bloky. Kompresor se snaží se minimalizovat celkové zkreslení při dané velikost výsledných dat či kvalitě a musí tedy nějak rozhodnout, kde v paketech „odseknout“ již méně významné bity.
Jeden z možných algoritmů na kompresi:
Výsledný codestream může být uložen přímo do souboru (přípona .jpc). Běžnější je ale jeho obalení do kontejneru JP2 (přípona .jp2), který k němu umožňuje přilepit metadata.
Pro střední stupeň komprese poskytuje JPEG 2000 asi o 20 % lepší kompresi než JPEG, pro nízké nebo vysoké stupně komprese může být zlepšení ještě větší. Vhodné pro JPEG 2000 jsou velké snímky, nebo snímky s málo kontrastními okraji (například lékařské snímky). Kodér JPEG 2000 má oproti JPEG vyšší paměťovou i časovou náročnost. Na rozdíl od JPEG se neprojevují artefakty vzniklé dělením do bloků 8×8 pixelů, ale pokud se použije dělení obrazu do dlaždic, bude zde vidět nespojitost. Často se využívá podvzorkování barvonosných složek (chroma subsampling), kdy mají barvonosné komponenty poloviční rozlišení, neboť lidské oko je více citlivé na jas, než barvu. Pokud se barvy v obrázku příliš rychle střídají, budou vypadat mdle.
JPEG 2000 (stejně jako JPEG) osciluje ve spektrální doméně (algoritmus se snaží na ostrou hranu napasovat vlnovou funkci), což znamená, že kolem ostrých hran i zde budou viditelné artefakty. Obrazy s vysokým poměrem komprese jsou rozmazanější než originál (neboť ztrátovost komprese se projeví nejvíce u vysokofrekvenční složky).
název knihovny | programovací jazyk | licence |
---|---|---|
OpenJPEG[2] | C | BSD |
JasPer[3] | C | JasPer License[4] |
JJ2000[5] | Java | LGPL |
FFmpeg | C | LGPL |