Knižnica script súborov pod označením "JPEGtool" je určená pre programové prostredia Octave, Matlab a slúži k štúdiu procesu kompresie obrazu v štandarde JPEG, založenom na využití vlastností DCT (Diskrétna kosínusová transformácia). Knižnica script súborov umožňuje krok za krokom sledovať proces spracovávania (kompresie) obrazu v štandarde JPEG. Môžeme experimentovať s veľkosťou blokov pre transformáciu, použiť vlastnú kvantizačnú maticu, vyhladzovaciu schému popísanú Pennebakerom a Mitchellom pre potlačenie tzv. "štvorčekového efektu" (blocking artifact) a mnoho ďalších funkcií.
Kolekcia script súborov "JPEGtool" je voľne šírená v rámci GNU General Public License.
Knižnicu "JPEGtool" a dokumentáciu v pdf formáte je možné získať na domovskej stránke
http://www.dms.auburn.edu/compression/Takže, pokiaľ chcete začať, stiahnite si prosím nasledovné súbory:
- jpegtool.tar.gz (gzip), jpegtool.tar.Z (Unix compress), jpegtool.zip (Info-ZIP), and jpegtool.sit.hqx (binhexed for Mac). Vyber si tebou používaný kompresný formát.
- JPEGtool User's Guide: jpegtool.pdf, alebo ako PostScript jpegtool.ps.gz (compressed with gzip)
- The Linux Journal article Transform Methods and Image Compression (January 1999, pages 18-24): tmic.pdf alebo tmic.ps.gz.
Inštalácia
Inštalácia je veľmi jednoduchá. Stačí rozbaliť script súbory do ľubovolného adresára, zadať Matlabu cestu do tohto adresára a je to. Môžeme začat pracovať. Na začiatok treba spomenúť, že program pracuje s obrázkami v odtieňoch šedi (grayscale), kde 1 pixel reprezentuje hodnota v rozsahu 0-255 (úrovne šedi). S obrázkami potom prirodzene pracujeme ako s maticou MxN. Knižnica umožňuje pracovať s externými grafickými súbormi vo formáte PGM (portable graymap format). Konverziu rôznych grafických formátov do formátu PGM umožňuje veľké množstvo voľne šírených programov. S knižnicou sú dodávané obľúbených testovacích obrázky (lena, mandrill,...) vo formáte PGM s ktorými môžete začať ihneď pracovať.
Zopár príkladov práce s knižnicou JPEGtool
Ako iste viete, JPEG spracováva obraz po blokoch 8x8 pixelov. Najprv sa na bloku 8x8 vykoná DCT, takto získané koeficienty sa následne vydelia príslušnými prvkami kvantizačnej matice a zaokrúhlia na celé číslo. Veľké množstvo koeficientov odpovedajúcich vyšším frekvenciám (popisujú jemné detaily) je po kvantizácii nulových. Väčšina vizuálne najdôležitejších informácií je potom koncentrovaná v malom počte kosínusových funkcií nízkych frekvencií. Pokiaľ chceme takto upravené (komprimované) obrazové dáta opäť zobraziť musíme použiť inverzný postup, teda koeficienty dekvantizovať a previesť IDCT (inverzná diskrétna kosínusová transformácia). Maticové operácie možeme zobraziť nasledovne:Vyššie popísaný postup si ukážeme na bloku dát 8x8. Do Octave alebo Matlabu zapíšeme nasledovné príkazy:
>x=round(rand(8)*100); % generuj maticu 8x8 náhodných čísel v rozsahu [0,100] >Tx=dct(x); % vykonaj DCT >QTx=quant(Tx); % kvantizácia koeficientov po DCT >Ty=dequant(QTx); % dekvantizácia >y=invdct(Ty); % inverzná DCT >imagesc(y); % zobraz výsledokV mojom prípade Matlab vygeneroval nasledovnú maticu náhodných čísel. x = 97 13 56 57 60 6 77 2 36 94 32 12 95 26 67 82 5 70 37 52 29 100 13 62 76 85 87 12 89 21 10 56 89 21 37 77 10 50 1 24 29 46 7 38 7 29 29 82 25 8 20 82 23 67 82 26 93 85 5 5 93 96 99 75 Koeficienty matice x po DCT. Tx = 384.5000 -0.0689 27.6603 31.2473 15.5000 -17.9695 -12.2691 -7.3536 -1.1140 41.7838 -18.6708 -31.2459 4.7646 -18.3245 -4.4001 44.7543 38.0240 -45.4237 11.6716 52.1476 -11.6006 32.3106 -54.9454 42.1842 -60.7105 21.1178 -2.6269 -23.6366 37.5449 90.0104 -0.2989 -1.0405 31.5000 69.1154 12.4084 41.4637 26.0000 22.1033 16.2375 56.2218 -15.0677 11.5608 -38.5672 -15.9607 -9.5308 42.3927 12.0432 14.0394 -11.4205 -10.8080 16.0546 0.9892 -7.1012 -12.9742 17.3284 -34.6441 -24.3865 -2.7168 -47.4212 16.9030 -6.4103 74.7339 33.0198 -64.0399 DCT koeficienty po kvantizácii štandardnou kvantizačnou maticou. QTx = 24 0 3 2 1 0 0 0 0 3 -1 -2 0 0 0 1 3 -3 1 2 0 1 -1 1 -4 1 0 -1 1 1 0 0 2 3 0 1 0 0 0 1 -1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 -1 Koeficienty po dekvantizácii. Ty = 384 0 30 32 24 0 0 0 0 36 -14 -38 0 0 0 55 42 -39 16 48 0 57 -69 56 -56 17 0 -29 51 87 0 0 36 66 0 56 0 0 0 77 -24 0 -55 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 0 -99 Koeficienty po IDCT. y = 102.3174 7.4996 57.9278 59.4468 75.1161 -9.2387 96.9114 0.1895 49.8142 60.9104 51.1926 14.6731 65.5600 25.6701 66.9971 84.6520 23.0871 68.0270 37.0273 70.7737 13.1485 86.5896 29.8868 67.7823 44.9448 79.7272 86.2678 -19.0474 117.4735 50.4652 -17.9739 39.0450 101.1292 35.0461 37.4252 81.0385 -15.2393 52.8380 17.3287 39.7800 32.5337 20.0047 22.4397 39.3822 27.2841 23.1986 14.0960 75.2781 29.6585 15.9319 -11.3322 95.2973 6.6842 72.9784 64.3820 48.3909 101.3401 80.2601 18.4307 2.0967 103.9181 85.6481 113.4366 54.4510Poznámky:
- DCT je prirodzene možné vykonať aj na väčšej matici ako je 8x8. Napr. pre maticu 32x32 je zápis:
>dct(x,32)
- Možete použiť vlastnú kvantizačnú maticu
QMAT
. Funkciu potom zavoláte nasledovne:>quant(Tx,QMAT)
Štandardná kvantizačná matica pre jasový signál je označená akostdQ.
Vyššie popísaný postup teraz zrealizujeme na reálnom obrázku, ktorý prečítame zo súboru.>x=getpgm('bird.pgm'); % nahraj z disku obrázok bird.pgm >Tx=dct(x); % vykonaj DCT >QTx=quant(Tx); % kvantizácia koeficientov po DCT >Ty=dequant(QTx); % dekvantizácia >y=invdct(Ty); % inverzná DCTTúto sekvenciu príkazov môžeme nahradiť jedným príkazom, ktorý realizuje všetky tieto kroky.
>[y,r]=jpeg(x,Q)x - matica originálnych dát (x môžeme zadať ako maticu, alebo ako meno súboru napr. 'bird.pgm')
Ďalej budeme pracovať s obrázkom bird.pgm [256x256 grayscale] a použiejeme rôzne kvantizačné matice (stdQ a 2*stdQ). Do Matlabu zapíšeme nasledovné príkazy:
Q - špecifikuje kvantizačnú maticu
y - matica reprezentujúca nový obrázok po transformácii a kvantizácii, nakoľko proces je stratový x a y sa budú líšiť
r - vracia percentuálny podiel úspory dát po kvantizácii, pomocou r môžeme posúdiť stupeň kompresie
>x=getpgm('bird.pgm'); % nahraj z disku obrázok bird.pgm >[obr1,r1]=jpeg(x,stdQ); % jpeg, výsledok do obr1 a stupeň kompresie do r1 >[obr2,r2]=jpeg(x,2*stdQ); >r1 % vypíš stupeň kompresie >r2Obrázok obr1 bol získaný použitím štandardnej kvantizačnej matice stdQ. Obrázok obr2 sme získali použitím štandardnej kvantizačnej matice, ktorej koeficienty sme zdvojnásobili a teda kvantizácia bola v porovnaní s obr1 "silnejšia". Výsledkom "silnejšej" kvantizácie je vyšší stupeň kompresie za cenu nižšej kvality výsledného obrázku. Jednoducho povedané; po "silnejšej" kvantizácii sa vynulovalo viac koeficientov.
originál obrázok bird.pgm | jpeg(x,stdQ), r=87.5076 |
jpeg(x,2*stdQ), r=92.0059 |
Použitie vyhlaďovacej metódy
JPEG spracúva obraz nezávisle po blokoch 8x8. Preto môžeme pri "silnej" kvantizácii stratiť detailné informácie medzi jednotlivými blokmi. Obrázok potom trpí tzv. "štvorčekovým efektom" (blocking artifact), kde jednotlivé bloky 8x8 na seba farebne nenadvezujú.
Kosínusová transformácia použitá v JPEG má vlastnosť, ktorá môže (nepriamo) pomôcť vyhladiť prechody medzi susednými blokmi; vždy, keď obrázok blok po bloku rekonštruujeme z komprimovanej podoby. V tomto prípade je vhodné implementovať vyhladzovaciu schému ako časť procesu rekonštrukcie.
Ďalej budeme pracovať s vyhľaďovacou schémou označovanou "back-end smoothing procedure" publikovanou Pennebakerom a Mitchellom.
JPEG dekompresor disponuje len hrubým odhadom o originálnych frekvenčných zložkách, ale má dosť dobrý odhad o priemernej hodnote úrovni šedi v danom bloku 8x8. Myšlienka vyhladenia spočíva v tom, že použijeme priemernú hodnotu úrovne šedi (jasu), ktorú reprezentuje DC-koeficient z najbližších susedných blokov na prispôsobenie hodnôt AC-koeficientov v spracúvanom bloku 8x8.
Nasledujúci obrázok ilustruje tento proces na jednom "superbloku" pozostávajúceho v strede z obrazových dát 8x8 a jeho najbližších susedov.
Usporiadanie blokov Originál a vyhladený "superblok" Teraz aplikujme vyhlaďovaciu metódu na reálny obrázok bird.pgm.
>x=getpgm('bird.pgm'); % nahraj z disku obrázok bird.pgm >Tx=dct(x); % vykonaj DCT >QTx=quant(Tx,4*stdQ); % kvantizácia koeficientov po DCT >Ty=dequant(QTx); % dekvantizácia >Tz=deblock(Ty); % vyhlaď >z=invdct(Tz); % inverzná DCT >imagesc(z); % zobraz výsledok
bird "silná" kvantizácia (4*stdQ), potom vyhladnenie Všimnite si na akom mieste pri spracovaní dát sa vykonáva vyhladenie. Je to za operáciou dekvantizácie. Z toho vyplýva, že použitie vyhladenia nemá žiadny vplyv na kompresný pomer, pretože nezasahuje do procesu DCT a kvantizácie a používa sa až na strane dekompresora.