Подробно опиши следующий код %% Лабораторная работ...

Created on: April 15, 2025

Answered using O1 by Chat01

Question

Подробно опиши следующий код %% Лабораторная работа: Применение вейвлет-разложения для обработки изображений
% Цель работы:
% - Научиться использовать вейвлет-разложение при обработке изображений.
% - Закрепить понимание свойств преобразования.
% - Практически использовать вейвлет-преобразование для фильтрации сигналов.
%
% Задание:
% 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);

text
RMSE_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('Лабораторная работа выполнена.');

Thought

Crafting a response

I’m focusing on responding to a detailed code request, involving wavelet decomposition, aiming for a comprehensive and clear explanation to meet the user's needs.

Prioritizing response strategies

I’m working through the best approach to responding to a code request on wavelet decomposition, aiming for a comprehensive and clear explanation to meet the user's needs.

Crafting the response

I’m refining the approach to respond to a detailed code request on wavelet decomposition, ensuring a clear and comprehensive explanation to meet the user’s needs.

Crafting the explanation

I’m honing the details to address a wavelet decomposition code request, ensuring a thorough and comprehensible explanation to meet the user's needs.

Formulating the response

I’m crafting a detailed response to a wavelet decomposition code request, ensuring the explanation is thorough, clear, and meets the user's needs. This involves mapping out the intricacies of the code in a structured manner.

Crafting a detailed response

I’m working through a wavelet decomposition code request, ensuring a clear and comprehensive explanation. This involves breaking down the code structure, explaining function calls, and providing steps for execution.

Reasoned for 6 seconds

Answer

Этот код представляет собой лабораторную работу, цель которой — применение вейвлет-разложения для обработки изображений. Рассмотрим его по частям.

1. Загрузка и предобработка изображения

matlab
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);
  • Чтение изображения: Загружается изображение и конвертируется в оттенки серого (если оно цветное), чтобы упростить дальнейшую обработку.
  • Изменение размера: Изображение уменьшается до размера 512x512 пикселей.
  • Преобразование в диапазон [0, 1]: Для работы с изображением преобразуется в формат double, что позволяет использовать методы вейвлет-преобразования.

Затем показывается исходное изображение.

2. Вейвлет-разложение и восстановление

matlab
levels = 4; wavelets = {'haar', 'db2'}; I_reconstructed = cell(1, length(wavelets)); for w = 1:length(wavelets) waveletName = wavelets{w}; [C, S] = wavedec2(I, levels, waveletName);
  • Вейвлет-разложение: Для изображения выполняется 4-уровневое вейвлет-разложение с использованием двух типов вейвлетов: Хаара ('haar') и Добеши второго порядка ('db2').

2.1 Визуализация деталей для каждого уровня разложения

matlab
for 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
  • Извлечение деталей: Для каждого уровня разложения извлекаются горизонтальные (H), вертикальные (V) и диагональные (D) компоненты. Эти компоненты показывают детали изображения, такие как края объектов.

2.2 Удаление высокочастотных составляющих и восстановление изображения

matlab
C_zero = C; numApprox = prod(S(1,:)); C_zero(numApprox+1:end) = 0; I_lowpass = waverec2(C_zero, S, waveletName);
  • Обнуление деталей: Для удаления высокочастотных составляющих, все коэффициенты, относящиеся к деталям, обнуляются, оставляя только аппроксимацию (низкочастотную информацию).
  • Восстановление изображения: Используется функция waverec2 для восстановления изображения только с низкочастотными коэффициентами.

2.3 Сравнение с классической низкочастотной фильтрацией

matlab
I_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('Гауссов фильтр');
  • Гауссов фильтр: Для сравнения применяется классическая низкочастотная фильтрация с использованием гауссова фильтра. Показываются три изображения: исходное, отфильтрованное с помощью вейвлетов, и отфильтрованное с помощью гауссова фильтра.

3. Фильтрация с добавлением белого гауссовского шума

matlab
noiseLevels = [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);
  • Добавление шума: Для эксперимента добавляется белый гауссовский шум с разными уровнями дисперсии (низкий, средний и высокий).

Пороговая фильтрация

matlab
for 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
  • Вейвлет-порогирование: Для каждого уровня порога вычисляется восстановленное изображение после фильтрации с мягким порогированием. Также вычисляется RMSE (корень из средней квадратичной ошибки) для каждого порога.

Визуализация результатов

matlab
subplot(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));
  • График зависимости RMSE от уровня порога: Строится график зависимости RMSE от уровня порога для каждого уровня шума.
  • Лучшее восстановление: Отображается изображение, восстановленное с минимальным значением RMSE.

4. Фильтрация с добавлением шума типа "salt & pepper"

Этот раздел аналогичен предыдущему, но используется другой тип шума — "salt & pepper". Изображение зашумляется этим типом шума, и снова проводится пороговая фильтрация с вейвлетами.

Завершение работы

matlab
disp('Лабораторная работа выполнена.');

После выполнения всех операций выводится сообщение о завершении лабораторной работы.


В целом, этот код исследует использование вейвлет-разложения для обработки изображений с добавлением различных типов шума. Проводятся эксперименты с фильтрацией и восстановлением изображений, сравнивая результаты с классическими методами фильтрации и оценивая качество восстановления через RMSE.

Share this Q&A