МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ЗВІТ
до лабораторної роботи №4
з курсу:
«Цифрові методи обробки сигналів і зображень»
на тему:
«ВЕЙВЛЕТ-ОБРОБКА ЗОБРАЖЕНЬ У СЕРЕДОВИЩІ MATLAB»
Мета роботи – ознайомитися з основними можливостями вейвлет-обробки зображень реалізованими в середовищі MatLab, отримати навики розрахунку дискретного вейвлет-перетворення двовимірних сигналів, декомпозиції зображень та їх компресії в середовищі MatLab.
ЗАВДАННЯ
1. Ознайомитись з теоретичним матеріалом.
2. Скласти програму в середовищі MatLab згідно завдання.
2.1. Провести компресію зображення з використанням вейвлет-процедури відповідно до завдання у Табл. 2. Зображення зберігається у заданому варіантом файлі у 8-бітінй змінній Y. Файл entropy.m повинен бути скопійований в ту саму папку в якій знаходяться програма і зображення.
Табл. 1.
№
Тип вейвлету
Рівень
розкладу
Тип
порогу
Кількість біт квантувача
відповідно до рівня
Файл
1.
Добеші 3-го порядку
3
жорсткий
[1 3 4]
belmont1.tiff
РЕЗУЛЬТАТИ ВИКОНАННЯ РОБОТИ
Лістинг програми:
>> Y = imread('belmont1', 'tiff');
>> Y = imread('belmont1', 'tiff');% Завантаження зображення з файлу.
>> Y = double(Y) / 256;% Приведення зображення до напівтонового формату
>> Lev = 3;% Рівень розкладу
>> w_name = 'db3'; % Тип вейвлету.
>> Lev_1_bit = 1; % Кількість біт квантувача для 1-го рівня розкладу.
>> Lev_2_bit = 3; % Кількість біт квантувача для 2-го рівня розкладу.
>> Lev_3_bit = 4; % Кількість біт квантувача для 3-го рівня розкладу.
>> [c, s] = wavedec2(Y, Lev, w_name); % Вейвлет-розклад зображення
>> cA3 = appcoef2(c, s, w_name, 3); % Знаходження коефіцієнтів апроксимації для 3-го рівня
>> cH3 = detcoef2('h', c, s, 3); % Знаходження горизонтальних коефіцієнтів для 3-го рівня
>> cV3 = detcoef2('v', c, s, 3); % Знаходження вертикальних коефіцієнтів для 3-го рівня
>> cD3 = detcoef2('d', c, s, 3); % Знаходження діагональних коефіцієнтів для 3-го рівня
>> cA2 = appcoef2(c, s, w_name, 2); % Знаходження коефіцієнтів апроксимації для 2-го рівня
>> cH2 = detcoef2('h', c, s, 2); % Знаходження горизонтальних коефіцієнтів для 2-го рівня
>> cV2 = detcoef2('V', c, s, 2); % Знаходження вертикальних коефіцієнтів для 2-го рівня
>> cD2 = detcoef2('d', c, s, 2); % Знаходження діагональних коефіцієнтів для 2-го рівня
>> cA1 = appcoef2(c, s, w_name, 1); % Знаходження коефіцієнтів апроксимації для 1-го рівня
>> cH1 = detcoef2('h', c, s, 1); % Знаходження горизонтальних коефіцієнтів для 1-го рівня
>> cV1 = detcoef2('V', c, s, 1); % Знаходження вертикальних коефіцієнтів для 1-го рівня
>> cD1 = detcoef2('d', c, s, 1); % Знаходження діагональних коефіцієнтів для 1-го рівня
>> % Побудова графіків коефіцієнтів розкладу 1-го рівня
>> figure(1); subplot(221); imshow(mat2gray(cA1)); xlabel('cA1');
>> subplot(222); imshow(mat2gray(cH1)); xlabel('cH1');
>> subplot(223); imshow(mat2gray(cV1)); xlabel('cV1');
>> subplot(224); imshow(mat2gray(cD1)); xlabel('cD1');
>> % Побудова графіків коефіцієнтів розкладу 2-го рівня
>> figure(3); subplot(221); imshow(mat2gray(cA2)); xlabel('cA2');
>> subplot(222); imshow(mat2gray(cH2)); xlabel('cH2');
>> subplot(223); imshow(mat2gray(cV2)); xlabel('cV2');
>> subplot(224); imshow(mat2gray(cD2)); xlabel('cD2');
>> % Побудова графіків коефіцієнтів розкладу 3-го рівня
>> figure(4); subplot(221); imshow(mat2gray(cA3)); xlabel('cA3');
>> subplot(222); imshow(mat2gray(cH3)); xlabel('cH3');
>> subplot(223); imshow(mat2gray(cV3)); xlabel('cV3');
>> subplot(224); imshow(mat2gray(cD3)); xlabel('cD3');
>> A3 = wrcoef2('a', c, s, w_name, 3); % Обчислення апроксимуючої складової на 3-му рівні
>> H3 = wrcoef2('h', c, s, w_name, 3); % Обчислення горизонтальної складової на 3-му рівні
>> V3 = wrcoef2('v', c, s, w_name, 3); % Обчислення вертикальної складової на 3-му рівні
>> D3 = wrcoef2('d', c, s, w_name, 3); % Обчислення діагональної складової на 3-му рівні
>> A2 = wrcoef2('a', c, s, w_name, 2); % Обчислення апроксимуючої складової на 2-му рівні
>> H2 = wrcoef2('h', c, s, w_name, 2); % Обчислення горизонтальної складової на 2-му рівні
>> V2 = wrcoef2('v', c, s, w_name, 2); % Обчислення вертикальної складової на 2-му рівні
>> D2 = wrcoef2('d', c, s, w_name, 2); % Обчислення діагональної складової на 2-му рівні
>>
>> A1 = wrcoef2('a', c, s, w_name, 1); % Обчислення апроксимуючої складової на 1-му рівні
>> H1 = wrcoef2('h', c, s, w_name, 1);% Обчислення горизонтальної складової на 1-му рівні
>> V1 = wrcoef2('v', c, s, w_name, 1); % Обчислення вертикальної складової на 1-му рівні
>> D1 = wrcoef2('d', c, s, w_name, 1); % Обчислення діагональної складової на 1-му рівні
>> % Побудова графіків складових на 1-му рівні розкладу
>> figure(5); subplot(221); imshow(mat2gray(A1)); xlabel('A1');
>> subplot(222); imshow(mat2gray(H1)); xlabel('H1');
>> subplot(223); imshow(mat2gray(V1)); xlabel('V1');
>> subplot(224); imshow(mat2gray(D1)); xlabel('D1');
>> % Побудова графіків складових на 2-му рівні розкладу
>> figure(6); subplot(221); imshow(mat2gray(A2)); xlabel('A2');
>> subplot(222); imshow(mat2gray(H2)); xlabel('H2');
>> subplot(223); imshow(mat2gray(V2)); xlabel('V2');
>> subplot(224); imshow(mat2gray(D2)); xlabel('D2');
>> % Побудова графіків складових на 3-му рівні розкладу
>> figure(7); subplot(221); imshow(mat2gray(A3)); xlabel('A3');
>> subplot(222); imshow(mat2gray(H3)); xlabel('H3');
>> subplot(223); imshow(mat2gray(V3)); xlabel('V3');
>> subplot(224); imshow(mat2gray(D3)); xlabel('D3');
>> % Обчислення порогів для 3-го рівня розкладу
>> std_cH3 = 1 * median(abs(cH3(:)))/0.6745;
>> std_cV3 = 1 * median(abs(cV3(:)))/0.6745;
>> std_cD3 = 1 * median(abs(cD3(:)))/0.6745;
>> % Обчислення порогів для 2-го рівня розкладу
>> std_cH2 = 1.5 * median(abs(cH2(:)))/0.6745;
>> std_cV2 = 1.5 * median(abs(cV2(:)))/0.6745;
>> std_cD2 = 1.5 * median(abs(cD2(:)))/0.6745;
>> % Обчислення порогів для 1-го рівня розкладу
>> std_cH1 = 2 * median(abs(cH1(:)))/0.6745;
>> std_cV1 = 2 * median(abs(cV1(:)))/0.6745;
>> % Формування матриці порогів 3*N
>> thr_h = [std_cH1 std_cH2 std_cH3];
>> thr_v = [std_cV1 std_cV2 std_cV3];
>> thr_d = [0 std_cD2 std_cD3];
>> THR = [thr_h; thr_d; thr_v];
>> % Порогування функції
>> [YC, cx, sx] = wdencmp('lvd', c, s, w_name, Lev, THR, 'h');
>> % Знаходження коефіцієнтів вейвлет-розкладу після порогування
>> cA3_t = appcoef2(cx, sx, w_name, 3);
>> cH3_t = detcoef2('h', cx, sx, 3);
>> cV3_t = detcoef2('v', cx, sx, 3);
>> cD3_t = detcoef2('d', cx, sx, 3);
>> cH2_t = detcoef2('h', cx, sx, 2);
>> cV2_t = detcoef2('v', cx, sx, 2);
>> cD2_t = detcoef2('d', cx, sx, 2);
>> cH1_t = detcoef2('h', cx, sx, 1);
>> cV1_t = detcoef2('v', cx, sx, 1);
>> cD1_t = detcoef2('d', cx, sx, 1);
>> % Визначення максимального значення для деталізуючих коефіцієнтів
>> Max_Lev_1 = max([ max(cH1_t(:)) max(cV1_t(:)) ]);
>> Max_Lev_2 = max([ max(cH2_t(:)) max(cV2_t(:)) max(cD2_t(:))]);
>> Max_Lev_3 = max([ max(cH3_t(:)) max(cV3_t(:)) max(cD3_t(:))]);
>> % Визначення мінімального значення для деталізуючих коефіцієнтів
>> Min_Lev_1 = min([ min(cH1_t(:)) min(cV1_t(:)) ]);
>> Min_Lev_2 = min([ min(cH2_t(:)) min(cV2_t(:)) min(cD2_t(:))]);
>> Min_Lev_3 = min([ min(cH3_t(:)) min(cV3_t(:)) min(cD3_t(:))]);
>> Coef_Lev_1 = max(abs([Max_Lev_1 Min_Lev_1])); % Масштабуючий множник для 1-го
рівня розкладу
>> Coef_Lev_2 = max(abs([Max_Lev_2 Min_Lev_2]))l; % Масштабуючий множник для 2-го
рівня розкладу
>> Coef_Lev_2 = max(abs([Max_Lev_2 Min_Lev_2])); % Масштабуючий множник для 2-го
рівня розкладу
>> Coef_Lev_3 = max(abs([Max_Lev_3 Min_Lev_3])); % Масштабуючий множник для 3-го
рівня розкладу
>> % Квантування коефіцієнтів 1-го рівня розкладу заданим числом біт.
>> cH1_tq = convergent(cH1_t * (2^Lev_1_bit-1) / Coef_Lev_1) / 2^Lev_1_bit;
>> cV1_tq = convergent(cV1_t * (2^Lev_1_bit-1) / Coef_Lev_1) / 2^Lev_1_bit;
>> % Обчислення ентропії коефіцієнтів 1-го рівня після порогування і квантування.
>> Entropy_1 = entropy([ cH1_tq(:) * 2^Lev_1_bit; cV1_tq(:) * 2^Lev_1_bit ]);
>> % Квантування коефіцієнтів 2-го рівня розкладу заданим числом біт.
>> cH2_tq = convergent(cH2_t * (2^Lev_2_bit-1) / Coef_Lev_2) / 2^Lev_2_bit;
>> cV2_tq = convergent(cV2_t * (2^Lev_2_bit-1) / Coef_Lev_2) / 2^Lev_2_bit;
>> cD2_tq = convergent(cD2_t * (2^Lev_2_bit-1) / Coef_Lev_2) / 2^Lev_2_bit;
>> % Обчислення ентропії коефіцієнтів 2-го рівня після порогування і квантування.
>> Entropy_2 = entropy([ cH2_tq(:) * 2^Lev_2_bit; cV2_tq(:) * 2^Lev_2_bit; cD2_tq(:) *
2^Lev_2_bit ]);
>> % Квантування коефіцієнтів 3-го рівня розкладу заданим числом біт.
>> cH3_tq = convergent(cH3_t * (2^Lev_3_bit-1) / Coef_Lev_3) / 2^Lev_3_bit;
>> cV3_tq = convergent(cV3_t * (2^Lev_3_bit-1) / Coef_Lev_3) / 2^Lev_3_bit;
>> cD3_tq = convergent(cD3_t * (2^Lev_3_bit-1) / Coef_Lev_3) / 2^Lev_3_bit;
>> % Обчислення ентропії коефіцієнтів 3-го рівня після порогування і квантування.
>> Entropy_3 = entropy([cH3_tq(:) * 2^Lev_3_bit; cV3_tq(:) * 2^Lev_3_bit; cD3_tq(:) *
2^Lev_3_bit ]);
>> cH1_tq = reshape(cH1_tq, 1, sx(4,1) * sx(4,2)) * Coef_Lev_1;
>> cV1_tq = reshape(cV1_tq, 1, sx(4,1) * sx(4,2)) * Coef_Lev_1;
>> cD1_tq = reshape(cD1_t, 1, sx(4,1) * sx(4,2)) * Coef_Lev_1 * 0; % Нехтуємо діагональними
коефіцієнтами
>> cH2_tq = reshape(cH2_tq, 1, sx(3,1) * sx(3,2)) * Coef_Lev_2;
>> cV2_tq = reshape(cV2_tq, 1, sx(3,1) * sx(3,2)) * Coef_Lev_2;
>> cD2_tq = reshape(cD2_tq, 1, sx(3,1) * sx(3,2)) * Coef_Lev_2 ;
>> cH3_tq = reshape(cH3_tq, 1, sx(2,1) * sx(2,2)) * Coef_Lev_3;
>> cV3_tq = reshape(cV3_tq, 1, sx(2,1) * sx(2,2)) * Coef_Lev_3;
>> cD3_tq = reshape(cD3_t, 1, sx(2,1) * sx(2,2)) * Coef_Lev_3 ;
>> cx1 = cx;
>> % Формуємо масив коефіцієнтів розкладу після порогування і квантування.
>> cx1(sx(1, 1) * sx(1, 2) + 1 :end) = [cH3_tq cV3_tq cD3_tq cH2_tq cV2_tq cD2_tq cH1_tq
cV1_tq cD1_tq];
>> % Здійснюємо реконструкцію стисненого сигналу.
>> YCQ = wrcoef2('a', cx1, sx, w_name, 0);
>> % Записуємо стиснуте зображення у файл
>> imwrite(YCQ, 'belmont1_Buch.tiff');
>> [W H] = size(Y); % Визначаємо розміри зображення
>> Size_Imag = W * H * 8 % Визначаємо кількість біт для зберігання нестисненого зображення
Size_Imag = 614400
>> % Визначаємо кількість біт для зберігання стисненого зображення
>> Size_Imag_Buch = s(1, 1) * s(1, 2) * 8 + s(2, 1) * s(2, 2) * Entropy_3 * 3 + s(3, 1) * s(3, 2) *
Entropy_2 * 3 + + s(4, 1) * s(4, 2) * Entropy_1 * 2
Size_Imag_Buch = 2.4000e+004
>> CR = Size_Imag / Size_Imag_Buch % Визначаємо коефіцієнт стиснення
CR = 25.5997
>> PSNR = 20 * log10 (255 ./ sqrt(sum( (Y(:) - YCQ(:)).^2)/ (W * H))) % Визначаємо PSNR
PSNR = 71.6623
>> xlab1=['CR = ' , num2str(CR)];
>> xlab2=[' PSNR = ', num2str(PSNR), 'dB'];
>> figure(9); subplot(211); imshow(Y); % Виводимо оригінальне зображення на екран
>> subplot(212); imshow(mat2gray(YCQ)); xlabel([xlab1 xlab2]); % Виводимо стиснене зображення на екран
Побудова графіків
/
Рис.1 Коефіціенти розкладу 1-го рівня
/
Рис.2 Коефіціенти розкладу 2-го рівня
/
Рис.3 Коефіціенти розкладу 3-го рівня
/
Рис.4 Складові на 1-му рівні розкладу
/
Рис.5 Складові на 2-му рівні розкладу
/
Рис.6 Складові на 3-му рівні розкладу
/
Рис.7 Оригінальне та стиснене зображення
Висновок: на даній лабораторній роботі я ознайомився з основними можливостями вейвлет-обробки реалізованими в середовищі MatLab, отримав навики розрахунку дискретного вейвлет-перетворення, декомпозиції сигналу на апроксимуючі і деталізуючі складові, вейвлет-очищення сигналів від шумів в середовищі MatLab.