Дослiдження методiв компресii зображень в Matlab
Автор: dark_sail • Май 31, 2019 • Лабораторная работа • 3,667 Слов (15 Страниц) • 323 Просмотры
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
„ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
Кафедра ЗІ
[pic 1]
З В І Т
До лабораторної роботи №4
з курсу:
„ Системи запису та відтворення інформації ”
на тему:
„ ДОСЛІДЖЕННЯ МЕТОДІВ КОМПРЕСІЇ ЗОБРАЖЕНЬ В MATLAB”
Варіант-13
Виконав: ст. гр. КБ-32
Шевчук О.Р
Прийняв: Совин Я.Р
Львів – 2019
Мета роботи : набути вміння розробляти власні методи стиснення зображень та оцінювати їх ефективність.
Завдання:
1. Ознайомитись з теоретичним матеріалом.
2. Завантажити файл вказаний в завданні відповідно до свого варіанту.
3. Вивести основну інформацію про файл: кількість пікселів по горизонталі і вертикалі, тип зображення – кольорове/монохромне, кількість біт на піксел, загальний розмір зображення в бітах.
4. Написати JPEG-подібний кодер, згідно етапів розглянутих в теоретичній частині, який би стискав зображення з заданим степенем стиску G.
5. Вивести на екран оригінальне та декомпресоване зображення для порівняння їх якості.
6. Розрахувати реальну степінь стиснення зображення.
7. Навести покрокові результати всіх етапів стиснення та відтворення довільного блоку 8х8 пікселів зображення.
Варіант – 13
Назва файлу - chess.tiff .
Степінь стиску – 14.
Лістинг програми:
info = imfinfo('D:\Навчання\Симестр 2\СЗТВІ\Lab_4\chess.tiff')
Y = imread('D:\Навчання\Симестр 2\СЗТВІ\Lab_4\chess.tiff');
[N,M] = size(Y); %розмір матриці Y
%кількість блоків 8*8 по вертикалі та горизонталі відповідно
N_Block = fix(N/8); %до меншого цілого
M_Block = fix(M/8); %до меншого цілого
%доповнимо некратні 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;
Y = double(Y);
%зсуврівня
Y1 = Y - 128;
Y_DCT = blkproc(Y1, [8,8], 'dct2'); %розбиттязображеннянаблоки% 8*8 іобчислення 2D-ДКПбудематриця Y_DCT такогожрозмірущоі% Y1
%будуємо таблицю квантування для заданого G
G = 18.2;
for ii = 1 : 8
for jj = 1 : 8
Q_Table(ii, jj) = 1 + (ii + jj - 1) * G;
end;
end;
%квантуваннякоефіцієнтівДКП
%коженблоккоеф. 8х8 поелементно ділимо на матрицю Q_Table і закруглюємо
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;
%ZigZag-сканування: 8х8 -> 1x64 (розтягуємов 1 рядок)
%результат -- матриця Y_Scan розміром (N_Block*M_Block)рядків x 64 елементи
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) ];
...