Преобразования Хаара для данных временных рядов и изображений

В этом примере показано, как использовать Преобразования Хаара, чтобы анализировать данные временных рядов и изображения. Чтобы запустить весь код в этом примере, у вас должны быть Signal Processing Toolbox™ и Image Processing Toolbox™.

Во-первых, визуализируйте вейвлет Хаара.

[~,psi,x] = wavefun('haar',10);
x = x(2:end-1);
psi = psi(2:end-1);
hl = plot(x(1:512),psi(1:512));
grid on
hold on
line(x(513:end),psi(513:end))
xlabel('t')
ylabel('\psi(t)','fontsize',14)
title('Haar Wavelet')

Вейвлет Хаара прерывист. В результате это обычно не используется в приложениях шумоподавления или сжатия, где гладкость вейвлета реконструкции является важным соображением. Однако Преобразования Хаара полезны во многих приложениях из-за их превосходящего времени (пространственная) локализация и вычислительный КПД. Wavelet Toolbox™ поддерживает анализ Хаара в большинстве дискретных аналитических инструментов вейвлета. Этот пример показывает Хаар, снимающий реализации, которые поддерживают вейвлет от целого числа к целому числу, преобразовывает и для 1D и для 2D данные и многоканальные (многомерные) 1D данные.

Анализируйте изменчивость сигнала шкалой

Загрузите и постройте clock_571 набор данных. Этим примером является по существу воссоздание анализа, представленного в Percival & Walden [3], стр 13–16.

load clock_571;
figure;
plot(clock_571)
xlabel('Days')
grid on;
title('Daily Average Fractional Frequency Deviates -- Cesium Clock');

Данные являются ежедневной средней дробной частотой, отклоняется для атомарных часов луча конкретного цезия относительно американского Военно-морского основного тактового генератора Обсерватории. Если значение временных рядов 0, который означает, что цезиевые часы ни не проиграли, ни выиграли время относительно основного тактового генератора по длительности дня. Если значение отрицательно, часы потеряли время в тот день, положительное значение означает, что часы выиграли время. Для этих данных значения являются всем отрицанием. Для определенных приложений, как геодезия, важно знать, существуют ли определенные масштабы времени, где отклонение часов от основного тактового генератора в его самом низком значении. Другими словами, есть ли определенные шкалы, где часы соглашаются наиболее тесно с основным тактовым генератором? Преобразование Хаара полезно здесь, потому что оно обладает двумя важными свойствами: Это декоррелирует данные шкалой, и это делит энергию сигнала среди шкалы.

Чтобы проиллюстрировать свойство декорреляции, получите Преобразование Хаара вниз к уровню 6. Постройте последовательность автокорреляции исходных данных наряду с автокорреляцией коэффициентов вейвлета шкалой для шкал 2,4,8,16, и 32 дня. Пунктирные линии на графиках формируют рисунок 95% доверительных интервалов для белых шумовых входных параметров. Значения, превышающие те линии, показательны из значительной автокорреляции в данных.

[s,w] = haart(clock_571,6);
helperAutoCorr(clock_571,w);

Главный график показывает последовательность автокорреляции для исходных данных. Последующие графики показывают последовательности автокорреляции для коэффициентов вейвлета во все больше более грубых шкалах. Ясно, что последовательность автокорреляции исходных данных показывает корреляцию во всех задержках, в то время как коэффициенты Преобразования Хаара декоррелируются. Затем продемонстрируйте энергосбережение.

sigenergy = norm(clock_571,2)^2
energyByScale = cellfun(@(x)norm(x,2)^2,w);
haarenergy = norm(s,2)^2+sum(energyByScale)
sigenergy =

   2.7964e+05


haarenergy =

   2.7964e+05

Общая энергия сигнала сохраняется Преобразованием Хаара. Из-за этих свойств можно сделать значимые выводы на основе пропорции энергии сигнала полученными коэффициентами вейвлета в каждой шкале.

scales = 2.^(1:6);
figure
plot(scales,energyByScale,'-o')
xlabel('Scale (days)')
set(gca,'xscale','log')
set(gca,'xtick',2.^(1:6))
ylabel('Proportion of Signal Energy')
grid on

Вы видите, что энергия как минимум для шкал 16 и 32 дней. Для вейвлета Хаара (и всех вейвлетов Daubechies), коэффициенты вейвлета в данной шкале представляют различия между взвешенными средними данных по длительности 1/2 длина шкалы. Этот график показывает шкалы, по которым цезиевые часы находятся в лучшем соглашении с основным тактовым генератором. Это означает, что, рассматривая данные приблизительно 2D неделя или даже одномесячные периоды более точны, чем данные по меньшим или более длинным шкалам. Как ранее упомянуто, это имеет важные последствия для геодезии, где чрезвычайно точные измерения времени очень важны.

Несмотря на то, что вейвлет Хаара прерывист, это все еще эффективно при представлении различных видов временных рядов. Примеры включают данные о количестве и данные, где значения временных рядов связываются к некоторому определенному состоянию, которое влияет на уровень временных рядов. Как пример, рассмотрите отношение между сердечным ритмом и состоянием сна.

Создайте приближения сигнала

Данные состоят из двух временных рядов. Временные ряды являются сердечным ритмом 66-дневного старого младенца, производимого каждые 16 секунд в течение чуть более чем 9 часов. Временные ряды сердечного ритма с целочисленным знаком. Другие временные ряды являются квалифицированно выигранным состоянием сна того же младенца за тот же период с тем же уровнем выборки. Данные о состоянии сна были выиграны на основе EEG младенца и EOG (движение глаз) данные, не на основе сердечного ритма. Коды состояния сна 1=quiet сон, 2=between тихий и активный сон, 3=active сон, и 4=awake. И временные ряды были зарегистрированы профессором Питером Флемингом, доктором Эндрю Сокзенко и Жанин Янг из Института Здоровья детей, Королевской Больницы для Больных Дочерних элементов, Бристоля и любезно предусмотрены использование в этом примере. Отобразите данные о сердечном ритме на графике наряду с состояниями сна.

load BabyECGData
figure
yyaxis left
plot(times,HR)
ylabel('HR')
xlabel('Hrs')
YLim = [min(HR)-1 max(HR)+1];
yyaxis right
plot(times,SS)
ylabel('Sleep State')
YLim = [0.5 4.5];
title('Baby ECG and Sleep State')

Контроль данных показывает очевидную корреляцию между состоянием сна и сердечным ритмом, но данные являются чрезвычайно шумными. Поскольку Преобразование Хаара предоставляет приближение лестницы сигналу, часто полезно в ситуациях, где ответ зависит от переменного предиктора с небольшим количеством дискретных состояний. Здесь дискретные состояния являются четырьмя этапами сна. Получите приближение Хаара данных о сердечном ритме с помощью приближения уровня 5. Поскольку данные о сердечном ритме с целочисленным знаком, используйте 'integer' отметьте, чтобы гарантировать, что данные с целочисленным знаком возвращены. Постройте результат.

[S,W] = haart(HR,'integer');
HaarHR = ihaart(S,W,5,'integer');
figure
hL = plotyy(times,HaarHR,times,SS);
Ax1 = hL(1);
Ax2 = hL(2);
Ax1.YLim = [min(HaarHR)-1 max(HaarHR)+1];
Ax1.YLabel.String = 'HR';
Ax2.YLim = [0.5 4.5];
Ax2.YLabel.String = 'Sleep State';
xlabel('Hrs')
title('Haar Approximation and Sleep State')

Приближение Хаара больше ясно показывает отношение между состоянием сна и данными о сердечном ритме. Можно оценить это изменение путем рассмотрения корреляции между необработанными данными и временными рядами состояния сна.

corr(SS,HR)
ans =

    0.5576

Теперь сравните значение 0,56 с корреляцией между данными о состоянии сна и приближением Хаара

corr(SS,HaarHR)
ans =

    0.6907

Корреляция увеличилась с 0,56 до 0,69. Более усовершенствованный анализ вейвлета и моделирование этих данных представлены в Нэзоне, von Sachs, & Kroisandt [1] и Nason, Sapatinas, & Sawczenko [2].

Цифровое создание водяных знаков изображений

Создание водяных знаков является важным инструментом защиты данных. Это - пассивный метод защиты, где маркер тайно вставляется в некоторые данные для того, чтобы проверить подлинность или целостность данных. Методы вейвлета в целом и Преобразование Хаара в частности часто используются в создании водяных знаков на изображениях. Этот пример иллюстрирует использование Преобразования Хаара в создании водяных знаков на изображении и восстановлении водяного знака. Пример использует простую схему создания водяных знаков, выбранную для простоты рисунка. В этой схеме водяной знак вставляется в коэффициенты приближения на уровне 3.

Делайте водяные знаки на изображении Mandril с одним из медового барсука. Читайте в изображении Мандрила. Измените размер его к 2048x2048 и отобразите результат.

coverIM = imread('mandrill.jpg');
coverIM = rgb2gray(coverIM);
coverIM = imresize(im2double(coverIM),[2048 2048]);
imagesc(coverIM)
colormap gray
title('Original Image to Watermark')
axis off
axis square

Получите Преобразование Хаара изображения Мандрила вниз к уровню 3.

[LLorig,LHorig,HLorig,HHorig] = haart2(coverIM,3);
imagesc(LLorig)
title('Level 3 Haar Approximation')
axis off
axis square

Читайте в водяном знаке, отображают и изменяют размер его.

watermark = imread('honeybadger.jpg');
watermark = im2double(rgb2gray(watermark));
watermark = imresize(watermark,[2048 2048]);

Получите Преобразование Хаара изображения водяного знака вниз к уровню 3.

[LLw,LHw,HLw,HHw] = haart2(watermark,3);
imagesc(LLw)
colormap gray
title('Level 3 Haar Approximation--Watermark')
axis off
axis square

Добавьте медовый водяной знак барсука в изображение Mandril путем ослабления коэффициентов приближения уровня 3 водяного знака и вставки ослабленных коэффициентов в коэффициенты приближения Мандрила уровня 3.

LLwatermarked = LLorig+1e-4*LLw;
markedIM = ihaart2(LLwatermarked,LHorig,HLorig,HHorig);
imagesc(markedIM)
title('Watermarked Image')
axis off
axis square
colormap gray

Водяной знак (медовый барсук) не отображается в изображении, на котором делают водяные знаки. Поскольку вы знаете, какой алгоритм использовался, чтобы вставить водяной знак, можно восстановить водяной знак с помощью Преобразования Хаара.

[LLr,LHr,HLr,HHr] = haart2(markedIM,3);
LLmarked = (LLr-LLorig).*1e4;
imagesc(LLmarked)
title('Recovered Watermark')
colormap gray
axis off
axis square