First we try, then we trust

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  183 随笔 :: 111 文章 :: 2966 评论 :: 301 Trackbacks

二、Gabor函数

Gabor变换属于加窗傅立叶变换,Gabor函数可以在频域不同尺度、不同方向上提取相关的特征。另外Gabor函数与人眼的生物作用相仿,所以经常用作纹理识别上,并取得了较好的效果。二维Gabor函数可以表示为:

其中:

v的取值决定了Gabor滤波的波长,u的取值表示Gabor核函数的方向,K表示总的方向数。参数决定了高斯窗口的大小,这里取。程序中取4个频率(v=0, 1, ..., 3),8个方向(即K=8,u=0, 1, ... ,7),共32个Gabor核函数。不同频率不同方向的Gabor函数可通过下图表示:

图片来源:GaborFilter.html

图片来源:http://www.bmva.ac.uk/bmvc/1997/papers/033/node2.html

三、代码实现

Gabor函数是复值函数,因此在运算过程中要分别计算其实部和虚部。代码如下:

private void CalculateKernel(int Orientation, int Frequency)
{
   double real, img;
   for(int x = -(GaborWidth-1)/2; x<(GaborWidth-1)/2+1; x++)
      for(int y = -(GaborHeight-1)/2; y<(GaborHeight-1)/2+1; y++)
      {
         real = KernelRealPart(x, y, Orientation, Frequency);
         img = KernelImgPart(x, y, Orientation, Frequency);
         KernelFFT2[(x+(GaborWidth-1)/2) + 256 * (y+(GaborHeight-1)/2)].Re = real;
         KernelFFT2[(x+(GaborWidth-1)/2) + 256 * (y+(GaborHeight-1)/2)].Im = img;
      }
}
private double KernelRealPart(int x, int y, int Orientation, int Frequency)
{
   double U, V;
   double Sigma, Kv, Qu;
   double tmp1, tmp2;
   U = Orientation;
   V = Frequency;
   Sigma = 2 * Math.PI * Math.PI;
   Kv = Math.PI * Math.Exp((-(V+2)/2)*Math.Log(2, Math.E));
   Qu = U * Math.PI  / 8;
   tmp1 = Math.Exp(-(Kv * Kv * ( x*x + y*y)/(2 * Sigma)));
   tmp2 = Math.Cos(Kv * Math.Cos(Qu) * x + Kv * Math.Sin(Qu) * y) - Math.Exp(-(Sigma/2));
   return tmp1 * tmp2 * Kv * Kv / Sigma;   
}
private double KernelImgPart(int x, int y, int Orientation, int Frequency)
{
   double U, V;
   double Sigma, Kv, Qu;
   double tmp1, tmp2;
   U = Orientation;
   V = Frequency;
   Sigma = 2 * Math.PI * Math.PI;
   Kv = Math.PI * Math.Exp((-(V+2)/2)*Math.Log(2, Math.E));
   Qu = U * Math.PI  / 8;
   tmp1 = Math.Exp(-(Kv * Kv * ( x*x + y*y)/(2 * Sigma)));
   tmp2 = Math.Sin(Kv * Math.Cos(Qu) * x + Kv * Math.Sin(Qu) * y) - Math.Exp(-(Sigma/2));
   return tmp1 * tmp2 * Kv * Kv / Sigma;   
}

有了Gabor核函数后就可以采用前文中提到的“离散二维叠加和卷积”或“快速傅立叶变换卷积”的方法求解Gabor变换,并对变换结果求均值和方差作为提取的特征。32个Gabor核函数对应32次变换可以提取64个特征(包括均值和方差)。由于整个变换过程代码比较复杂,这里仅提供测试代码供下载。该代码仅计算了一个101×101尺寸的Gabor函数变换,得到均值和方差。代码采用两种卷积计算方式,从结果中可以看出,快速傅立叶变换卷积的效率是离散二维叠加和卷积的近50倍。

代码下载请点 >>>>  这里 。注意,代码中没有包含Exocortex.DSP,请测试者到相应网站上下载并包含在自己的项目中。

解压缩后,里面有一"GaborTest.png"文件,程序中默认路径是“D:\”,请将此图片放置到此路径下。(程序代码在Visual Studio .net 2003下调试通过)。

 

posted on 2006-02-06 11:02 吕震宇 阅读(6188) 评论(19)  编辑 收藏 所属分类: 笔迹鉴别

评论

#1楼  2006-02-06 18:19 简单生活      
好东西啊,研究一下
  回复  引用  查看    

#2楼  2006-02-06 20:33 guaike [未注册用户]
好!
希望继续这个专题,我也比较感兴趣
  回复  引用    

#3楼  2006-02-07 13:44 A.Z      
如何做到广义的验证码识别呢?
  回复  引用  查看    

#4楼 [楼主] 2006-02-07 13:56 吕震宇      
@A.Z

不太明白,你说的“广义的验证码识别”是指什么?数字水印吗?
  回复  引用  查看    

#5楼  2006-02-10 15:43 玻璃*杯 [未注册用户]
请教一下你对图形中出现的杂色怎么处理的了?不知道是否有现成的算法可以去除杂色?
  回复  引用    

#6楼 [楼主] 2006-02-10 16:35 吕震宇      
@玻璃*杯

初始图像是RGB类型,在制作纹理之前要去色(转换为灰度图,并进而做成黑白二值图)。去色的方法很多文献中有介绍,我使用的是以下方法:

private int ColorToGray(Color color)
{
//Gray = 0.299 * R + 0.587 * G + 0.114 * B
//当然把浮点运算去掉,都用整数运算会更快:Gary = (R * 77 + G * 151 + B * 28) >> 8;
int gray = ((((color.R * 77) + (color.G * 151)) + (color.B * 28)) >> 8);

if(gray<0) gray=0;
if(gray>255) gray=255;

return gray;
}

至于你说的杂色,我不知道具体是不是指这个。
  回复  引用  查看    

#7楼  2006-04-22 10:28 simonho [未注册用户]
最近也在做GABOR方面的特征提取,但是还是不太明白原理,能留下你的E-MAIL让我好好请教你吗??我的E-MAIL是wingzero234@sina.com
  回复  引用    

#8楼  2006-06-11 13:11 求助 [未注册用户]
最近在做毕业设计`~基于多尺度gabor滤波器的虹膜特征提取
对于多尺度gabor滤波不明白~~能帮帮吗?很紧急~~
谢谢 我的QQ18721741  我的邮箱wangwei18721741@sohu.com 邮件题目请用中文
  回复  引用    

很好啊,我也想多了解一下这方面的问题,请多指教
  回复  引用    

吕先生:
  你好!时下我正着手图象的Gabor子波变换方面的编程,用的是matlab,但遇到了很多问题.特向你请教!万分感谢!!我的邮箱:lulu_7777@sina.com
  回复  引用    

#11楼 [楼主] 2007-03-17 22:30 吕震宇      
@lulu_7777@sina.com
我仅仅是为了完成我的毕业论文研究了一下Gabor变换,学得也不是很深,至于MatLab编程我实在是没有精力研究它了,不过相信和我的C#代码差不多,你可以参考一下我提供的C#代码然后改编一下。
  回复  引用  查看    

多谢吕兄弟!!
  回复  引用    

#13楼  2007-03-21 11:27 小爽 [未注册用户]
我也在做图像处理方面的,但是对一些复杂的公式一看就头疼,也不知道怎么用程序去实现,比如说什么不变矩、gabor滤波器等等,是不是只要按着算法在程序里写上公式就好了呢?真是头疼!
  回复  引用    

#14楼  2007-04-11 15:40 月无边 [未注册用户]
最近在做书法字识别的毕业设计,有些问题不明白,能不能向您请教下,QQ:24412925,谢谢!
  回复  引用    

#15楼  2007-05-04 20:56 小强 [未注册用户]
我的毕业设计是指纹识别 主要是纹理方面的分析
有许多的问题想请教你
我的QQ:113210686
e-mail:leocockroach@163.com
  回复  引用    

#16楼  2007-05-11 10:23 Lynn [未注册用户]
您好,我下载了您提供的测试代码,编译通过运行了一下,我见单独了一下代码,有一个地方没能看懂,向您请教:
Gabor滤波器应当有32个,4个尺度,8个方向,也就是说程序里面形参Orientation应该从0到7,Frequency应当是0到3,对吗?
但是函数调用只有一句GaborTransform(image, 0,0, result);
其中设定了Orientation和Frequency均为0。
我没能找到变化参数的地方,请您指导一下,参数在哪里变化了?

  回复  引用    

#17楼  2007-06-12 13:04 jhxeon [未注册用户]
请教个比较弱的问题,对一幅图像而言,gabor的输入输出分别是什么?谢谢。。
  回复  引用    

#18楼  2007-10-18 14:29 slean [未注册用户]
虚部的TMP2应该是
tmp2 = Math.Sin(Kv * Math.Cos(Qu) * x + Kv * Math.Sin(Qu) * y) ;
才对啊。不是tmp2 = Math.Sin(Kv * Math.Cos(Qu) * x + Kv * Math.Sin(Qu) * y) - Math.Exp(-(Sigma/2));


  回复  引用    

#19楼  2008-05-19 10:08 彭静 [未注册用户]
我现在要利用Garbor函数设计多尺度的方向滤波器,很迷茫,现在特别的急!非常诚心的想和你交流,我的QQ是574782227,Email:P992468@163.COM
  回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
博客园首页

新闻频道

社区

小组

博问

网摘

闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
成果网帮您增加网站收入


相关链接:

历史上的今天:
2005-02-06 华容道与数据结构 (8)
2005-02-06 华容道与数据结构 (7)