How to apply Gabor wavelets to an image?

前端 未结 2 1531
隐瞒了意图╮
隐瞒了意图╮ 2020-12-02 19:20

How do i apply these Gabor filter wavelets on an image ?

\"enter

close         


        
2条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-02 19:41

    To "apply" a wavelet to an image you typically take the inner product of the wavelet and the image to get a single number whose magnitude represents how relevant that wavelet is to the image. If you have a full set of wavelets (called an "orthonormal basis") for an image of 128 rows and 128 columns you would have 128*128 = 16,384 different wavelets. You only have 40 here but you work with what you have.

    To get the wavelet coefficient you can take an image, say this one:

    t = linspace(-6*pi,6*pi,128);
    myImg = sin(t)'*cos(t) + sin(t/3)'*cos(t/3);
    

    and take the inner product of this and one of the basis vectors GW like this:

    myCoef = GW(:)'*myImg(:);
    

    I like to stack up all my wavelets into a matrix GW_ALL where each row is one of the 32 GW(:)' wavelets you have and then calculate all the wavelet coefficients at once by writing

    waveletCoefficients = GW_ALL*myImg(:);
    

    If you plot these with stem(abs(waveletCoefficients)) you will notice that some are larger than others. Large values are those that match will with the image.

    Finally, assuming your wavelets are orthogonal (they aren't, actually but that's not terribly important here), you could try and reproduce the image using your wavelets, but keep in mind you only have 32 of the total possibilities and they are all at the center of the image... so when we write

    newImage = real(GW_ALL'*waveletCoefficients);
    

    we get something similar to our original image in the center but not on the outsides.

    I added to your code (below) to get the following results: enter image description here

    Where the modifications are:

    % 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
    

    This approach forms the basis for extracting wavelet coefficients and reproducing an image. Gabor Wavelets are (as noted) not orthogonal (reference) and are more likely to be used for feature extraction using convolution as described by reve_etrange. In this case you might look at adding this to your interior loop:

     figure(34);
     subplot(5,8, v * 8 + u );
     imagesc(abs(ifft2((fft2(GW).*fft2(myImg)))));
     axis off
    

提交回复
热议问题