Подробно опиши следующий код %% Лабораторная работ...
Created on: April 15, 2025
Created on: April 15, 2025
Подробно опиши следующий код %% Лабораторная работа: Применение вейвлет-разложения для обработки изображений
% Цель работы:
% - Научиться использовать вейвлет-разложение при обработке изображений.
% - Закрепить понимание свойств преобразования.
% - Практически использовать вейвлет-преобразование для фильтрации сигналов.
%
% Задание:
% 1. Загрузить своё изображение, привести его к размеру 512x512 пикселей.
% 2. Выполнить 4 уровня вейвлет-разложения с использованием вейвлетов Хаара и Добеши 2-го порядка.
% - Показать детали (границы объекта) для каждого уровня разложения.
% - Удалить высокочастотные составляющие (обнулив детали) и восстановить изображение.
% - Сравнить с классической низкочастотной фильтрацией (например, гауссовым фильтром).
% 3. Добавить к изображению белый гауссовский шум трёх уровней (низкий, средний, высокий), провести
% пороговую фильтрацию вейвлет-преобразованием с различными уровнями порога, восстановить изображение,
% построить зависимость RMSE (СКО ошибки) от уровня порога и выделить лучший визуальный результат.
% 4. Аналогичным образом провести эксперимент для шума типа "salt & pepper".
%
% Для пороговой фильтрации используется функция wdencmp с мягким порогированием.
% Результаты отображаются графически.
clear; clc; close all;
%% 1. Загрузка и предобработка изображения
% Чтение изображения, преобразование в оттенки серого, изменение размера до 512x512,
% перевод в тип double для дальнейшей обработки
imagePath = 'myphoto.jpg'; % Замените на путь к вашему файлу изображения
I_original = imread(imagePath);
if size(I_original,3)==3
I_gray = rgb2gray(I_original);
else
I_gray = I_original;
end
I_gray = imresize(I_gray, [512,512]);
I = im2double(I_gray); % изображение в диапазоне [0,1]
figure;
imshow(I);
title('Исходное изображение (512x512)');
%% 2. Вейвлет-разложение и восстановление (удаление высокочастотных деталей)
% Используем два вида вейвлетов: 'haar' и 'db2' (Добеши 2-го порядка)
levels = 4;
wavelets = {'haar', 'db2'};
I_reconstructed = cell(1, length(wavelets));
for w = 1:length(wavelets)
waveletName = wavelets{w};
% Выполнение 4-уровневого вейвлет-разложения
[C, S] = wavedec2(I, levels, waveletName);
text%% 2.1 Визуализация деталей (границ объекта) для каждого уровня % Для каждого уровня извлекаем горизонтальные, вертикальные и диагональные детали figure('Name', sprintf('Детали разложения (%s)', waveletName)); for lev = 1:levels [H, V, D] = detcoef2('all', C, S, lev); subplot(1,levels, lev); % Для наглядности суммируем модули коэффициентов деталей imgDetails = abs(H) + abs(V) + abs(D); imshow(mat2gray(imgDetails)); title(sprintf('Уровень %d', lev)); end %% 2.2 Удаление высокочастотных составляющих и восстановление изображения % Обнуляем все коэффициенты, соответствующие деталям, оставляя только аппроксимационные коэффициенты. C_zero = C; numApprox = prod(S(1,:)); % количество коэффициентов аппроксимации (первый ряд S) C_zero(numApprox+1:end) = 0; % Восстановленное изображение, содержащее лишь низкочастотную (аппроксимационную) составляющую I_lowpass = waverec2(C_zero, S, waveletName); I_reconstructed{w} = I_lowpass; %% 2.3 Сравнение с классической низкочастотной фильтрацией (гауссов фильтр) I_gauss = imgaussfilt(I, 2); % применение гауссового фильтра с sigma = 2 figure('Name', sprintf('Сравнение фильтраций (%s)', waveletName)); subplot(1,3,1); imshow(I); title('Исходное изображение'); subplot(1,3,2); imshow(I_lowpass); title(sprintf('Вейвлет фильтрация (%s)', waveletName)); subplot(1,3,3); imshow(I_gauss); title('Гауссов фильтр');
end
%% 3. Фильтрация изображения с добавлением белого гауссовского шума
% Эксперимент: варьирование уровня порога в вейвлет-фильтрации для восстановления изображения
% Используется вейвлет Хаара для фильтрации зашумленного изображения.
% Определяем три уровня шума: низкий, средний и высокий (по дисперсии шума)
noiseLevels = [0.001, 0.005, 0.01]; % дисперсии шума
thresholds = linspace(0,50,20); % диапазон уровней порога для эксперимента
figure('Name', 'Гауссовский шум: зависимость RMSE от порога и лучшие результаты');
for n = 1:length(noiseLevels)
variance = noiseLevels(n);
% Добавление белого гауссовского шума к исходному изображению
I_noisy = imnoise(I, 'gaussian', 0, variance);
text% Для хранения значений RMSE при различных уровнях порога RMSE_vals = zeros(size(thresholds)); bestRMSE = inf; bestThreshold = thresholds(1); bestDenoised = []; % Перебираем уровни порога от минимального до максимального значения for t = 1:length(thresholds) T = thresholds(t); % Фильтрация методом глобального порога с мягким порогированием. % Параметры: 'gbl' - глобальный порог, wavelet - 'haar', уровней разложения = levels, % T - текущий уровень порога, 's' - мягкое порогирование, 1 - оставляем аппроксимацию без изменений. I_denoised = wdencmp('gbl', I_noisy, 'haar', levels, T, 's', 1); % Вычисляем RMSE (корень из среднего квадрата ошибки) между восстановленным и исходным изображениями RMSE = sqrt(mean((I(:) - I_denoised(:)).^2)); RMSE_vals(t) = RMSE; % Определяем наилучшее значение RMSE и соответствующий порог if RMSE < bestRMSE bestRMSE = RMSE; bestThreshold = T; bestDenoised = I_denoised; end end % График зависимости RMSE от уровня порога для текущего уровня шума subplot(2, length(noiseLevels), n); plot(thresholds, RMSE_vals, 'bo-','LineWidth',1.5); xlabel('Порог'); ylabel('RMSE'); title(sprintf('Gauss шум, дисперсия = %.4f', variance)); grid on; % Отображение лучшего визуального результата фильтрации (с минимальным RMSE) subplot(2, length(noiseLevels), n+length(noiseLevels)); imshow(bestDenoised); title(sprintf('Лучшее восстановление, порог = %.2f', bestThreshold));
end
%% 4. Фильтрация изображения с добавлением шума "salt & pepper"
% Эксперимент аналогичный предыдущему, но с шумом типа salt & pepper.
% Определяем три уровня плотности шума: низкий, средний и высокий.
noiseDensities = [0.01, 0.03, 0.05]; % плотности шума salt & pepper
figure('Name', 'Salt & Pepper шум: зависимость RMSE от порога и лучшие результаты');
for n = 1:length(noiseDensities)
density = noiseDensities(n);
% Добавление шума salt & pepper
I_noisy_sp = imnoise(I, 'salt & pepper', density);
textRMSE_vals_sp = zeros(size(thresholds)); bestRMSE_sp = inf; bestThreshold_sp = thresholds(1); bestDenoised_sp = []; % Перебор уровней порога for t = 1:length(thresholds) T = thresholds(t); % Фильтрация с вейвлет-порогированием I_denoised_sp = wdencmp('gbl', I_noisy_sp, 'haar', levels, T, 's', 1); % Вычисление RMSE RMSE_sp = sqrt(mean((I(:) - I_denoised_sp(:)).^2)); RMSE_vals_sp(t) = RMSE_sp; if RMSE_sp < bestRMSE_sp bestRMSE_sp = RMSE_sp; bestThreshold_sp = T; bestDenoised_sp = I_denoised_sp; end end % График зависимости RMSE от порога для шума salt & pepper subplot(2, length(noiseDensities), n); plot(thresholds, RMSE_vals_sp, 'ro-','LineWidth',1.5); xlabel('Порог'); ylabel('RMSE'); title(sprintf('S&P шум, плотность = %.2f', density)); grid on; % Отображение лучшего визуального результата фильтрации subplot(2, length(noiseDensities), n+length(noiseDensities)); imshow(bestDenoised_sp); title(sprintf('Лучшее восстановление, порог = %.2f', bestThreshold_sp));
end
%% Завершение работы
disp('Лабораторная работа выполнена.');
Этот код представляет собой лабораторную работу, цель которой — применение вейвлет-разложения для обработки изображений. Рассмотрим его по частям.
matlabimagePath = 'myphoto.jpg'; % Замените на путь к вашему файлу изображения I_original = imread(imagePath); if size(I_original,3)==3 I_gray = rgb2gray(I_original); else I_gray = I_original; end I_gray = imresize(I_gray, [512,512]); I = im2double(I_gray);
double
, что позволяет использовать методы вейвлет-преобразования.Затем показывается исходное изображение.
matlablevels = 4; wavelets = {'haar', 'db2'}; I_reconstructed = cell(1, length(wavelets)); for w = 1:length(wavelets) waveletName = wavelets{w}; [C, S] = wavedec2(I, levels, waveletName);
'haar'
) и Добеши второго порядка ('db2'
).matlabfor lev = 1:levels [H, V, D] = detcoef2('all', C, S, lev); imgDetails = abs(H) + abs(V) + abs(D); imshow(mat2gray(imgDetails)); title(sprintf('Уровень %d', lev)); end
matlabC_zero = C; numApprox = prod(S(1,:)); C_zero(numApprox+1:end) = 0; I_lowpass = waverec2(C_zero, S, waveletName);
waverec2
для восстановления изображения только с низкочастотными коэффициентами.matlabI_gauss = imgaussfilt(I, 2); subplot(1,3,1); imshow(I); title('Исходное изображение'); subplot(1,3,2); imshow(I_lowpass); title(sprintf('Вейвлет фильтрация (%s)', waveletName)); subplot(1,3,3); imshow(I_gauss); title('Гауссов фильтр');
matlabnoiseLevels = [0.001, 0.005, 0.01]; thresholds = linspace(0,50,20); for n = 1:length(noiseLevels) variance = noiseLevels(n); I_noisy = imnoise(I, 'gaussian', 0, variance);
matlabfor t = 1:length(thresholds) I_denoised = wdencmp('gbl', I_noisy, 'haar', levels, T, 's', 1); RMSE = sqrt(mean((I(:) - I_denoised(:)).^2)); RMSE_vals(t) = RMSE; end
matlabsubplot(2, length(noiseLevels), n); plot(thresholds, RMSE_vals, 'bo-','LineWidth',1.5); title(sprintf('Gauss шум, дисперсия = %.4f', variance)); subplot(2, length(noiseLevels), n+length(noiseLevels)); imshow(bestDenoised); title(sprintf('Лучшее восстановление, порог = %.2f', bestThreshold));
Этот раздел аналогичен предыдущему, но используется другой тип шума — "salt & pepper". Изображение зашумляется этим типом шума, и снова проводится пороговая фильтрация с вейвлетами.
matlabdisp('Лабораторная работа выполнена.');
После выполнения всех операций выводится сообщение о завершении лабораторной работы.
В целом, этот код исследует использование вейвлет-разложения для обработки изображений с добавлением различных типов шума. Проводятся эксперименты с фильтрацией и восстановлением изображений, сравнивая результаты с классическими методами фильтрации и оценивая качество восстановления через RMSE.