«применять» вейвлетом на изображение, которое обычно занимает внутренний продукт вейвлета и изображение, чтобы получить единственное число, величина которого отражает то, насколько важно, чтобы вейвлет был для изображения. Если у вас есть полный набор всплесков (называемый «ортонормированным основанием») для изображения из 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-вольтовых (:) «вейвлетов, которые у вас есть, а затем вычисляет все вейвлет-коэффициенты сразу, записывая
waveletCoefficients = GW_ALL*myImg(:);
Если вы построите их со стеблем (abs (коэффициенты вейвлета)), вы заметите, что некоторые из них больше других. Большие значения - это те, которые совпадают с изображением.
И, наконец, если ваши всплески ортогональны (это не так, на самом деле, но это не очень важно здесь), вы можете попробовать и воспроизвести изображение, используя свои всплески, но имейте в виду, что у вас есть только 32 из всех возможностей и все они в центре изображения ... так что, когда мы пишем
newImage = real(GW_ALL'*waveletCoefficients);
мы получаем что-то похожее на наше исходное изображение в центре, но не на внешней стороне.
я добавил в код (ниже), чтобы получить следующие результаты:
Где модификации:
% 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
Этот подход является основой для извлечения вейвлет-коэффициентов и воспроизведения изображения. Вейвлеры Габора (как отмечено) не ортогональны (reference) и, более вероятно, будут использоваться для извлечения признаков с использованием свертки, как описано методом show_etrange. В этом случае вы можете посмотреть на добавив в ваш интерьер петли:
figure(34);
subplot(5,8, v * 8 + u);
imagesc(abs(ifft2((fft2(GW).*fft2(myImg)))));
axis off
Если размеры задают вам проблемы, вы можете рассмотреть возможность установки R = size (img, 1); C = size (img, 2) и используйте img = double (rgb2gray (img)), чтобы преобразовать в оттенки серого и сделать вычисления на этом. – Steve
Вы используете цветное изображение, представляющее собой трехмерный массив. Вы должны прочитать учебное пособие по базовому [представлению изображения] (http://www.mathworks.com/help/toolbox/images/f14-13543.html). –
Я преобразовал его в серое изображение – vini