ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα ΕΠΕΞΕΡΓΑΣΙΑ ΕΙΚΟΝΑΣ Ενότητα 8: Πρότυπο Συμπίεσης Εικόνας JPEG2000 Ιωάννης Έλληνας Τμήμα Υπολογιστικών Συστημάτων
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 2
1. Σκοποί ενότητας... 4 2. Περιεχόμενα ενότητας... 4 3. Συνοπτική θεωρία... 5 3.1 Κωδικοποιητής Jpeg2000... 5 3.2 Ανάλυση προγράμματος... 10 3.2.1 Έλεγχος εισόδου... 10 3.3 Αφαίρεση DC συνιστώσας... 10 3.4 Μετασχηματισμός DWT... 10 3.4.1 Πίνακας 8.1: Πίνακας ευρετήριο s... 11 3.5 Κβάντιση... 13 3.6 Run-Length κωδικοποίηση... 15 3.7 Διαμόρφωση δεδομένων εξόδου... 15 3.8 Αποκωδικοποιητής JPEG2000 (Αντίστροφη διαδικασία)... 16 4. Ασκήσεις... 19 4.1 1 η Άσκηση... 19 4.2 2 η Άσκηση... 19 4.3 3 η Άσκηση... 19 4.4 4 η Άσκηση... 19 4.4.1 Εικόνα 1: Αρχική εικόνα... 20 4.4.2 Εικόνα 2: Συμπιεσμένη εικόνα... 21 4.5 5 η Άσκηση... 21 4.6 6 η Άσκηση... 22 4.6.1 Εικόνα 3: Συμπιεσμένη εικόνα με μ b = 5 και ε b = 5.5... 22 4.7 7 η Άσκηση... 23 4.7.1 Εικόνα 4: Συμπιεσμένη εικόνα με άμεση κβάντιση... 23 4.8 8 η Άσκηση... 24 4.8.1 Εικόνα 5: Συμπιεσμένη εικόνα με το πρότυπο JPEG2000... 24 4.8.2 Εικόνα 6: Συμπιεσμένη εικόνα με το πρότυπο JPEG... 25 3
1. Σκοποί ενότητας Σκοπός της ενότητας είναι να περιγραφεί το πρότυπο συμπίεσης εικόνων JPEG2000 και να κληθεί ο εκπαιδευόμενος να λύσει πρακτικές ασκήσεις. 2. Περιεχόμενα ενότητας H ενότητα αυτή καλύπτει τις ακόλουθες βασικές έννοιες: Το πρότυπο συμπίεσης εικόνας JPEG2000 Σύγκριση των προτύπων συμπίεσης Με τις αντίστοιχες 8 ασκήσεις για λύση που καλύπτουν θέματα των παραπάνω εννοιών. 4
3. Συνοπτική θεωρία Όπως και στον JPEG, τα βασικά στοιχεία του κωδικοποιητή είναι: μετασχηματισμός, κβάντισξ και κωδικοποίηση εντροπίας όπως μπορούμε να δούμε στο Σχήμα 8.1. Σχήμα 8.1: Μπλοκ διάγραμμα κωδικοποιητή JPEG2000 3.1 Κωδικοποιητής Jpeg2000 function y = im2jpeg2k(x, n, q) % IM2JPEG2K Compresses an image using a JPEG 2000 approximation. % Y = IM2JPEG2K(X, N, Q) compresses image X using an N-scale JPEG % 2K wavelet transform, implicit or explicit coefficient % quantization, and Huffman symbol coding augmented by zero % run-length coding. If quantization vector Q contains two % elements, they are assumed to be implicit quantization % parameters; else, it is assumed to contain explicit subband step 5
% sizes. Y is an encoding structure containing Huffman-encoded % data and additional parameters needed by JPEG2K2IM for decoding. % % See also JPEG2K2IM. % Copyright 2002-2004 R. C. Gonzalez, R. E. Woods, & S. L. Eddins % Digital Image Processing Using MATLAB, Prentice-Hall, 2004 % $Revision: 1.5 $ $Date: 2003/10/26 18:38:13 $ global RUNS error(nargchk(3, 3, nargin)); % Check input arguments if ndims(x) ~= 2 ~isreal(x) ~isnumeric(x) ~isa(x, 'uint8') error('the input must be a UINT8 image.'); if length(q) ~= 2 & length(q) ~= 3 * n + 1 error('the quantization step size vector is bad.'); % Level shift the input and compute its wavelet transform. x = double(x) - 128; 6
[c, s] = wavefast(x, n, 'jpeg9.7'); % Quantize the wavelet coefficients. q = stepsize(n, q); sgn = sign(c); sgn(find(sgn == 0)) = 1; c = abs(c); for k = 1:n qi = 3 * k - 2; c = wavepaste('h', c, s, k, wavecopy('h', c, s, k) / q(qi)); c = wavepaste('v', c, s, k, wavecopy('v', c, s, k) / q(qi + 1)); c = wavepaste('d', c, s, k, wavecopy('d', c, s, k) / q(qi + 2)); c = wavepaste('a', c, s, k, wavecopy('a', c, s, k) / q(qi + 3)); c = floor(c); c = c.* sgn; % Run-length code zero runs of more than 10. Begin by creating % a special code for 0 runs ('zrc') and -of-code ('eoc') and % making a run-length table. zrc = min(c(:)) - 1; eoc = zrc - 1; RUNS = [65535]; % Find the run transition points: 'plus' contains the index of the % start of a zero run; the corresponding 'minus' is its + 1. z = c == 0; z = z - [0 z(1: - 1)]; plus = find(z == 1); minus = find(z == -1); 7
% Remove any terminating zero run from 'c'. if length(plus) ~= length(minus) c(plus():) = []; c = [c eoc]; % Remove all other zero runs (based on 'plus' and 'minus') from 'c'. for i = length(minus):-1:1 run = minus(i) - plus(i); if run > 10 ovrflo = floor(run / 65535); run = run - ovrflo * 65535; c = [c(1:plus(i) - 1) repmat([zrc 1], 1, ovrflo) zrc... runcode(run) c(minus(i):)]; % Huffman encode and add misc. information for decoding. y.runs y.s y.zrc y.q y.n = uint16(runs); = uint16(s(:)); = uint16(-zrc); = uint16(100 * q'); = uint16(n); y.huffman = mat2huff(c); %-------------------------------------------------------------------% function y = runcode(x) 8
% Find a zero run in the run-length table. If not found, create a % new entry in the table. Return the index of the run. global RUNS y = find(runs == x); if length(y) ~= 1 RUNS = [RUNS; x]; y = length(runs); %-------------------------------------------------------------------% function q = stepsize(n, p) % Create a subband quantization array of step sizes ordered by % decomposition (first to last) and subband (horizontal, vertical, % diagonal, and for final decomposition the approximation subband). if length(p) == 2 % Implicit Quantization q = []; qn = 2 ^ (8 - p(2) + n) * (1 + p(1) / 2 ^ 11); for k = 1:n qk = 2 ^ -k * qn; q = [q (2 * qk) (2 * qk) (4 * qk)]; q = [q qk]; else % Explicit Quantization q = p; q = round(q * 100) / 100; % Round to 1/100th place 9
if any(100 * q > 65535) error('the quantizing steps are not UINT16 representable.'); if any(q == 0) error('a quantizing step of 0 is not allowed.'); 3.2 Ανάλυση προγράμματος 3.2.1 Έλεγχος εισόδου error(nargchk(3, 3, nargin)); % Check input arguments Στην αρχή του κώδικα γίνεται έλεγχος αν το αρχείο που δίνουμε για επεξεργασία είναι στο αναγκαίο format (uint8) και αν οι τιμές για την κβάντιση είναι σωστές. Εφ όσον τα δεδομένα είναι σωστά, τότε προχωράμε στην επεξεργασία της εικόνας. 3.3 Αφαίρεση DC συνιστώσας x = double(x) - 128; Εδώ γίνεται η DC μετατόπιση, όπως έχουμε εξηγήσει στο θεωρητικό μέρος (DC level shifting). 3.4 Μετασχηματισμός DWT [c, s] = wavefast(x, n, 'jpeg9.7'); 10
Στη συνέχεια γίνεται ο μετασχηματισμός wavelet. Το jpeg9.7 σημαίνει ότι χρησιμοποιούμε το φίλτρο 9-tap/7-tap Daubechies. Όπως γνωρίζουμε ο αλγόριθμος με αυτό το φίλτρο είναι απωλεστικός οπότε και μη αναστρέψιμος. Η εντολή wavefast μετασχηματίζει με FWT (Fast wavelet transform). Ο μετασχηματισμός γίνετε Ν φορές, αναλόγως την τιμή που έχουμε δώσει στην παράμετρο n της wavefast, για να μπορέσουμε να πετύχουμε wavelet μετασχηματισμό N επιπέδων. Όλοι οι μετασχηματισμένοι συντελεστές της εικόνας βρίσκονται στην c που είναι ουσιαστικά ένας μονοδιάστατος πίνακας με την παρακάτω μορφή: c = [AN(:) HN(:) Hi(:) Vi(:) Di(:) V1(:) D1(:) ] Όπου AN είναι o πίνακας με τους συντελεστές προσέγγισης (approximation coefficients) στο Ν επίπεδο επεξεργασίας και Hi, Vi, Di είναι οι πίνακες με τους συντελεστές για την οριζόντια, την κάθετη και τη διαγώνια λεπτομέρεια αντιστοίχως για i = 1,2,,N. Για Ν επίπεδα επεξεργασίας, η μεταβλητή c περιέχει 3 Ν + 1 τομείς: ένα συντελεστή προσέγγισης και Ν ομάδες συντελεστών οριζόντιας, κάθετης και διαγώνιας λεπτομέρειας. O s είναι ένας πίνακας ευρετήριο για το πρόγραμμά μας. Μέσα από αυτόν ταξινομούνται όλοι οι συντελεστές στον c. s = [san; sdn; sdn-1; sdi; sd1; sf] Όπου san είναι οι διαστάσεις του πίνακα με τους συντελεστές λεπτομέρειας, sdn είναι οι διαστάσεις του πίνακα με την οριζόντια, κάθετη και διαγώνια λεπτομέρεια, ενώ sf είναι οι διαστάσεις της εικόνας. Παρακάτω μπορούμε να δούμε τον πίνακα s για επεξεργασία σε δύο επίπεδα: 3.4.1 Πίνακας 8.1: Πίνακας ευρετήριο s 134 134 134 134 260 260 512 512 11
Από τον πίνακα s, βλέπουμε ότι ο c περιέχει έναν πίνακα 134x134 με τους συντελεστές προσέγγισης, τρεις πίνακες 134x134 με τις λεπτομέρειες στο πρώτο επίπεδο επεξεργασίας και τέλος τρεις πίνακες με τις λεπτομέρειες για το δεύτερο επίπεδο επεξεργασίας. Με αυτές τις πληροφορίες μπορούμε να εντοπίσουμε όποιον συντελεστή θέλουμε, για παράδειγμα οι τρεις πρώτοι συντελεστές προσέγγισης έχουν τιμή: -33.6538-43.2563-24.4129 Οι τρεις πρώτοι συντελεστές οριζόντιας λεπτομέρειας στην πρώτη επεξεργασία έχουν τιμή: 40.4124-4.5394-12.3976 Οι τρεις πρώτοι συντελεστές κάθετης λεπτομέρειας στην πρώτη επεξεργασία έχουν τιμή: 66.2997 55.8117 75.7671 Οι τρεις πρώτοι συντελεστές διαγώνιας λεπτομέρειας στην πρώτη επεξεργασία έχουν τιμή: 41.1763-5.3135-11.7286 Οι τρεις πρώτοι συντελεστές οριζόντιας λεπτομέρειας στη δεύτερη επεξεργασία έχουν τιμή: 6.2363 25.7734-34.3756 12
Οι τρεις πρώτοι συντελεστές κάθετης λεπτομέρειας στη δεύτερη επεξεργασία έχουν τιμή: -7.7997 5.1652 1.5490 Οι τρεις πρώτοι συντελεστές διαγώνιας λεπτομέρειας στη δεύτερη επεξεργασία έχουν τιμή: -5.0587 4.2406-5.2333 3.5 Κβάντιση Στη συνέχεια του προγράμματος γίνεται η κβάντιση των συντελεστών. Η εντολή wavecopy αντιγράφει τους συντελεστές που υπάρχουν στον c σε έναν προσωρινό πίνακα y. Μπορούμε να αντιγράψουμε οποιονδήποτε πίνακα συντελεστών σε οποιοδήποτε επίπεδο. Για παράδειγμα η wavecopy('h', c, s, k) αντιγράφει την οριζόντια λεπτομέρεια που υπάρχει στον c, στo επίπεδο k. Η wavepaste αποθηκεύει ότι υπάρχει στον y, σε όποιον πίνακα της ορίζουμε. Ουσιαστικά η εντολή c = wavepaste('h', c, s, k, wavecopy('h', c, s, k) / q(qi)); αντιγράφει την οριζόντια λεπτομέρεια από τη μετασχηματισμένη εικόνα, την κβαντίζει και μετά την αποθηκεύει στον c. Έτσι, όταν τελειώσει η For θα έχουν κβαντιστεί όλοι οι συντελεστές σε όλες τις υποζώνες. Οι συντελεστές a b (u,v) μιας υποζώνης b κβαντίζονται με την τιμή q b (u,v) χρησιμοποιώντας τους παρακάτω τύπους που έχουμε δει και στη θεωρία: ab ( u, v) qb( u, v) sign[ ab( u, v)] floor b Οι sign και floor είναι συναρτήσεις του Matlab. Το βήμα κβάντισης Δ b είναι: 13
Rb b b b 2 1 2 11 Αν θέλουμε να μην έχουμε καθόλου απώλειες θα πρέπει να θέσουμε μ b =0 και R b =ε b έτσι ώστε Δ b =1. Για μη αναστρέψιμη συμπίεση δεν δίνουμε συγκεκριμένο βήμα κβάντισης, αλλά τον αριθμό των exponent και mantissa bits (μ b και ε b αντίστοιχα) με έναν οριζόντιο πίνακα δύο στοιχείων στην τρίτη παράμετρο της im2jpeg2000. Αυτός ο τρόπος ονομάζεται έμμεση κβάντιση. Αν δώσουμε πίνακα με τα παραπάνω στοιχεία, η συνάρτηση υποθέτει ότι χρησιμοποιούμε άμεση κβάντιση, οπότε θα πρέπει να παρέχουμε το βήμα για κάθε υποζώνη, δηλαδή 3 Ν L + 1 τιμές. Μετά την κβάντιση, οι συντελεστές που είδαμε στην προηγούμενη ενότητα έχουν την παρακάτω μορφή: Οι τρεις πρώτοι συντελεστές προσέγγισης: -186-240 -135 Οι τρεις πρώτοι συντελεστές οριζόντιας λεπτομέρειας στην πρώτη επεξεργασία: 112-12 -34 Οι τρεις πρώτοι συντελεστές κάθετης λεπτομέρειας στην πρώτη επεξεργασία έχουν τιμή: 184 155 210 Οι τρεις πρώτοι συντελεστές διαγώνιας λεπτομέρειας στην πρώτη επεξεργασία έχουν τιμή: 57-7 -16 14
Οι τρεις πρώτοι συντελεστές οριζόντιας λεπτομέρειας στη δεύτερη επεξεργασία έχουν τιμή: 8 36-48 Οι τρεις πρώτοι συντελεστές κάθετης λεπτομέρειας στη δεύτερη επεξεργασία έχουν τιμή: -10 7 2 Οι τρεις πρώτοι συντελεστές διαγώνιας λεπτομέρειας στη δεύτερη επεξεργασία έχουν τιμή: -3 2-3 3.6 Run-Length κωδικοποίηση Ο πραγματικός αλγόριθμος JPEG2000 χρησιμοποιεί αριθμητική κωδικοποίηση για την κωδικοποίηση εντροπίας. Για χάριν απλότητας το παρόν πρόγραμμα κάνει χρήση της Huffman κωδικοποίησης, όπως και στο JPEG. 3.7 Διαμόρφωση δεδομένων εξόδου Τέλος το πρόγραμμα φτιάχνει μια struct μεταβλητή η οποία περιέχει διάφορες πληροφορίες και την κωδικοποιημένη εικόνα μας, τα οποία θα χρησιμοποιηθούν από τον αποκωδικοποιητή. y.runs = uint16(runs); 15
Χρησιμεύει για να γίνει η run length αποκωδικοποίηση. y.s = uint16(s(:)); Αποθηκεύουμε το πίνακα s. y.zrc = uint16(-zrc); Χρησιμεύει για να γίνει η run length αποκωδικοποίηση. y.q = uint16(100 * q'); Η ποιότητα που έχουμε θέσει. y.n = uint16(n); Τα επίπεδα επεξεργασίας που έχουμε θέσει. y.huffman = mat2huff(c); Τα δεδομένα μας αφού γίνει η κωδικοποίηση Huffman. 3.8 Αποκωδικοποιητής JPEG2000 (Αντίστροφη διαδικασία) function x = jpeg2k2im(y) %JPEG2K2IM Decodes an IM2JPEG2K compressed image. % X = JPEG2K2IM(Y) decodes compressed image Y, reconstructing an % approximation of the original image X. Y is an encoding 16
% structure returned by IM2JPEG2K. % See also IM2JPEG2K. % Copyright 2002-2004 R. C. Gonzalez, R. E. Woods, & S. L. Eddins % Digital Image Processing Using MATLAB, Prentice-Hall, 2004 % $Revision: 1.4 $ $Date: 2003/10/26 18:39:40 $ error(nargchk(1, 1, nargin)); % Check input arguments % Get decoding parameters: scale, quantization vector, run-length % table size, zero run code, -of-data code, wavelet bookkeeping % array, and run-length table. n = double(y.n); q = double(y.q) / 100; runs = double(y.runs); rlen = length(runs); zrc = -double(y.zrc); eoc = zrc - 1; s = double(y.s); s = reshape(s, n + 2, 2); % Compute the size of the wavelet transform. cl = prod(s(1, :)); for i = 2:n + 1 cl = cl + 3 * prod(s(i, :)); % Perform Huffman decoding followed by zero run decoding. 17
r = huff2mat(y.huffman); c = []; zi = find(r == zrc); i = 1; for j = 1:length(zi) c = [c r(i:zi(j) - 1) zeros(1, runs(r(zi(j) + 1)))]; i = zi(j) + 2; zi = find(r == eoc); if length(zi) == 1 % Undo terminating zero run % or last non-zero run. c = [c r(i:zi - 1)]; c = [c zeros(1, cl - length(c))]; else c = [c r(i:)]; % Denormalize the coefficients. c = c + (c > 0) - (c < 0); for k = 1:n qi = 3 * k - 2; c = wavepaste('h', c, s, k, wavecopy('h', c, s, k) * q(qi)); c = wavepaste('v', c, s, k, wavecopy('v', c, s, k) * q(qi + 1)); c = wavepaste('d', c, s, k, wavecopy('d', c, s, k) * q(qi + 2)); c = wavepaste('a', c, s, k, wavecopy('a', c, s, k) * q(qi + 3)); % Compute the inverse wavelet transform and level shift. x = waveback(c, s, 'jpeg9.7', n); x = uint8(x + 128); 18
Ο αποκωδικοποιητής JPEG2000 κάνει απλώς την αντίστροφη διαδικασία του κωδικοποιητή. Αφού αποκωδικοποιήσει τους συντελεστές (που είναι κωδικοποιημένοι αριθμητικά), ο χρήστης μπορεί να επιλέξει τις υποζώνες της εικόνας που θα ανασυγκροτηθούν. Επίσης, σε κάθε υποζώνη μπορούμε να επιλέξουμε ένα συγκεκριμένο bit-plane για αποκωδικοποίηση. 4. Ασκήσεις 4.1 1 η Άσκηση Φορτώστε την εικόνα peppers.tif. 4.2 2 η Άσκηση Κωδικοποιήστε την εικόνα που φορτώσατε με το im2jpeg2000.m, χρησιμοποιώντας πέντε επίπεδα επεξεργασίας και για τις παραμέτρους exponent και mantissa δώστε τις παρακάτω τιμές μb = 10 και εb = 10.5. Στη συνέχεια αποκωδικοποιήστε την με το jpeg2κ2im.m για να μπορέσετε να δείτε τα αποτελέσματα. 4.3 3 η Άσκηση Εμφανίστε τη συμπιεσμένη εικόνα στο Matlab, αποθηκεύεστε την χρησιμοποιώντας την imwrite και στη συνέχεια τοποθετήστε τη στην εικόνα 2. Τι διαφορές παρατηρείτε; 4.4 4 η Άσκηση Χρησιμοποιείστε το imratio.m και υπολογίστε την αναλογία συμπίεσης: 19
4.4.1 Εικόνα 1: Αρχική εικόνα 20
4.4.2 Εικόνα 2: Συμπιεσμένη εικόνα Σχόλια: 4.5 5 η Άσκηση Τώρα κωδικοποιείστε πάλι την εικόνα που έχετε φορτώσει βάζοντας τις παρακάτω τιμές στον κβαντιστή: μ b = 5 και ε b = 5.5 και εμφανίστε την στην εικόνα 3. Τι παρατηρείτε; 21
4.6 6 η Άσκηση Χρησιμοποιείστε το imratio.m και τοποθετείστε παρακάτω την αναλογία συμπίεσης. Γράψτε στα σχόλια τι συμπεράσματα βγάζετε για τις επιπτώσεις που έχει η αλλαγή των τιμών μ b και ε b του κβαντιστή στην εικόνα. Ελέγξτε επίσης το χώρο που καταλαμβάνουν οι εικόνες στον δίσκο : 4.6.1 Εικόνα 3: Συμπιεσμένη εικόνα με μ b = 5 και ε b = 5.5 Σχόλια: 22
4.7 7 η Άσκηση Μέχρι τώρα χρησιμοποιήσαμε έμμεση κβάντιση για να θέσουμε το βήμα κβαντιστή. Κωδικοποιείστε μία εικόνα χρησιμοποιώντας άμεση κβάντιση και τοποθετείστε το αποτέλεσμα στην εικόνα 4. Γράψτε επίσης παρακάτω την αναλογία συμπίεσης: 4.7.1 Εικόνα 4: Συμπιεσμένη εικόνα με άμεση κβάντιση Σχόλια: 23
4.8 8 η Άσκηση Κωδικοποιείστε μία εικόνα με την im2jpeg2000.m βάζοντας το μικρότερο βήμα κβαντιστή για περιορισμένες απώλειες. Στη συνέχεια κωδικοποιείστε την ίδια εικόνα χρησιμοποιώντας την im2jpeg.m και συγκρίνετε τις δύο εικόνες με την im2ratio.m. Τι παρατηρείτε; Ποια καταλαμβάνει περισσότερο χώρο; Με ποιο πρότυπο πετυχαίνουμε καλύτερη εικόνα με μεγαλύτερη αναλογία συμπίεσης; 4.8.1 Εικόνα 5: Συμπιεσμένη εικόνα με το πρότυπο JPEG2000 24
4.8.2 Εικόνα 6: Συμπιεσμένη εικόνα με το πρότυπο JPEG Αναλογία συμπίεσης για την κωδικοποιημένη εικόνα με την im2jpeg2000.m: Αναλογία συμπίεσης για την κωδικοποιημένη εικόνα με την im2jpeg.m: 25