МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра ЗІ
З В І Т
до лабораторної роботи №4
з навчальної дисципліни:
«Системи запису та відтворення інформації»
на тему: «Дослідження методів обробки зображень в MatLab»
Львів – 2011
Мета роботи: набути вміння розробляти власні методи стиснення зображень та оцінювати їх ефективність.
Завдання
Ознайомитись з теоретичним матеріалом.
Завантажити файл зображення вказаний в завданні відповідно до свого варіанту.
Вивести основну інформацію про файл: кількість пікселів по горизонталі і вертикалі, тип зображення — кольорове/монохромне, кількість біт на піксел, загальний розмір зображення в бітах.
Написати JPEG-подібний кодер, згідно етапів розглянутих в теоретичній частині, який би стискав зображення з заданим степенем стиску G.
Вивести на екран оригінальне та декомпресоване зображення для порівняння їх якості.
Розрахувати реальну степінь стиснення зображення.
Навести покрокові результати всіх етапів стиснення та відтворення довільного блоку 8x8 пікселів Вашого зображення.
Варіант – 1, назва файлу belmont.tiff.
Лістинг програми
clear all;
info = imfinfo('E:\belmont2.tiff')
Y=imread('E:\belmont2.tiff');
[N,M]= size(Y);
N_Block=fix(N/8);
M_Block=fix(M/8);
if(N-N_Block*8)~=0;
Dod=8-((N-N_Block*8));
Y=[Y; zeros(Dod,M)];
N_Block=N_Block+1;
end;
if(M-M_Block*8)~=0;
Dod=8-((M-M_Block*8));
Y=[Y zeros(N_Block*8,Dod)];
M_Block=M_Block+1;
end;
Y1=double(Y)-128;
Y_DCT=blkproc(Y1, [8,8], 'dct2');
G=10;
for ii = 1:8
for jj = 1:8
Q_Table(ii,jj)=1+(ii+jj-1)*G;
end;
end;
for ii=1:N_Block
for jj=1:M_Block
Y_Q((8*ii-7):(8*ii), (8*jj-7) : (8*jj)) = round (Y_DCT((8*ii-7):(8*ii), (8*jj-7) : (8*jj)) ./ Q_Table );
end;
end;
Y_Scan=zeros(N_Block*M_Block, 64);
count=1;
for j=1:N_Block
for i=1:M_Block
x=Y_Q(8*j-7:8*j, 8*i-7:8*i);
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) ];
Y_Scan(count , :)=ZigZag;
count=count+1;
end;
end;
delta = 0; midle =[ ];
for ii=1:N_Block*M_Block
vect = Y_Scan(ii,2:64);
n=0; res=[];
for jj=1:63
if vect(jj)==0
n=n+1;
else
res = [res n vect(jj)];
n=0;
end;
end;
res= [res 0 0 ];
Y_C=[midle (Y_Scan(ii,1)-delta) res];
delta=Y_Scan(ii,1);
midle=Y_C;
end;
Bit_Count = 0;
for ii=1:length(Y_C)
elem=Y_C(ii);
switch elem
case 0, kod=1;
case 1, kod=4;
case -1, kod=4;
case 2, kod=4;
case -2, kod=4;
case 3, kod=5;
case -3, kod=5;
case 4, kod=5;
case -4, kod=5;
case 5, kod=7;
case -5, kod=7;
case 6, kod=7;
case -6, kod=7;
case 7, kod=7;
case -7, kod=7;
case 8, kod=7;
case -8, kod=7;
otherwise kod=13;
end;
Bit_Count =Bit_Count+kod;
end;
m=N*M*8;
Compression_Ratio = m/(Bit_Count)
for ii =1:N_Block
for jj =1:M_Block
Y_R(8*ii-7:8*ii, 8*jj-7:8*jj)=Y_Q(8*ii-7:8*ii, 8*jj-7:8*jj) .*Q_Table;
end;
end;
Rec=uint8(blkproc(Y_R, [8,8], 'idct2')+128);
z=sprintf('Compression Ratio = %f', Compression_Ratio);
subplot(1,2,1);
imshow(Y(1:N, 1:M)); title('Original', 'FontSize',14);
subplot(1,2,2);
imshow(Rec(1:N, 1:M)); title(z,'FontSize',14);
Оригінальне та декомпресоване зображення
Розрахована степінь стиску – 6.1766
Таблиця квантування
11 21 31 41 51 61 71 81
21 31 41 51 61 71 81 91
31 41 51 61 71 81 91 101
41 51 61 71 81 91 101 111
51 61 71 81 91 101 111 121
61 71 81 91 101 111 121 131
71 81 91 101 111 121 131 141
81 91 101 111 121 131 141 151
Покрокові результати стиснення блоку 8x8
Вихідний блок 8x8
57 48 48 48 48 48 48 48
57 57 48 48 48 48 48 48
57 48 48 57 48 48 48 48
48 48 48 48 48 48 36 40
36 36 36 48 48 48 36 48
40 31 36 40 48 40 36 36
36 40 31 36 36 36 36 36
40 40 36 36 31 31 40 36
Блок після зсуву рівня
-71 -80 -80 -80 -80 -80 -80 -80
-71 -71 -80 -80 -80 -80 -80 -80
-71 -80 -80 -71 -80 -80 -80 -80
-80 -80 -80 -80 -80 -80 -92 -88
-92 -92 -92 -80 -80 -80 -92 -80
-88 -97 -92 -88 -80 -88 -92 -92
-92 -88 -97 -92 -92 -92 -92 -92
-88 -88 -92 -92 -97 -97 -88 -92
Блок після ДКП
-676.3750 6.9500 -0.9519 6.0516 9.1250 -0.0929 -0.0116 -4.2872
45.0571 7.3549 2.7070 1.9444 1.1226 1.5038 3.2184 -0.6785
-4.1294 4.9380 14.2238 -1.1943 -6.3270 4.6263 -6.1543 3.4208
-8.0477 - 9.1457 -5.5158 4.5304 4.4297 -3.9114 3.0288 2.9180
-1.8750 -1.3316 -1.1897 -2.7884 -0.8750 -1.3134 3.3341 -1.2407
-2.4310 4.5444 -1.2529 1.2779 -1.5930 0.3838 0.9603 0.2308
2.1164 -0.7398 -2.1543 0.9398 4.6502 7.5726 2.0262 4.2938
1.3667 -7.9891 0.7168 -2.3803 3.5732 1.9821 -1.0417 -5.2692
Квантування
-61 0 0 0 0 0 0 0
2 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 0 0 0 0 0
Zig-Zag -сканування
-61 0 2 0 0 0 0 0
-62 2 3 0 1 -1 0 0
-67 1 1 0 1 0 0 0
-71 -1 2 -1 1 0 0 0
-63 -2 -3 1 2 -1 1 0
-62 -5 -1 0 2 1 -1 -1
-36 -2 -3 -3 -5 1 -1 0
-38 4 6 1 2 0 0 0
Висновок
На даній лабораторній роботі я набув вміння розробляти власні методи стиснення зображень та оцінювати їх ефективність. Отримане декомпресоване зображення є розмитішим порівняно з оригінальним, оскільки при стисненні відбулися втрати.