I was reading a paper about Gist features. I was interested about its code implementation which i found it here). Into LMgist.m there is a function called createGabor, this is the code:

function G = createGabor(or, n)
% G = createGabor(numberOfOrientationsPerScale, n);
% Precomputes filter transfer functions. All computations are done on the
% Fourier domain. 
% If you call this function without output arguments it will show the
% tiling of the Fourier domain.
% Input
%     numberOfOrientationsPerScale = vector that contains the number of
%                                orientations at each scale (from HF to BF)
%     n = imagesize = [nrows ncols] 
% output
%     G = transfer functions for a jet of gabor filters

Nscales = length(or);
Nfilters = sum(or);

if length(n) == 1
    n = [n(1) n(1)];

for i=1:Nscales
    for j=1:or(i)
        param(l,:)=[.35 .3/(1.85^(i-1)) 16*or(i)^2/32^2 pi/(or(i))*(j-1)];

% Frequencies:
%[fx, fy] = meshgrid(-n/2:n/2-1);
[fx, fy] = meshgrid(-n(2)/2:n(2)/2-1, -n(1)/2:n(1)/2-1);
fr = fftshift(sqrt(fx.^2+fy.^2));
t = fftshift(angle(fx+sqrt(-1)*fy));

% Transfer functions:
G=zeros([n(1) n(2) Nfilters]);
for i=1:Nfilters


if nargout == 0
    for i=1:Nfilters
        contour(fx, fy, fftshift(G(:,:,i)),[1 .7 .6],'r');
        hold on
    axis([-n(2)/2 n(2)/2 -n(1)/2 n(1)/2])
    xlabel('f_x (cycles per image)')
    ylabel('f_y (cycles per image)')
    grid on

If you run this function with the input parameters or = [8 8 8 8] and n = 192 (as in the original implementation) it should create this image: enter image description here

This image shows the contours of the gabor filters in the frequency domain for z = 0.6, z= 0.7.

Unfortunately this gabor filter implementation is different from what i've seen so far. My questions are:

  1. Look at the matrix param, the second column definitely seems to be the frequency scale, where fmax = 0.3 and c = 1.85 is the constant. The fourth column definitely seems to be the orientation scale. The first column is a constant of value 0.35; the only reference i've found in that paper about 0.35 is this sentence (page 8, right column):

    The model of Eq. (7) provides correct fitting for all the eight categories for frequencies below 0.35 cycles/pixel (as noise and aliasing corrupt higher spatial frequencies, see Fig. 4)

    So what the first and third column represent?

  2. Which brings me to this line of code: G(:,:,i)=exp(-10*param(i,1)*(fr/n(2)/param(i,2)-1).^2-2*param(i,3)* pi *tr.^2); this implementation is very different from what i've seen so far, i don't think i recognize the formulation. In particular the second term of the exponential: 2*param(i,3)* pi *tr.^2 controls the orientation scale and also the particular "stretch" of the gaussian in the frequency domain as shown in the picture, which I think is used to get a better filter overlap in the frequency domain. Can somebody clear up this implementation?

1 Answer 1


Here is my understanding of these points. I apologize if my answer comes too late. I post it anyway in the hope it helps someone.

  1. The 4 parameters in the param vector respectively controls the radial width, radial location, angular width, and angular location of the filter in the Fourier domain. In other words, the filter's response is a (separable) Gaussian function of the frequency modulus and orientation (that is, the polar coordinates). The parameters #2 and #4 gives the location of this Gaussian while parameters #1 and #3 gives its scale. However, I have no explanation regarding the "magic" values (maybe they were simply obtained by trial & error).

  2. These filters are not Gabor filters since their Fourier transforms are not Gaussian functions of the 2D frequencies. On the figure you showed, Gabor filters would result in ellipsoid curves instead of these drop-shaped curves. I guess the authors made this choice to have a better coverage of the spectral plane.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.