matlab实现gabor filter (9) 效果很好

gabor filter:

 

function result = gaborkernel2d(lambda, sigma, theta, phi, gamma, bandwidth)
% VERSION 2004-04-05
% CREATED BY: N. Petkov and M.B. Wieling, Groningen University
%
% GABORKERNEL2D(LAMBDA, SIGMA, THETA, PHI, GAMMA, BANDWIDTH) 
%   fills a (2N+1)*(2N+1) matrix with the values of a 2D Gabor function. N is computed from SIGMA.
%     LAMBDA - preferred wavelength (period of the cosine factor) [in pixels]
%     SIGMA - standard deviation of the Gaussian factor [in pixels]
%     THETA - preferred orientation [in radians]; can be a 1D array 
%     PHI   - phase offset [in radians] of the cosine factor; can be a 1D array
%     GAMMA - spatial aspect ratio (of the x- and y-axis of the Gaussian elipse)
%     BANDWIDTH - spatial frequency bandwidth at half response,
%       BANDWIDTH, SIGMA and LAMBDA are interdependent. To use BANDWIDTH, 
%       the input value of one of SIGMA or LAMBDA must be 0. Otherwise BANDWIDTH is ignored.
%       The actual value of the parameter whose input value is 0 is computed inside the 
%       function from the input vallues of BANDWIDTH and the other parameter.

theta = theta(1); % if theta is an array, only the first value is used
phi = phi(1); % if phi is an array, only the first value is used

% calculation of the ratio sigma/lambda from BANDWIDTH 
% according to Kruizinga and Petkov, 1999 IEEE Trans on Image Processing 8 (10) p.1396
% note that in Matlab log means ln  
slratio = (1/pi) * sqrt( (log(2)/2) ) * ( (2^bandwidth + 1) / (2^bandwidth - 1) );
% e.g. BANDWITH = 1 will result in the slratio = 0.56

% test if the sigma/lambda ratio is to be used and set sigma or lambda to the correct value
if (sigma == 0)
  sigma = slratio * lambda;
elseif (lambda == 0)
  lambda = sigma / slratio;
end

% compute the size of the 2n+1 x 2n+1 matrix to be filled with the values of a Gabor function
% this size depends on sigma and gamma
if (gamma <= 1 && gamma > 0)
	n = ceil(2.5*sigma/gamma);
else
	n = ceil(2.5*sigma);
end

% creation of two (2n+1) x (2n+1) matrices x and y that contain the x- and y-coordinates of
% a square 2D-mesh; the rows of x and the columns of y are copies of the vector -n:n
[x,y] = meshgrid(-n:n);

% change direction of y-axis (In Matlab the vertical axis corresponds to the row index
% of a matrix. If the y-coordinates run from -n to n, the lowest value (-n) comes
% in the top row of the matrix ycoords and the highest value (n) in the
% lowest row. This is oposite to the customary rendering of values on the y-axis: lowest value 
% in the bottom, highest on the top. Therefore the y-axis is inverted:
y = -y;

% xp and yp are the coordinates of a point in a coordinate system rotated by theta.
% They are the main axes of the elipse of the Gaussian factor of the Gabor function.
% The wave vector of the Gabor function is along the xp axis.
xp =  x * cos(theta) + y * sin(theta);
yp = -x * sin(theta) + y * cos(theta);

% precompute coefficients gamma2=gamma*gamma, b=1/(2*sigma*sigma) and spacial frequency
% f = 2*pi/lambda to prevent multiple evaluations 
gamma2 = gamma*gamma;
b = 1 / (2*sigma*sigma);
a = b / pi;
f = 2*pi/lambda;

% filling (2n+1) x (2n+1) matrix result with the values of a 2D Gabor function
result = a*exp(-b*(xp.*xp + gamma2*(yp.*yp))) .* cos(f*xp + phi);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% NORMALIZATION of positive and negative values to ensure that the integral of the kernel is 0.
% This is needed when phi is different from pi/2.
ppos = find(result > 0); %pointer list to indices of elements of result which are positive
pneg = find(result < 0); %pointer list to indices of elements of result which are negative 

pos =     sum(result(ppos));  % sum of the positive elements of result
neg = abs(sum(result(pneg))); % abs value of sum of the negative elements of result
meansum = (pos+neg)/2;
if (meansum > 0) 
    pos = pos / meansum; % normalization coefficient for negative values of result
    neg = neg / meansum; % normalization coefficient for psoitive values of result
end

result(pneg) = pos*result(pneg);
result(ppos) = neg*result(ppos);


调用代码:

 

% 测试用程序
theta = [0 pi/4 2*pi/4 3*pi/4 4*pi/4 5*pi/4 6*pi/4 7*pi/4];
lambda = [4 5 6 7 8];
psi = 0;
gamma = 1;
bw = 0.5;

% 计算每个滤波器
figure;
for i = 1:5
    for j = 1:8
        gaborFilter=gaborkernel2d(lambda(i), 0, theta(j), psi, gamma, bw);
        %figure;
        %imshow(real(gaborFilter),[]);
        subplot(5,8,(i-1)*8+j);
        imshow(real(gaborFilter),[]);
    end
end


 

生成的滤波器组图像:

matlab实现gabor filter (9) 效果很好_第1张图片

 

 

你可能感兴趣的:(vector,function,filter,matlab,lambda,Matrix)