62 lines
1.9 KiB
Matlab
62 lines
1.9 KiB
Matlab
function F=makeLMfilters
|
|
% Returns the LML filter bank of size 49x49x48 in F. To convolve an
|
|
% image I with the filter bank you can either use the matlab function
|
|
% conv2, i.e. responses(:,:,i)=conv2(I,F(:,:,i),'valid'), or use the
|
|
% Fourier transform.
|
|
|
|
SUP=49; % Support of the largest filter (must be odd)
|
|
SCALEX=sqrt(2).^[1:3]; % Sigma_{x} for the oriented filters
|
|
NORIENT=6; % Number of orientations
|
|
|
|
NROTINV=12;
|
|
NBAR=length(SCALEX)*NORIENT;
|
|
NEDGE=length(SCALEX)*NORIENT;
|
|
NF=NBAR+NEDGE+NROTINV;
|
|
F=zeros(SUP,SUP,NF);
|
|
hsup=(SUP-1)/2;
|
|
[x,y]=meshgrid([-hsup:hsup],[hsup:-1:-hsup]);
|
|
orgpts=[x(:) y(:)]';
|
|
|
|
count=1;
|
|
for scale=1:length(SCALEX),
|
|
for orient=0:NORIENT-1,
|
|
angle=pi*orient/NORIENT; % Not 2pi as filters have symmetry
|
|
c=cos(angle);s=sin(angle);
|
|
rotpts=[c -s;s c]*orgpts;
|
|
F(:,:,count)=makefilter(SCALEX(scale),0,1,rotpts,SUP);
|
|
F(:,:,count+NEDGE)=makefilter(SCALEX(scale),0,2,rotpts,SUP);
|
|
count=count+1;
|
|
end;
|
|
end;
|
|
|
|
count=NBAR+NEDGE+1;
|
|
SCALES=sqrt(2).^[1:4];
|
|
for i=1:length(SCALES),
|
|
F(:,:,count)=normalise(fspecial('gaussian',SUP,SCALES(i)));
|
|
F(:,:,count+1)=normalise(fspecial('log',SUP,SCALES(i)));
|
|
F(:,:,count+2)=normalise(fspecial('log',SUP,3*SCALES(i)));
|
|
count=count+3;
|
|
end;
|
|
return
|
|
|
|
function f=makefilter(scale,phasex,phasey,pts,sup)
|
|
gx=gauss1d(3*scale,0,pts(1,:),phasex);
|
|
gy=gauss1d(scale,0,pts(2,:),phasey);
|
|
f=normalise(reshape(gx.*gy,sup,sup));
|
|
return
|
|
|
|
function g=gauss1d(sigma,mean,x,ord)
|
|
% Function to compute gaussian derivatives of order 0 <= ord < 3
|
|
% evaluated at x.
|
|
|
|
x=x-mean;num=x.*x;
|
|
variance=sigma^2;
|
|
denom=2*variance;
|
|
g=exp(-num/denom)/(pi*denom)^0.5;
|
|
switch ord,
|
|
case 1, g=-g.*(x/variance);
|
|
case 2, g=g.*((num-variance)/(variance^2));
|
|
end;
|
|
return
|
|
|
|
function f=normalise(f), f=f-mean(f(:)); f=f/sum(abs(f(:))); return |