二维卷积运算_第1页
二维卷积运算_第2页
二维卷积运算_第3页
二维卷积运算_第4页
二维卷积运算_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、二维卷积运算gabor变换的本质实际上还是对二维图像求卷积。因此二维卷积运算的效率就直接决定了gabor变换的效率。在这里我先说说二维卷积运算以及如何通过二维傅立叶变换提高卷积运算效率。在下一步分内容中我们将此应用到gabor变换上,抽取笔迹纹理的特征。1、离散二维叠加和卷积关于离散二维叠加和卷积的运算介绍的书籍比较多,我这里推荐william k. pratt著,邓鲁华 张延恒 等译的数字图像处理(第3版),其中第7章介绍的就是这方面的运算。为了便于理解,我用下面几个图来说明离散二维叠加和卷积的求解过程。a可以理解成是待处理的笔迹纹理,b可以理解成gabor变换的核函数,现在要求a与b的

2、离散二维叠加卷积,我们首先对a的右边界和下边界填充0(zero padding),然后将b进行水平翻转和垂直翻转,如下图:然后用b中的每个值依次乘以a中相对位置处的值并进行累加,结果填入相应位置处(注意红圈位置)。通常二维卷积的结果比a、b的尺寸要大。如下图所示:2、快速傅立叶变换卷积根据傅立叶变换理论,对图像进行二维卷积等价于对图像的二维傅立叶变换以及核函数的二维傅立叶变换在频域求乘法。通过二维傅立叶变换可以有效提高卷积的运算效率。但在进行傅立叶变换时一定要注意“卷绕误差效应”,只有正确对原有图像以及卷积核填补零后,才能得到正确的卷积结果。关于这部分内容可以参考william k. prat

3、t著,邓鲁华 张延恒 等译的数字图像处理(第3版)第9章的相关内容,此处就不再赘述。目前网上可以找到开源c#版的快速傅立叶变换代码(exocortex.dsp),我使用的是1.2版,2.0版似乎只能通过cvs从sourceforge上签出, 并且功能没有什么太大改变。将exocortex.dsp下载下来后,将源代码包含在自己的项目中,然后就可以利用它里面提供的复数运算以及傅立叶变换功能了。为了测试通过傅立叶变换求卷积的有效性,特编写以下代码: using system;using exocortex.dsp;class mainentry static void main() fftconv2

4、 c = new fftconv2(); c.dofftconv2(); public class fftconv2 double, kernel = -1, 1, 0, 1; double, data = 10,5,20,20,20, 10,5,20,20,20, 10,5,20,20,20, 10,5,20,20,20, 10,5,20,20,20; complex kernel = new complex8*8; complex data = new complex8*8; complex result = new complex8*8; private void init() for(

5、int y=0; y2; y+) for(int x=0; x2; x+) kernely*8+x.re = kernely,x; for(int y=0; y5; y+) for(int x=0; x5; x+) datay*8+x.re = datay,x; public void dofftconv2() init(); fourier.fft2(data, 8, 8, fourierdirection.forward); fourier.fft2(kernel, 8, 8, fourierdirection.forward); for(int i=0; i8*8; i+) result

6、i = datai * kerneli / (8*8); fourier.fft2(result, 8, 8, fourierdirection.backward); for(int y=0; y6; y+) for(int x=0; x6; x+) console.write(0,8:f2, resulty*8+x.re); console.writeline(); 程序的运行结果与离散二维叠加和卷积的运算结果完全相同。由于卷积结果与原始输入图片的大小是不一样的,存在着所谓“边界”,在我的实际应用程序中,为了避免这些“边界”对结果过多的影响,我采用的是居中阵列定义,并且从卷积结果中只截取需要

7、的那部分内容,确保和原始图片的大小完全一致,如下图:这就需要对卷积的傅立叶求法做些微小的调整,具体调整办法就不说了,主要是坐标的变换,将示例代码贴上来供大家参考:using system;using exocortex.dsp;class mainentry static void main() centerfftconv2 s = new centerfftconv2(); s.commonmethod(); s.dofftconv2(); public class centerfftconv2 double, kernel = 0, 1, 0, 1, 2, 0, 0, 0, 3; doub

8、le, data = new double12,12; complex kernel = new complex16*16; complex data = new complex16*16; complex result = new complex16*16; public centerfftconv2() random r = new random(); for(int y=0; y12; y+) for(int x=0; x12; x+) datay,x = r.nextdouble(); for(int y=0; y3; y+) for(int x=0; x3; x+) kernely*

9、16+x.re = kernely,x; for(int y=1; y13; y+) for(int x=1; x13; x+) datay*16+x.re = datay-1,x-1; public void dofftconv2() console.writeline( = by fft2conv2 method =); fourier.fft2(data, 16, 16, fourierdirection.forward); fourier.fft2(kernel, 16, 16, fourierdirection.forward); for(int i=0; i16*16; i+) r

10、esulti = datai * kerneli / (16*16); fourier.fft2(result, 16, 16, fourierdirection.backward); for(int y=2; y14; y+) for(int x=2; x14; x+) console.write(0,5:f2, resulty*16+x.getmodulus(); console.writeline(); public void commonmethod() double real = 0; console.writeline( = direct transform =); for(int

11、 y=0; y 12; y+) for(int x=0; x 12; x+) for(int y1=0; y1 3; y1+) for(int x1=0; x1 =0) & (y - 1 + y1)=0) & (x - 1 + x1)12) real += datay - 1 + y1, x - 1 + x1 * kernel2 - x1, 2 - y1; console.write(0,5:f2, real); real=0; console.writeline(); console.writeline(n); 有了此部分的基础知识后,我们就要步入笔迹识别中最核心的部分gabor变换,提取笔

12、迹的特征了。二、gabor函数gabor变换属于加窗傅立叶变换,gabor函数可以在频域不同尺度、不同方向上提取相关的特征。另外gabor函数与人眼的生物作用相仿,所以经常用作纹理识别上,并取得了较好的效果。二维gabor函数可以表示为:其中:v的取值决定了gabor滤波的波长,u的取值表示gabor核函数的方向,k表示总的方向数。参数决定了高斯窗口的大小,这里取。程序中取4个频率(v=0, 1, ., 3),8个方向(即k=8,u0, 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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论