



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高斯滤波(高斯平滑)是数字图像处理和计算机视觉里面最常见的操作。平时,我们都是用Matlab或者OpenCV的函数调用:imfilter或者cvSmooth,并不关心底层的实现。然而当开发者要自己实现高斯滤波的时候,往往就会很迷惘,经常会被下面几个问题所困扰:1、给定sigma,即标准偏差,怎么确定离散化后的滤波器窗口大小?2、给定窗口大小,怎么计算高斯核的sigma,即标准偏差?3、怎么实现可分离滤波器?在网上搜了一下,还真没几个人把实现的细节讲清楚了。这里,我尝试结合三份源码,做个小小的总结。三份源码分别是:1、OpenCV中的cvfilter.cpp 2、autopano-sift-c中的GaussianConvolution.c 3、GIMP中的blur-gauss.c和unsharp-mask.c 在图像处理中,高斯滤波一般有两种实现方式,一种是用离散化的滑动窗口进行卷积运算,另一种则是通过傅里叶变换来实现。最常见的就是第一种卷积核实现,只有当离散化的窗口非常大,计算非常耗时(这时可使用可分离滤波器)的情况下,可能会考虑基于傅里叶变换的实现方法。这里我们只讨论第一种方法。二维高斯函数的形式是这样的:有着如下的形状:基本上,离散化的主旨就是保留高斯函数中心能量最集中的中间部分,忽略四周能量很小的平坦区域。这只是个很感性的描述,具体实现起来,就会出现千奇百怪的版本。下面结合三份源码,看看现实世界里的高斯平滑到底长的什么样子。首先是第一个问题:给定sigma,怎么计算窗口大小?直接上OpenCV的源码,在cvFilter函数中:param1 = cvRound(sigma1*(depth = CV_8U ? 3 : 4)*2 + 1)|1;OpenCV认为半径为3*sigma的窗口就是高斯函数的能量最集中的区域。(在图像位深度不是8的时候,使用4*sigma半径的窗口?)autopan0-sift-c是图像拼接软件hugin里面的sift实现,在实现DoG的时候需要做不同尺度的高斯平滑,在GaussianConvolution_new1函数中实现如下:dim = 1 + 2 * (int) (3.0 * sigma);可见autopano也是实现的3*sigma半径的窗口。在GIMP里,实现比较奇特,在blur_gauss.c的make_rle_curve函数里面,const gdouble sigma2 = 2 * sigma * sigma;const gdouble l = sqrt (-sigma2 * log (1.0 / 255.0);int n = ceil (l) * 2;if (n % 2) = 0)n += 1;从效果来看,这个实现的窗口半径是约等于2.2*sigma。然后是第二个问题:给定窗口大小,怎么计算sigma?OpenCV的实现,在cvFilter.cpp的init_gaussian_kernel函数中:sigmaX = sigma 0 ? sigma : (n/2 1)*0.3 + 0.8;sigma的大小约为窗口半径的0.3倍再加上0.8。autopano没有实现这个特性。GIMP的实现:/* we want to generate a matrix that goes out a certain radius* from the center, so we have to go out ceil(rad-0.5) pixels,* inlcuding the center pixel. Of course, thats only in one direction,* so we have to go the same amount in the other direction, but not count* the center pixel again. So we double the previous result and subtract* one.* The radius parameter that is passed to this function is used as* the standard deviation, and the radius of effect is the* standard deviation * 2. Its a little confusing.*/radius = fabs (radius) + 1.0;std_dev = radius;radius = std_dev * 2;/* go out radius in each direction */matrix_length = 2 * ceil (radius 0.5) + 1;注释讲的很清楚了,基本上就是认为sigma应该等于窗口半径的一半。看完这三份源码,结论就是,关于sigma和窗口的大小,你爱怎么算都可以,这个由你的实际需要决定,别太离谱就行。(根据概率理论,高斯分布的样本绝大部分集中在3倍标准差以内的区域。)第三个问题是可分离滤波器:首先说明为什么要使用可分离滤波器。实际上,模板运算(滑动窗口卷积)在数字图像处理中是一项非常耗时的运算。以上图中的3*3高斯模板为例,每个像素完成一次模板操作要用9个乘法、8个加法和1个除法。对于一幅n*n的图像,大约就是9n2个乘法,8n2个加法和n2个除法,这对于比较大的图像来说,是非常可怕的。而且随着模板大小的增加,计算量是呈指数增长的。那么有没有一种办法能够减少计算量呢?答案是肯定的。由于高斯函数可以写成可分离的形式,因此可以采用可分离滤波器实现来加速。所谓的可分离滤波器,就是可以把一个多维的卷积化成多个一维的卷积。具体到二维的高斯滤波,就是指先对行做一维卷积,再对列做一维卷积。这样就可以将计算复杂度从O(M*M*N*N)降到O(2*M*M*N),M, N分别是图像和滤波器的窗口大小。问题是实现的时候怎么计算一维的卷积核呢?其实很简单,按照前面计算出来的窗口大小,将二维的高斯模板合并成一维,计算所有离散点上一维高斯函数的权值,最后将权值之和归一化到1。下面是来自OpenCV的源码:for( i = 0; i = n/2; i+ ) double t = fixed_kernel ? (double)fixed_kerneli : exp(scale2X*i*i); if( type = CV_32FC1 ) cf(n/2+i)*step = (float)t; sum += cf(n/2+i)*step*2; else cd(n/2+i)*step = t; sum += cd(n/2+i)*step*2; sum = 1./sum;for( i = 0; i = n/2;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年南昌大学第一附属医院GCP中心临床试验质控岗招聘1人备考考试题库附答案解析
- 用户粘性模型构建-洞察及研究
- 亲子活动叠被子方案策划
- 晶体生长抑制因子研究-洞察及研究
- 海底地形地貌测绘-洞察及研究
- 锂硫电池锂金属负极稳定化-洞察及研究
- 油墨厂押运员工作办法
- 清代僧人管理制度
- 物业相关管理服务合同范本
- 2024-2025学年福建省莆田市锦江中学高一(下)期中数学试卷(含答案)
- 2025年吉林铁道职业技术学院单招职业技能测试题库汇编
- 北师大版数学三年级上册全册教案
- 运动学练习题库及参考答案
- 沈阳2025年辽宁沈阳辽中区四家事业单位面向区内事业单位遴选18人笔试历年参考题库附带答案详解
- 2025年中国内河码头行业市场深度分析及发展趋势预测报告
- 《国际贸易术语》课件
- 小学生美术素养的综合评价体系构建与实践
- 化学反应中的表示课件九年级化学(2024)上册
- T-CSUS 69-2024 智慧水务技术标准
- 《全国计算机等级考试教程:二级WPS Office高级应用与设计》全套教学课件
- 专题种猪性能测定
评论
0/150
提交评论