nadpis

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:


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:

postup maticových operácií

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ýsledok


V 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.4510





Poznámky:


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á DCT

Tú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')
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

Ď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:


>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

>r2

Obrá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 Obrázok po kompresii jpeg QMAT=stdQ Obrázok po kompresii jpeg QMAT=2*stdQ
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.
    DC     smoothed
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

jpeg(x,4*stdQ) vyhladený
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.


[hlavná strana]

Dušan SOVIČ