МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Звіт до лабораторної роботи № 4
з дисципліни: “ Системи запису та відтворення інформації ”
Мета роботи:
Набути вміння розробляти власні методи стиснення зображень та оцінювати їх ефективність.
Повний текст завдання:
Ознайомитись з теоретичним матеріалом.
Завантажити файл зображення вказаний в завданні (табл. 2) відповідно до свого варіанту.
Вивести основну інформацію про файл: кількість пікселів по горизонталі і вертикалі, тип зображення – кольорове/монохромне, кількість біт на піксел, загальний розмір зображення в бітах.
Написати JPEG-подібний кодер, згідно етапів розглянутих в теоретичній частині, який би стискав зображення з заданим степенем стиску G .
Вивести на екран оригінальне та декомпресоване зображення для порівняння їх якості.
Розрахувати реальну степінь стиснення зображення.
Навести покрокові результати всіх етапів стиснення та відтворення довільного блоку 8х8 пікселів Вашого зображення.
Варіант
Назва файлу
G
4
Flowrs1.tiff
21
Лістинг програми:
clear all;
Y = imread('D:\Політех\ІІІ курс\С-ми запису і відтворення інф\Photo\flowers1.tiff');
info = imfinfo('D:\Політех\ІІІ курс\С-ми запису і відтворення інф\Photo\flowers1.tiff');
%Визначити розміри матриці Y можна функцією size
[N, M] = size(Y);
%кількість блоків 8х8 по вертикалі та горизонталі
N_Block = fix(N / 8);
M_Block = fix(M / 8);
%Якщо кількість рядків або стовпців матриці не кратна 8, матрицю Y потрібно доповнити
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 = 25;
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
% Читаємо черговий блок 8х8 коефіцієнтів
x = Y_Q(8 * j - 7 : 8 * j, 8 * i - 7 : 8 * i);
% ZigZag перестановка
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
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 % Якщо коефіцієнт рівний 0
n = n + 1; % Збільшуємо лічильник нулів n на 1
else
res = [res n vect(jj)]; % Інакше записуємо пару [n, АС(jj)]
n = 0; % Починаємо підрахунок нулів спочатку
end;
end;
res = [res 0 0]; % Додаємо символ завершеннЯ блоку
Y_C = [midle (Y_Scan(ii, 1) - delta) res]; % Дописуємо до res різницеве значеннЯ DC-коефіцієнта та записуємо у
delta = Y_Scan(ii, 1); % у вихідний масив Y_C
midle = Y_C;
end;
Bit_Count = 0;
for ii = 1 : length(Y_C)
% Читаємо поточний елемент матриці Y_C
elem = Y_C(ii);
% Визначаємо кількість біт потрібних длЯ його представленнЯ кодом Хафмена
switch elem
case 0, kod = 1; % Code word = 1
case 1, kod = 4; % Code word = 0100
case -1, kod = 4; % Code word = 0101
case 2, kod = 4; % Code word = 0110
case -2, kod = 4; % Code word = 0111
case 3, kod = 5; % Code word = 00100
case -3, kod = 5; % Code word = 00101
case 4, kod = 5; % Code word = 00110
case -4, kod = 5; % Code word = 00111
case 5, kod = 7; % Code word = 0001000
case -5, kod = 7; % Code word = 0001001
case 6, kod = 7; % Code word = 0001010
case -6, kod = 7; % Code word = 0001011
case 7, kod = 7; % Code word = 0001100
case -7, kod = 7; % Code word = 0001101
case 8, kod = 7; % Code word = 0001110
case -8, kod = 7; % Code word = 0001111
otherwise kod = 13; % Code word = 00001 + elem(8 bits)
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);
Розрахована таблиця квантування
Q_Table =
26 51 76 101 126 151 176 201
51 76 101 126 151 176 201 226
76 101 126 151 176 201 226 251
101 126 151 176 201 226 251 276
126 151 176 201 226 251 276 301
151 176 201 226 251 276 301 326
176 201 226 251 276 301 326 351
201 226 251 276 301 326 351 376
Оригінальне та декомпресоване зображення
Розрахована степінь стиску
Compression_Ratio = 20.5580
Покрокові результати стиснення та відтворення вибраного блоку 8х8 нашого зображення
Блок 8х8:
49
50
53
58
50
52
54
66
49
54
49
52
54
65
63
60
52
53
54
53
61
59
53
57
55
52
52
58
55
61
49
50
51
48
57
54
53
63
54
52
53
52
53
54
56
64
66
57
65
57
55
62
55
56
63
64
64
58
57
62
54
49
56
59
Блок 8х8 після зсуву рівня:
-79
-78
-75
-70
-78
-76
-74
-62
-79
-74
-79
-76
-74
-63
-65
-68
-76
-75
-74
-75
-67
-69
-75
-71
-73
-76
-76
-70
-73
-67
-79
-78
-77
-80
-71
-74
-75
-65
-74
-76
-75
-76
-75
-74
-72
-64
-62
-71
-63
-71
-73
-66
-73
-72
-65
-64
-64
-70
-71
-66
-74
-79
-72
-69
Блок 8х8 після ДКП:
-22 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 -1 0 -1 0 0 1 1 -1 0 0 2 0 -1 0 -1 1 1 0 0 12 0 -2 0 -7 0 2 0 1 3 -1 0 1 0 -1 0 0 3 0 1 0 -10 0 4 6
Блок 8х8 після квантування коефіцієнтів ДКП:
-22
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
0
0
0
0
0
0
0
0
Блок 8х8 після деквантування:
-572
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
0
0
0
0
0
0
0
0
Блок 8х8 після обернених ДКП:
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
57
Висновок. На цій лабораторній роботі ми навчилися розробляти алгоритми стиснення зображення з заданим рівнем стиснення, а також з наочно перевірили принцип роботи JPEG-подібного кодеру і декодеру і застосування алгоритму стиснення з втратами.