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:
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?
- 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?