function [Aim,Eim,Oim]=gabor_filter(img,gamma,theta,lambda,psi,b)
% [Aim,Eim,Oim]=gabor_filter3(img,gamma,theta,lambda,psi,b)
% lambda Wavelength in pixels of Gabor filter to construct
% psi phase
% theta - Angle of filter in degrees. An angle of 0 gives a
% filter that responds to vertical features.
% Returns:
% Eim - Result from filtering with the even (cosine) Gabor filter
% Oim - Result from filtering with the odd (sine) Gabor filter
% Amplitude image = sqrt(Eim.^2 + Oim.^2)
narginchk(4,6);
if nargin<6
b=1;
end
if nargin<5
psi=0;
end
sigma=lambda/pi*sqrt(log(2)/2)*(2^b+1)/(2^b-1);
if (gamma <= 1 && gamma > 0)
n = ceil(3*sigma/gamma);
else
n = ceil(3*sigma);
end
[x,y] = meshgrid(-n:n);
% Rotation
x_theta=x*cos(theta)+y*sin(theta);
y_theta=-x*sin(theta)+y*cos(theta);
gb= exp(-.5*(x_theta.^2+gamma^2*y_theta.^2)/sigma^2).*exp(1i*(2*pi/lambda*x_theta+psi));
gb_R= real(gb); % gabor function real part
gb_I= imag(gb); % gabor function imag part
Eim=conv2(double(img),gb_R,'same');
Oim=conv2(double(img),gb_I,'same');
Aim=sqrt(Eim.^2+Oim.^2); % Amplitude image = sqrt(Eim.^2 + Oim.^2)
end
clc;
clear;
f=imread('synthetic1.png');
% ori=imread('mm.jpg');
% grayimg=rgb2gray(ori);
% f=im2double(grayimg);
gamma=0.5;
lambda=8;
n=1;
k=12;
GB_img=0;
for theta=0:pi/k:(pi-pi/k)
[Aim,Eim,Oim]=gabor_filter(f,gamma,theta,lambda); % 计算各个方向滤波后的图像
GB_img=GB_img+Aim;
% figure,imshow(Aim,[]); % 显示各个方向滤波后的图像
% filename2=['D:\img\17\','filtered with gabor function',num2str(n)];
% saveas(gcf,filename2,'jpg');
% close all
subplot(2,fix(k/2),n),imshow(Aim,[])
str_1=['theta=',num2str((n-1)*180/k)];
title(str_1)
n=n+1;
end
figure,imshow(GB_img,[]);% 各个方向滤波后合成的图像,也可以阈值处理
第一张为原图,二三张为滤波后的图片
二维 旋转
[x']= [cos(θ) sin(θ)] [x]
[y']= [-sin(θ) cos(θ)] [y]
原来gabor 函数只是 二为高斯函数 乘了一个相位(复指数),后经旋转变换得到的。
现在考虑gabor 函数的实部,经过傅里叶变换后是高斯函数和一个对称的狄拉克函数的卷积 (卷积定理:一个域的乘积,相当于另一个域的卷积),再经过旋转变换,得到不同方向的滤波器,之后对图像不同方向滤波,在反变换到空域,就得到了原图像不同的纹理,这就是频域滤波!