Этот пример показывает, как использовать вейвлеты для денуизации сигналов и изображений. Поскольку вейвлеты локализуют функции в ваших данных в разных шкалах, можно сохранить важные функции сигнала или изображения при удалении шума. Основная идея вейвлет- шумоподавление, или вейвлет-порога, заключается в том, что вейвлет-преобразование приводит к разреженному представлению для многих реальных сигналов и изображений. Это означает, что преобразование вейвлета концентрирует функции сигнала и изображения в нескольких коэффициентах вейвлета больших величин. Коэффициенты вейвлета, которые малы по значению, обычно являются шумом, и можно «сжать» эти коэффициенты или удалить их, не влияя на качество сигнала или изображения. После того, как вы порогами коэффициенты, вы восстанавливаете данные с помощью обратного преобразования вейвлета.
Чтобы проиллюстрировать шумоподавление вейвлетов, создайте зашумленный сигнал «шишки». В этом случае у вас есть и исходный сигнал, и шумная версия.
rng default; [X,XN] = wnoise('bumps',10,sqrt(6)); subplot(211) plot(X); title('Original Signal'); AX = gca; AX.YLim = [0 12]; subplot(212) plot(XN); title('Noisy Signal'); AX = gca; AX.YLim = [0 12];
Денуризируйте сигнал до уровня 4 с помощью wdenoise
с настройками по умолчанию. wdenoise
использует децимированное вейвлет. Постройте график результата вместе с исходным сигналом.
xd = wdenoise(XN,4); figure; plot(X,'r') hold on; plot(xd) legend('Original Signal','Denoised Signal','Location','NorthEastOutside') axis tight; hold off;
Можно также обнулить сигнал, используя неопределенное вейвлет. Денуризируйте сигнал снова до уровня 4, используя неопределенный вейвлет преобразование. Постройте график результата вместе с исходным сигналом.
xdMODWT = wden(XN,'modwtsqtwolog','s','mln',4,'sym4'); figure; plot(X,'r') hold on; plot(xdMODWT) legend('Original Signal','Denoised Signal','Location','NorthEastOutside') axis tight; hold off;
Вы видите, что в обоих случаях шумоподавление вейвлет удалило значительное количество шума при сохранении острых функций в сигнале. Это вызов для шумоподавления на основе Фурье. При шумоподавлении или фильтрации на основе Фурье вы применяете lowpass, чтобы удалить шум. Однако, когда данные имеют высокочастотные функции, такие как всплески в сигнале или ребра в изображении, фильтр lowpass сглаживает их.
Можно также использовать вейвлеты, чтобы денуизировать сигналы, в которых шум неоднороден. Импортируйте и исследуйте фрагмент сигнала, показывающего потребление электроэнергии с течением времени.
load leleccum; indx = 2000:3450; x = leleccum(indx); plot(x) grid on;
Сигнал, по-видимому, имеет больше шума после приблизительно выборки 500. Соответственно, вы хотите использовать различное пороговое значение в начальной части сигнала. Можно использовать cmddenoise
определить оптимальное количество интервалов для денуизации и денуизации сигнала. В этом примере используйте вейвлет 'db3' и разложите данные до уровня 3.
[SIGDEN,~,thrParams,~,BestNbOfInt] = cmddenoise(x,'db3',3);
Отображение количества интервалов и выборочных значений, разделяющих интервалы.
BestNbOfInt
BestNbOfInt = 2
thrParams{1}(:,1:2)
ans = 2×2
1 412
412 1451
Выявлено два интервала. Значение выборки, обозначающее контур между двумя сегментами, равно 412. Если вы постройте график сигнала и отметите два сегмента сигнала, вы увидите, что шум действительно выглядит различным до и после выборки 412.
plot(x) hold on; plot([412 412],[100 550],'r') hold off;
Постройте график деноизмененного сигнала.
plot(SIGDEN)
title('Denoised Signal')
Можно также использовать вейвлеты для денуизации изображений. На изображениях ребер являются местами, где яркость изображения изменяется быстро. Поддержание ребер при шумоподавлении изображения критически важно для перцептивного качества. В то время как традиционная фильтрация lowpass удаляет шум, она часто сглаживает ребра и отрицательно влияет на качество изображения. Вейвлеты способны удалять шум при сохранении восприимчиво важных функций.
Загрузите шумное изображение. Денуризируйте изображение с помощью wdenoise2
с настройками по умолчанию. По умолчанию wdenoise2
использует биортогональный вейвлет bior4.4
. Чтобы отобразить оригинальные и деноизированные изображения, не предоставляйте никаких выходных аргументов.
load('jump.mat')
wdenoise2(jump)
Обратите внимание, что ребра в изображении не сглаживаются процессом шумоподавления.