# Gabor filter bank for gist features

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)];
end

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

% 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
tr=t+param(i,4);
tr=tr+2*pi*(tr<-pi)-2*pi*(tr>pi);

G(:,:,i)=exp(-10*param(i,1)*(fr/n(2)/param(i,2)-1).^2-2*param(i,3)*pi*tr.^2);
end

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


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:

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?