这个gabor filter使用了正弦函数和余弦函数分别表示gabor filter 的实数部分和虚数部分。
滤波器代码如下 :
% SPATIALGABOR - applies single oriented gabor filter to an image
%
% Usage:
% [Eim, Oim, Aim] = spatialgabor(im, wavelength, angle, kx, ky, showfilter)
%
% Arguments:
% im - Image to be processed.
% wavelength - Wavelength in pixels of Gabor filter to construct
% angle - Angle of filter in degrees. An angle of 0 gives a
% filter that responds to vertical features.
% kx, ky - Scale factors specifying the filter sigma relative
% to the wavelength of the filter. This is done so
% that the shapes of the filters are invariant to the
% scale. kx controls the sigma in the x direction
% which is along the filter, and hence controls the
% bandwidth of the filter. ky controls the sigma
% across the filter and hence controls the
% orientational selectivity of the filter. A value of
% 0.5 for both kx and ky is a good starting point.
% showfilter - An optional flag 0/1. When set an image of the
% even filter is displayed for inspection.
%
% Returns:
% Eim - Result from filtering with the even (cosine) Gabor filter
% Oim - Result from filtering with the odd (sine) Gabor filter
% Aim - Amplitude image = sqrt(Eim.^2 + Oim.^2)
%
% Peter Kovesi
% School of Computer Science & Software Engineering
% The University of Western Australia
% pk at csse uwa edu au
% http://www.csse.uwa.edu.au/~pk
%
% October 2006
function [Eim, Oim, Aim, Filter] = spatialgabor(im, wavelength, angle, kx, ky, showfilter)
% 添加的参数直接测试用
%ori=imread('C:\Users\watkins\Pictures\cartoon.jpg');
%grayimg=rgb2gray(ori);
%im=im2double(grayimg);
%wavelength=3;
%angle=90;
%kx=0.5;
%ky=0.5;
%showfilter=1;
if nargin == 5
showfilter = 0;
end
im = double(im);
% Construct even and odd Gabor filters
sigmax = wavelength*kx;
sigmay = wavelength*ky;
sze = round(3*max(sigmax,sigmay));
[x,y] = meshgrid(-sze:sze);
evenFilter = exp(-(x.^2/sigmax^2 + y.^2/sigmay^2)/2)...
.*cos(2*pi*(1/wavelength)*x);
oddFilter = exp(-(x.^2/sigmax^2 + y.^2/sigmay^2)/2)...
.*sin(2*pi*(1/wavelength)*x);
evenFilter = imrotate(evenFilter, angle, 'bilinear');
oddFilter = imrotate(oddFilter, angle, 'bilinear');
Filter=evenFilter;
% Do the filtering
Eim = filter2(evenFilter,im); % Even filter result
Oim = filter2(oddFilter,im); % Odd filter result
Aim = sqrt(Eim.^2 + Oim.^2); % Amplitude
if showfilter % Display filter for inspection
figure(1), imshow(evenFilter,[]); title('filter');
end
调用代码:
ori=imread('C:\Users\watkins\Pictures\cartoon.jpg');
grayimg=rgb2gray(ori);
gim=im2double(grayimg);
%[Eim,Oim,Aim]=spatialgabor(gim,3,90,0.5,0.5,1);%90-vertical===0-horizontal
[Eim,Oim,Aim,Filter]=spatialgabor(gim,4,90,0.95,0.95,0);%90-vertical===0-horizontal
%add by watkins
%theta=[0 pi/4 2*pi/4 3*pi/4 4*pi/4 5*pi/4 6*pi/4 7*pi/4];
theta=[0 pi/4*360 2*pi/4*360 3*pi/4*360 4*pi/4*360 5*pi/4*360 6*pi/4*360 7*pi/4*360 ];
gamma=1;
psi=0;
sigma=6; % 也可以为12
lambda=[3 4 5 6 7];
[nh nw]=size(Filter);
G=cell(5,8);
for i = 1:5
for j = 1:8
G{i,j}=zeros(nh,nw);
end
end
for i = 1:5
for j = 1:8
[Eim,Oim,Aim,Filter] = spatialgabor(gim,lambda(i),theta(j),0.95,0.95);
G{i,j}=Filter;
end
end
%plot
figure;
for i = 1:5
for j = 1:8
subplot(5,8,(i-1)*8+j);
%imshow(real(G{s,j})/2-0.5,[]);
imshow(real(G{i,j}),[]);
end
end
%figure(2);
%imshow(Aim);
%imshow(Eim);
%imshow(Oim);
滤波器组的图片为: