Міністерство Освіти і Науки України
Національний Університет “Львівська Політехніка”
Кафедра СКС
Стиск зображень з використанням дискретних косинусних перетворень
Методичні вказівкидо розрахунково-графічної роботи (частина 1) з курсу “Проектування комп’ютерних засобів цифрової обробки сигналів та зображень” для студентів спеціальностей
7.091503 і 8.091503 “Спеціалізовані комп'ютерні системи“
Затвердженона засіданні кафедри” Спеціалізовані комп'ютерні системи ”Протокол № 1 від 28 серпня 2009 р.
Львів – 2009
Стиск зображень з використанням дискретних косинусних перетворень :
Методичні вказівки до розрахунково-графічної роботи (частина 1) з курсу “Проектування комп’ютерних засобів цифрової обробки сигналів та зображень” для студентів спеціальностей 7.091503 і 8.091503 “Спеціалізовані комп'ютерні системи“ / Укладач: Р. Попович – Львів: Національний університет “Львівська політехніка”, 2009, с.
Укладач: Р. Попович, к.т.н., доцент
Відповідальний за випуск: Дунець Р. Б., професор, завідувач кафедри
Рецензенти: Кочан Р.В., к. т. н, доцент
Троценко В.В., к. т. н, доцент
Мета роботи
Опрацювати та випробувати в середовищі MATLAB 6.5 програму, яка реалізує стиск зображень з використанням дискретного косинусного перетворення.
Опис алгоритму
JPEG стиск
Вхід: Lena512.pgm
Вихід:Lena512jpg
Алгоритм стиску
1. Початкове зображення розбиваємо на блоки розміру 8Х8 і кожен піксель у блоці зсуваємо на -128
2. Кожен блок незалежно перетворюємо за допомогою двовимірного ДКП (дискретного косинусного перетворення) – Matlab команда dct2
3. Кожен перетворений блок квантуємо згідно з виразом:
x(j,k)=round(block_dct(j,k)/quant(j,k))
Матриця квантування з елементами quant(j,k):
quant=,
де параметр Q змінюємо, регулюючи степінь стиску зображення.
Коефіцієнти заокруглюємо до найближчого цілого.
4. Обходячи двовимірний масив ДКП коефіцієнтів зигзагом (змійкою) перетворюємо його в одновимірний вектор
5. Перший коефіцієнт у векторі (так званий DC коефіцієнт) заміняємо на його різницю з першим коефіцієнтом попереднього вектора. Отриману різницю кодуємо за допомогою коду Хафмена.
Таблиця DC коду Хафмена: (категорія, кодове слово) (наведена в файлі dc_huffman_table.txt)
Категорія
Діапазон коефіцієнта
0
0
1
-1,1
2
-3,-2,2,3
3
-7,…,-4,4,…,7
…
…
Після отримання кодового слова для категорії, вимагаються ще додаткові біти, щоб визначити знак та абсолютну величину ненульового коефіцієнта в кожній із категорій.
6. Коефіцієнти вектора починаючи з другого називають AC коефіцієнтами. Ненульові AC коефіцієнти також кодуємо кодом Хафмена, але з використанням іншої таблиці. Принцип полягає в такому: кодове слово залежить від числа нульових коефіцієнтів, що йдуть попереду даного ненульового, та від категорії ненульового коефіцієнта.
Таблиця AC коду Хафмена: (число нулів, категорія, кодове слово) (наведена в файлі аc_huffman_table.txt)
Кінець блоку (0, 0, 1010)
7. Послідовно опрацьовуємо всі блоки зображення, як описано раніше.
Оцінювання показників
Отримати PSNR та відтворені зображення при 0.25 bpp, 0.5 bpp, 0.75 bpp, 1 bpp, 1.5 bpp.
Приклад опрацювання зображення.
Візьмемо для прикладу Q=0.5
Тоді матриця квантування дорівнює
8 6 5 8 12 20 26 31
6 6 7 10 13 29 30 28
7 7 8 12 20 29 35 28
7 9 11 15 26 44 40 31
9 11 19 28 34 55 52 39
12 18 28 32 41 52 57 46
25 32 39 44 52 61 60 51
36 46 48 49 56 50 52 50
Початкове зображення розбиваємо на блоки розміру 8x8. Візьмемо для прикладу два послідовних (зліва вправо) 8x8 блоки у верхньому лівому кутку початкового зображення lena512.pgm.
block1
162 162 162 161 162 157 163 161
162 162 162 161 162 157 163 161
162 162 162 161 162 157 163 161
162 162 162 161 162 157 163 161
162 162 162 161 162 157 163 161
164 164 158 156 161 160 159 160
161 161 163 158 160 162 159 156
159 159 156 157 159 159 156 157
Кожен піксель у блоці зсуваємо на -128
block1 - 128
34 34 34 33 34 29 35 33
34 34 34 33 34 29 35 33
34 34 34 33 34 29 35 33
34 34 34 33 34 29 35 33
34 34 34 33 34 29 35 33
36 36 30 28 33 32 31 32
33 33 35 30 32 34 31 28
31 31 28 29 31 31 28 29
Блок незалежно перетворюємо за допомогою двовимірного ДКП. Найбільші за абсолютною величиною коефіцієнти ДКП зосереджуються у верхній лівій області. Це ключова властивість ДКП, що використовується при JPEG стиску.
block1_dct
260.2500 5.0886 3.0094 -0.0867 0.2500 -0.6291 -4.4937 5.5747
7.1102 -1.2029 0.7850 -5.0194 1.9602 3.1345 -3.8925 3.2045
-4.7083 -0.0063 -1.6036 1.6470 -0.6765 -0.7010 1.8713 -1.6428
2.3837 1.0641 1.7188 1.1479 -0.7606 -1.1010 0.2081 0.3036
-1.2500 -1.3426 -0.5740 -1.6225 1.7500 0.9690 -1.3858 0.0316
1.2920 0.8680 -1.2365 0.0883 -2.0116 0.6628 1.4524 0.5034
-1.5675 -0.2024 2.3713 1.5460 1.6332 -2.0703 -0.8964 -1.0630
1.1594 -0.1062 -1.8658 -1.5738 -0.8846 1.8090 0.3391 0.8922
Перетворений блок квантуємо
block1_quant
33 1 1 0 0 0 0 0
1 0 0 -1 0 0 0 0
-1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Двовимірний масив коефіцієнтів, отриманих після квантування, перетворюємо в одновимірний вектор у результаті проходження змійкою
block1_zigzag
33 1 1 -1 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
DC коефіцієнт заміняємо на різницю
block1 difference
33-0=33
Отриману різницю кодуємо кодом Хафмена. Спочатку отримуємо категорію коефіцієнта. Оскільки 32≤|33|≤63, категорія коефіцієнта дорівнює 6. Тоді маємо кодове слово:1110.
Тепер про те, як отримуємо додаткові біти. Ці біти обчислюються для всіх коефіцієнтів у кожній категорії, за винятком категорії 0. Усі коефіцієнти кожної категорії (за винятком категорії 0) нумеруються послідовними натуральними числами: додатні коефіцієнти парними, а від’ємні - непарними. У нашому прикладі, для категорії 6: 32 нумерується як 000000, -32 як 000001,33 як 000010, -33 як 000011 і т.д.
block1 DC Huffman coding
33 – категорія 6 кодове слово 1110
Додаткові біти 000010
Повне кодове слово 1110000010
Для оцінки степеня стиску зображення числа біт у всіх повних кодових словах накопичуються.
numb=10
Потік бітів запаковується в байти і записується в файл lena512.jpg
AC коефіцієнти - коефіцієнти з другого по 64-й у векторі block_zigzag
Опрацювання AC коефіцієнтів
Послідовність AC коефіцієнтів заміняємо на послідовність пар:
- число нульових коефіцієнтів, які йдуть до ненульового коефіцієнта
- ненульовий коефіцієнт
У кінці послідовності пар додаємо маркер EOB (кінець блоку) - 0 0
0 1 0 1 0 -1 1 1 7 -1 0 0
Отримані пари кодуємо з використанням таблиці AC коду Хафмена.
Кодування пари (0,1):
категорія для 1 - 1
AC кодове слово для 0,1 – 00
додаткові біти – 0
повне кодове слово – 000
Кодування пари (0,1):
категорія для 1 - 1
AC кодове слово для 0,1 – 00
додаткові біти – 0
повне кодове слово – 000
Кодування пари (0,-1):
категорія для -1 - 1
AC кодове слово для 0,1 – 00
додаткові біти – 1
повне кодове слово - 001
Кодування пари (1,1):
категорія для 1 - 1
AC кодове слово для 1,1 – 1100
додаткові біти – 0
повне кодове слово - 1100
Кодування пари (7,-1):
категорія для -1 - 1
AC кодове слово для 7,-1 – 11111001
додаткові біти – 1
повне кодове слово - 11111001
Кодування пари (0,0) (ця пара є маркером EOB):
категорія для 0 - 0
AC кодове слово для 0,0 – 1010
додаткові біти – немає
повне кодове слово - 1010
numb=37
-------------------------------------------------------------------------------------------
block2 розташований справа від block1
block2
165 161 162 160 155 163 160 155
165 161 162 160 155 163 160 155
165 161 162 160 155 163 160 155
165 161 162 160 155 163 160 155
165 161 162 160 155 163 160 155
160 160 155 160 154 154 156 154
160 162 157 162 155 155 157 152
159 161 161 159 154 154 153 151
block2 - 128
37 33 34 32 27 35 32 27
37 33 34 32 27 35 32 27
37 33 34 32 27 35 32 27
37 33 34 32 27 35 32 27
37 33 34 32 27 35 32 27
32 32 27 32 26 26 28 26
32 34 29 34 27 27 29 24
31 33 33 31 26 26 25 23
block2_dct
247.2500 17.6910 2.3029 4.7341 -7.5000 9.7497 2.2933 -6.3980
10.8646 -2.7301 2.6331 4.9098 -3.5647 2.6999 6.0155 0.0957
-4.2627 2.2568 -1.8839 -2.5183 0.4784 -1.3712 -1.5303 0.5179
-1.3163 -1.5892 0.9519 0.3675 2.0028 0.2310 -2.4308 -1.0274
2.5000 0.8847 -0.1421 0.3624 -2.2500 0.0554 3.5766 1.0990
0.1728 -0.3084 -0.3461 0.2310 0.5865 0.4003 -2.0310 -0.7534
-3.1051 -0.0241 0.4697 -1.0246 1.1548 -0.8810 -0.1161 0.2997
3.0533 0.0957 -0.3088 0.9643 -1.3463 0.7456 0.8517 -0.0377
block2_quant
31 3 0 1 -1 0 0 0
2 0 0 0 0 0 0 0
-1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Block2_zigzag
31 3 2 -1 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Опрацювання DC коефіцієнта
різниця
31-33=-2
DC кодування Хафмена
-2 – категорія 2 кодове слово 100
додаткові біти 01
повне кодове слово 10001
numb=42
Опрацювання AC коефіцієнтів
0 3 0 2 0 -1 2 1 7 -1 0 0
Кодування пари (0,3):
категорія для 3 - 2
AC кодове слово для 0,3 – 01
додаткові біти – 10
повне кодове слово – 0110
Кодування пари (0,2):
категорія для 2 - 2
AC кодове слово для 0,2 – 01
додаткові біти – 00
повне кодове слово - 0100
Кодування пари (0,-1):
категорія для -1 - 1
AC кодове слово для 0,1 – 00
додаткові біти – 1
повне кодове слово - 001
Кодування пари (2,1):
категорія для 1 - 1
AC кодове слово для 2,1 – 11011
додаткові біти – 0
повне кодове слово - 110110
Кодування пари (7,-1):
категорія для -1 - 1
AC кодове слово для 7,-1 – 11111001
додаткові біти – 1
повне кодове слово - 11111001
Кодування пари (0,0) (ця пара є маркером EOB):
категорія для 0 - 0
AC кодове слово для 0,0 – 1010
додаткові біти – none
повне кодове слово - 1010
numb=72
Таким чином, загальна кількість бітів для кодування block1 та block2 дорівнює 72.
Після того, як всі блоки аналогічно опрацьовані, jpeg кодер завершує свою роботу.
Степінь стиску (в бітах на піксель) дорівнює numb/(512*512). Цей показник з’являється в головному вікні Matlab.
Jpeg декодер виконує дії, обернені до дій кодера
читає байти з файлу lena512.jpg
розпаковує байти в потік бітів
послідовно дописуючи біти з потоку, перевіряє чи є результат кодовим словом DC коду Хафмена. Таблиці коду Хафмена складені так, що ніяке кодове слово не є початком іншого. Ось чому потік бітів однозначно декодований
маючи кодове слово знаходить категорію, а тоді – число додаткових бітів
бере це число бітів з потоку та знаходить значення коефіцієнта
додаванням відтворює значення DC коефіцієнта
послідовно дописуючи біти з потоку, перевіряє чи є результат кодовим словом AC коду Хафмена
маючи кодове слово знаходить число нулів перед ненульовим коефіцієнтом, категорію ненульового коефіцієнта, а тоді число додаткових бітів
бере це число бітів з потоку та знаходить значення ненульового коефіцієнта
шукає маркер EOB
послідовно записує відповідну кількість нулів, а тоді ненульовий коефіцієнт
виконує обернений зигзаг: заміняє вектор на двовимірний масив коефіцієнтів
виконує обернене квантування: множить елементи двовимірного масиву на відповідні елементи матриці квантування
виконує двовимірне ДКП
виконує обернений зсув на +128
Після того, як усі блоки аналогічно опрацьовані, jpeg деко дер завершує свою роботу.
Обчислюємо показники якості відтвореного зображення: MSE, а тоді PSNR. PSNR (в dB) з’являється в головному вікні Matlab та в заголовку відтвореного (декодованого) зображення.
Можна змінювати параметр Q в файлі compression.m, запускати цей файл на виконання та отримувати різні степені стиску (більше Q – більший степінь стиску, але разом з тим менше PSNR і гірша якість відтвореного зображення).
Зразок програми на мові сценаріїв MATLAB 6.5
Далі наведено зразок програми на мові сценаріїв MATLAB 6.5, яка реалізує описані вище етапи стиску зображень.
Qi=4; close all; %compression ratio depends on%Qi=4 - ratio=29.7 - 0.25bpp; 31.2dB
%Qi=2 - ratio=19.78 - 0.4bpp ; 33.7dB
%Qi=1 - ratio=12.79 - 0.75bpp; 35.7dB
%Qi=0.5 - ratio= 8.2 - 1 bpp; 37.6dB
%Qi=0.25 -ratio= 5.33 - 1.5 bpp; 39.8dB
%t1 = cputime;
%Reading of Huffman table for DC coefficients from file DC_huffman_table.txt
[DC_categ,DC_code]=textread('DC_huffman_table.txt','%c %s');
%Reading of Huffman table for AC coefficients from file AC_huffman_table.txt
[AC_run,AC_categ,AC_code]=textread('AC_huffman_table.txt','%c %c %s');
%quantization coefficients
quant(1:8,1:8)=[16 11 10 16 24 40 51 61
12 12 14 19 26 58 60 55
14 13 16 24 40 57 69 56
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99];
quant=round(quant*Qi);
display('JPEG encoder');
figure
imshow lena512.pgm; title('lena512.pgm, 8bpp');
im=double(imread('lena512.pgm'));
DC_prev=0;
DC_coef=[];
DC_data=[];
AC_data=[];
numb=0;
%**************************************************************************
row=64; %number of blocks in a row
column=64; %number of blocks in a column
%**************************************************************************
fid=fopen('lena512.jpg','w');
buffer='';
for i_row=1:row
for j_column=1:column
%The original image is partitioned into 8x8 blocks and each pixel in a block is shifted by -128
%one block processing
block=im(8*i_row-7:8*i_row,8*j_column-7:8*j_column)-128;
%Each block is independently transformed by DCT
%DCT: 2-D discrete cosine transform
block_dct=dct2(block);
%Each transformed block is quantized according to x(j,k)=round(block_dct(j,k)/quant(j,k))
x=round(block_dct./quant); %x - block_quant
%The 2-D array of the coefficients after quantization is formatted into 1-D vector using zigzag scan
block_zigzag=[x(1,1) x(1,2) x(2,1) x(3,1) x(2,2) x(1,3) x(1,4) x(2,3) x(3,2) x(4,1) x(5,1) x(4,2) x(3,3) x(2,4) x(1,5) x(1,6) x(2,5) x(3,4) x(4,3) x(5,2) x(6,1) x(7,1) x(6,2) x(5,3) x(4,4) x(3,5) x(2,6) x(1,7) x(1,8) x(2,7) x(3,6) x(4,5) x(5,4) x(6,3) x(7,2) x(8,1) x(8,2) x(7,3) x(6,4) x(5,5) x(4,6) x(3,7) x(2,8) x(3,8) x(4,7) x(5,6) x(6,5) x(7,4) x(8,3) x(8,4) x(7,5) x(6,6) x(5,7) x(4,8) x(5,8) x(6,7) x(7,6) x(8,5) x(8,6) x(7,7) x(6,8) x(7,8) x(8,7) x(8,8)];
%--------------------------------------------------------------------------
%start of DC coefficient processing
%The DC coefficient (first coefficient in the block_zigzag vector) is encoded with a lossless
%DPCM scheme using the quantized DC coefficient from the previous block as a 1-D predictor
elem=x(1,1)-DC_prev;
DC_prev=x(1,1);
%The resulting DPCM difference is coded by Huffman coding
%obtaining of elem category and a number of additional bits
if elem==0 categ='0'; end;
if abs(elem)==1 categ='1'; power=1; bits=1; end;
if and(abs(elem)>=2,abs(elem)<=3) categ='2'; power=2; bits=2; end;
if and(abs(elem)>=4,abs(elem)<=7) categ='3'; power=4; bits=3; end;
if and(abs(elem)>=8,abs(elem)<=15) categ='4'; power=8; bits=4; end;
if and(abs(elem)>=16,abs(elem)<=31) categ='5'; power=16; bits=5; end;
if and(abs(elem)>=32,abs(elem)<=63) categ='6'; power=32; bits=6; end;
if and(abs(elem)>=64,abs(elem)<=127) categ='7'; power=64; bits=7; end;
if and(abs(elem)>=128,abs(elem)<=255) categ='8'; power=128; bits=8; end;
if and(abs(elem)>=256,abs(elem)<=511) categ='9'; power=256; bits=9; end;
if and(abs(elem)>=512,abs(elem)<=1023) categ='A'; power=512; bits=10; end;
if and(abs(elem)>=1023,abs(elem)<=2047) categ='B'; power=1024; bits=11; end;
i=1;
%searching of categ in the DC Huffman table
while DC_categ(i)~=categ i=i+1; end;
code=char(DC_code(i)); %DC Huffman code word for the category of elem
%After output the code for the category, the additional bits are
%required to specify the sign and exact magnitude of the nonzero
%coefficient in each of the categories
if categ ~= '0'
aa=abs(elem)-power;
ad_cod=aa+aa;
if elem<0 ad_cod=ad_cod+1; end;
ad_code=dec2bin(ad_cod);
buf=[]; for i=1:bits-length(ad_code) buf=strcat(buf,'0');end; ad_code=strcat(buf,ad_code);
%ad_code - required additional bits
code=strcat(code,ad_code); %complete code:category word + additional bits
end;
%numb is used for compression ratio estimation
numb=numb+length(code); %numb=numb+number of bits in the current complete word
%------------------------------------------------------
%packing of complete code word bits into byte and writing to the file lena512.jpg
for i=1:length(code)
buffer=strcat(buffer,code(i));
if length(buffer)==8 a=bin2dec(buffer); fwrite(fid,a); buffer=''; end;
end; %writing to file
%end of DC coefficient processing
%------------------------------------------------------
%AC coefficients - from second to 64-th coefficients in the block_zigzag vector
%start of AC coefficients processing
% zero runcode
vect=block_zigzag(2:64);
n=0;
ress=[];
for i=1:63
if vect(i)==0 n=n+1; %counting a number of zero-valued coefficients preceding the non-zero coefficient
else ress=[ress n vect(i)]; n=0; end;%adding to ress the current pair (number of zeros and non-zero coefficient)
end;
ress=[ress 0 0];% adding a marker EOB (end of block) - 0 0
%The pairs from ress are coded by AC Huffman code table.
%The principle is that each default AC Huffman code word depends on the
%number of zeros, predicting the nonzero coefficient, as well as
%the magnitude category of the nonzero coefficient
for k=1:2:length(ress)-1
ele=ress(k); %number of zeros
elem=ress(k+1); %nonzero coefficient
%obtaining of elem category and a number of additional bits
if elem==0 categ='0'; end;
if abs(elem)==1 categ='1'; power=1; bits=1; end;
if and(abs(elem)>=2,abs(elem)<=3) categ='2'; power=2; bits=2; end;
if and(abs(elem)>=4,abs(elem)<=7) categ='3'; power=4; bits=3; end;
if and(abs(elem)>=8,abs(elem)<=15) categ='4'; power=8; bits=4; end;
if and(abs(elem)>=16,abs(elem)<=31) categ='5'; power=16; bits=5; end;
if and(abs(elem)>=32,abs(elem)<=63) categ='6'; power=32; bits=6; end;
if and(abs(elem)>=64,abs(elem)<=127) categ='7'; power=64; bits=7; end;
if and(abs(elem)>=128,abs(elem)<=255) categ='8'; power=128; bits=8; end;
if and(abs(elem)>=256,abs(elem)<=511) categ='9'; power=256; bits=9; end;
if and(abs(elem)>=512,abs(elem)<=1023) categ='A'; power=512; bits=10; end;
if and(abs(elem)>=1023,abs(elem)<=2047) categ='B'; power=1024; bits=11; end;
switch ele
case 0, ele_str='0';
case 1, ele_str='1';
case 2, ele_str='2';
case 3, ele_str='3';
case 4, ele_str='4';
case 5, ele_str='5';
case 6, ele_str='6';
case 7, ele_str='7';
case 8, ele_str='8';
case 9, ele_str='9';
case 10, ele_str='A';
case 11, ele_str='B';
case 12, ele_str='C';
case 13, ele_str='D';
case 14, ele_str='E';
case 15, ele_str='F';
end;
%searching of run and categ in the AC Huffman table
i=1;while or(AC_run(i)~=ele_str,AC_categ(i)~=categ) i=i+1; end;
code=char(AC_code(i));%AC Huffman code word for the run and category
if categ ~= '0'
aa=abs(elem)-power;
ad_cod=aa+aa;
if elem<0
ad_cod=ad_cod+1;
end;
ad_code=dec2bin(ad_cod);
buf=[]; for i=1:bits-length(ad_code) buf=strcat(buf,'0');end; ad_code=strcat(buf,ad_code);
%ad_code - required additional bits
code=strcat(code,ad_code);%complete code:run and category word + additional bits
end;
numb=numb+length(code);%numb=numb+number of bits in the current complete word
%------------------------------------------------------
%packing of complete code word bits into byte and writing to the file lena512.jpg
for i=1:length(code)
buffer=strcat(buffer,code(i));
if length(buffer)==8 a=bin2dec(buffer); fwrite(fid,a); buffer=''; end;
end; %writing to file
%------------------------------------------------------
end; %end of AC coefficients processing
end; %end of blocks column processing
end; %end of blocks row processing
%------------------------------------------------------
%last bits padding with "1" to whole byte and writing to lena512.jpg
l=length(buffer);
if l~=0
for i=l+1:8 buffer=strcat(buffer,'1'); end;
a=bin2dec(buffer); fwrite(fid,a); buffer='';
numb=numb+8;
end;
fclose(fid);
compr_ratio=numb/(512*512);
disp('compression_ratio, bpp:'); disp(compr_ratio);
%t2=cputime;
%t2-t1
%--------------------------------------------------------------------------
clear im;
%--------------------------------------------------------------------------
display('JPEG decoder')
fid=fopen('lena512