Чтобы «применить» вейвлет к изображению, вы обычно берете внутреннее произведение вейвлета и изображение, чтобы получить одно число, величина которого показывает, насколько этот вейвлет имеет отношение к изображению.Если у вас есть полный набор вейвлетов (называемых «ортонормированным базисом») для изображения из 128 строк и 128 столбцов, у вас будет 128 * 128 = 16 384 разных вейвлетов.У вас есть только 40, но вы работаете с тем, что у вас есть.
Чтобы получить коэффициент вейвлета, вы можете сделать снимок, скажем так:
t = linspace(-6*pi,6*pi,128);
myImg = sin(t)'*cos(t) + sin(t/3)'*cos(t/3);
и возьмите внутренний продукт этогои один из базовых векторов GW, например, такой:
myCoef = GW(:)'*myImg(:);
Мне нравится складывать все мои вейвлеты в матрицу GW_ALL, где каждая строка является одним из 32-ваттлетов в 32 ГВт (:), которые у вас есть, а затем вычислятьвсе вейвлет-коэффициенты за один раз, написав
waveletCoefficients = GW_ALL*myImg(:);
Если вы нанесете их с помощью стебля (abs (waveletCoefficients)), вы заметите, что некоторые из них больше, чем другие.Большие значения - это те, которые будут соответствовать изображению.
Наконец, предполагая, что ваши вейвлеты ортогональны (на самом деле это не так, но это не очень важно), вы можете попытаться воспроизвести изображение с помощью ваших вейвлетов,но имейте в виду, что у вас есть только 32 из всех возможностей, и все они находятся в центре изображения ... поэтому, когда мы пишем
newImage = real(GW_ALL'*waveletCoefficients);
, мы получаем что-то похожее на наше исходное изображение в центре, ноне снаружи.
Я добавил в ваш код (ниже), чтобы получить следующие результаты: ![enter image description here](https://i.stack.imgur.com/628n8.png)
Где модификации:
% function gaborTest()
close all;
clear all;
clc;
% Parameter Setting
R = 128;
C = 128;
Kmax = pi / 2;
f = sqrt( 2 );
Delt = 2 * pi;
Delt2 = Delt * Delt;
% GW_ALL = nan(32, C*R);
% Show the Gabor Wavelets
for v = 0 : 4
for u = 1 : 8
GW = GaborWavelet ( R, C, Kmax, f, u, v, Delt2 ); % Create the Gabor wavelets
figure( 2 );
subplot( 5, 8, v * 8 + u ),imshow ( real( GW ) ,[]); % Show the real part of Gabor wavelets
GW_ALL( v*8+u, :) = GW(:);
end
figure ( 3 );
subplot( 1, 5, v + 1 ),imshow ( abs( GW ),[]); % Show the magnitude of Gabor wavelets
end
%% Create an Image:
t = linspace(-6*pi,6*pi,128);
myImg = sin(t)'*cos(t) + sin(t/3)'*cos(t/3);
figure(3333);
clf
subplot(1,3,1);
imagesc(myImg);
title('My Image');
axis image
%% Get the coefficients of the wavelets and plot:
waveletCoefficients = GW_ALL*myImg(:);
subplot(1,3,2);
stem(abs(waveletCoefficients));
title('Wavelet Coefficients')
%% Try and recreate the image from just a few wavelets.
% (we would need C*R wavelets to recreate perfectly)
subplot(1,3,3);
imagesc(reshape(real(GW_ALL'*waveletCoefficients),128,128))
title('My Image Reproduced from Wavelets');
axis image
Этот подходобразует основу для извлечения вейвлет-коэффициентов и воспроизведения изображения.Вейвлеты Габора (как отмечено) не являются ортогональными ( эталон ) и с большей вероятностью будут использоваться для извлечения признаков с использованием свертки, как описано в reve_etrange.В этом случае вы можете добавить это к своему внутреннему циклу:
figure(34);
subplot(5,8, v * 8 + u );
imagesc(abs(ifft2((fft2(GW).*fft2(myImg)))));
axis off