Звіт до лабораторної роботи № 4

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2010
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Системи запису та відтворення інформації
Група:
ЗІ-31

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»  Звіт до лабораторної роботи № 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-подібного кодеру і декодеру і застосування алгоритму стиснення з втратами.
Антиботан аватар за замовчуванням

14.03.2013 23:03-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!