总算是对gabor滤波器有了一个大概的了解,所以趁还热着,赶紧记录一下。
写的话,先给自己梳理下要写什么吧:
1. 什么是gabor滤波器,公式定义
2. gabor滤波器的代码实现
3. 实验结果图
4. 借鉴的资料
1. gabor滤波器简介(主要copy吧)
在图像处理中,Gabor函数是一个用于边缘提取的线性滤波器。Gabor滤波器的频率和方向表达同人类视觉系统类似。研究发现,Gabor滤波器十分适合纹理表达和分离。在空间域中,一个二维Gabor滤波器是一个由正弦平面波调制的高斯核函数。
还有,生物学实验发现,Gabor滤波器可以很好地近似单细胞的感受野函数(光强刺激下的传递函数),什么视皮层内的超柱,bla...bla,总之是这方面仿生的数学模型。
另外,网上有一种说法,gabor分为实部和虚部,用实部进行滤波后图像会平滑;虚部滤波后用来检测边缘。【来自百度知道某个大神的回答】,我查了文献,发现的确有人用Gabor的奇函数部分做边缘提取(《基于Gabor滤波器的边缘检测算法》 无线电工程 2000年第3卷第30期)。另外,从我的实验结果也有类似的发现。暂且认为这个对的吧。
Gabor滤波器的脉冲响应,可以定义为一个正弦波(对于二维Gabor滤波器是正弦平面波)乘以高斯函数。由于乘法卷积性质,Gabor滤波器的脉冲响应的傅立叶变换是其调和函数的傅立叶变换和高斯函数傅立叶变换的卷积。该滤波器由实部和虚部组成,二者相互正交。一组不同频率不同方向的Gabor函数数组对于图像特征提取非常有用。
下面给出二维Gabor函数的数学表达:
复数表达:
实数部分:
虚数部分:
其中:
和
以上的讲解用我自己的理解的话,其实上面都是在讲如何实现一个滤波器,就像实现图像处理里面的一个均值平滑滤波器一样,只不过平滑滤波器太简单了,就一个3*3或5*5的方格里求均值在放到原处。这里呢,也是在实现一个滤波器,但是gabor的稍微复杂(一看就知道,参数多如麻啊!)。
波长(λ):它的值以像素为单位指定,通常大于等于2.但不能大于输入图像尺寸的五分之一。通常用的是它的倒数频率f大于等于0.2。
方向(θ):这个参数指定了Gabor函数并行条纹的方向,它的取值为0到360度
相位偏移(φ):它的取值范围为-180度到180度。其中,0he180度分别对应中心对称的center-on函数和center-off函数,而-90度和90度对应反对称函数。
长宽比(γ):空间纵横比,决定了Gabor函数形状(support,我翻译为形状)的椭圆率(ellipticity)。当γ= 1时,形状是圆的。当γ< 1时,形状随着平行条纹方向而拉长。
还有一个σ,它的话,在代码实现里常常是滤波器大小的一半。
在实际使用gabor的话,我们一般用的是它的实数部分,也是就说,我们就是根据第三个公式求gabor滤波器的。
2. 代码实现
%gamma 长宽比,一般设为1
%lambda为波长
%psi为相位移动,一般为0
%theta为滤波器的角度
function gb=Gabor(sigma,theta,lambda,psi,gamma)
sigma_x = sigma;
sigma_y = sigma/gamma;
% Bounding box
nstds = 4;
xmax = max(abs(nstds*sigma_x*cos(theta)),abs(nstds*sigma_y*sin(theta)));
xmax = ceil(max(1,xmax));
ymax = max(abs(nstds*sigma_x*sin(theta)),abs(nstds*sigma_y*cos(theta)));
ymax = ceil(max(1,ymax));
xmin = -xmax; ymin = -ymax;
[x,y] = meshgrid(xmin:xmax,ymin:ymax);
% Rotation
x_theta=x*cos(theta)+y*sin(theta);
y_theta=-x*sin(theta)+y*cos(theta);
gb= exp(-.5*(x_theta.^2/sigma_x^2+y_theta.^2/sigma_y^2)).*cos(2*pi/lambda*x_theta+psi);
3. 实验结果图
filter=Gabor(6,pi/4,8,0,1);imshow(filter/2+0.5)
img=imread('lena.png');
img=rgb2gray(img);
f=filter2(filter,img,'valid');f=abs(f);imshow(f/max(f(:)))
额,,,好像有点水,让大家失望了
4. 借鉴的资料