高斯模糊实现小结_第1页
高斯模糊实现小结_第2页
高斯模糊实现小结_第3页
高斯模糊实现小结_第4页
高斯模糊实现小结_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、高斯模糊实现小结zdd zddmail gmail com高斯模糊是一种图像滤波器,它使用正态分布(高斯函数)计算模糊模板,并使用该模板与 原图像做卷积运算,达到模糊图像的H的。N维空间正态分布方程为:_ -r/(2o-)(1-1)/2兀(十英中.b是正态分布的标准差.b值越大图像越模糊(平滑) T为模糊半径.模糊半径 是指模板元素到模板中心的距离。如二维模板大小为mF,则模板上的元素(x,y)对应的高斯计 算公式为:(才- 2)2+°j/2)27(1-2)在二维空间中.这个公式生成的曲而的等髙线是从中心开始呈正态分布的同心圆。分布不 为零的像素组成的卷积矩阵与原始图像做变换.每个像

2、素的值都是周圉相邻像素值的加权平 均。原始像索的值有用大的髙斯分布值,所以有最大的权巫,相邻像索随着距离原始像素越來 越远,其权重也越來越小。这样进行模糊处理比共它的均衡模糊滤波器更尚地保留了边缘效 果。理论上來讲,图像中每点的分布都不为零,这也就是说每个像素的计算都需要包含整幅图 像。在实际应用中,在计算髙斯函数的离散近似时,在大概3。距离之外的像素都可以看作不 起作用,这些像索的计算也就可以忽略。通常,图像处理程序只需耍计算(6b + l)x(6b + l) 的矩阵就可以保证相关像素影响。K使用给定高斯模板平滑图像函数(T = 0.84089642的7行7列髙斯模糊矩阵为:表1 7*7&#

3、174;斯模板0.00000060.00002290.00019110.00038770.00019110.00002290.00000060.00002290.00078630.00655960.01330370.00655960.00078630.00002290.00019110.00655960.05472150.11098160.05472150.00655960.00019110.00038770.01330370.11098160.22508350.11098160.01330370.00038770.00019110.00655960.05472150.11098160.054

4、72150 00655960.00019110 00002290.00078630 00655960.01330370 00655960.00078630.00002290.00000060.00002290.00019110.00038770.00019110.00002290.0000006注:该竝阵来源于维基百科舄斯模糊词条.现使用该模板对源图像做模糊处理,其函数如下: 高斯平滑未使用sigma.边缘无处理void GaussianTemplateSmooth(const Mat &src, Mat &dst, double sigma)高斯模板(7*7) > si

5、gma = 0.84089612static const double gaussianTemplate77=0. 00000067,0. 00002292,0. 00019117,0. 00038771,0. 00019117,0.00002292,0. 00000067,0. 00002292,0. 00078633,0. 00655965,0. 01330373,0. 00655965,0. 00078633,0. 00002292,0. 00019117,0. 00655965,0. 05472157,0. 11098164,0. 05472157,0. 00655965,0. 000

6、19117,0. 00038771,0. 01330373,0. 11098161,0. 22508352,0. 11098161,0. 01330373,0. 00038771,0. 00019117,0. 00655965,0. 05472157,0. 1109816-1,0. 05472157,0. 00655965,0. 00019117,0. 00002292,0. 00078633,0. 00655965,0. 01330373,0. 00655965,0. 00078633,0. 00002292,0.00000067,0.00002292,0.00019117,0.000387

7、71,0.00019117,0.00002292,0.00000067:dst. create(src size0, src. type0);uchar* srcData = src.data;uchar* dstData = dst.data;for(int j = 0; j < srccols7; j卄)for(int i = 0; i < srcrows-7; i卄)double acc = 0;double accb = 0, accg = 0, accr = 0;for(int m = 0; m < 7; mi)for(int n = 0; n < 7; n卄

8、)if (src channels。= 1)acc +二 *(srcData + src. step (i+n) + srcchannels() * (j+m) * gaussianTemplateEmn;elseaccb += *(srcData + src.step * (i+n) +src channels。 srcchannels() src channels0 (j+3)=(int)acc;O)=(int)accb;1) =(int)accg;2) = (int)accr;(j-hn) * 0) gaussiemTemplateLm n:accg +二 *(srcData + src

9、.step * (i+n) + (j-hn) + 1) * gaussianTemplatem n;accr += *(srcData + src.step * (i+n) + (j-4n) + 2) * gaussianTemplatem n;if (src .channels。= 1) (dstData + dst. step * (i+3) + dst. channels 0 *(dstData + dststep *(i+3) * dst. channels 0* (j+3) +(dstData(dstData+ dst step *+ dst. step *(i+3) dst. ch

10、annels 0(i+3) + dst. channels0* (j+3) +* (j+3) +其效果如图1所示.7"的高斯模板与源图像做卷积运算时.会产生半径为3的边缘,在 不箱确的图像处理中,可用源图像像素填充或者去掉边缘。图17拿7矩阵的高斯模糊注:本文中出现的图片大小都为216*216的lena图像。2、二维高斯模糊函数上述的例子中,如何求得髙斯模糊矩阵是高斯模糊的关键。根据高斯函数的性质,图像处 理程序只需要计算(6b + l)x(6b + l)的矩阵就可以保证相关像索影响。因此,可根据b的值 确定高斯模糊矩阵的大小。髙斯矩阵可利用公式(l-2)i|-算,并归-化紂到。归-

11、化是保证高斯 矩阵的值在0,1之间。其处理甫数如下:只处理灰度图void GaussianSmooth2D(const Mat &src, Mat &dst, double sigma)if(src.channels。!= 1)return;/确保sigma止sigma = sigma > 0 ? sigma : 0;/高斯模板的 XzJxa(6*sigma*l)*(6*sigma*l)确保ksize为奇数int ksize = cvRound(sigma * 3) *2+1;if(ksize = 1)src copyTo(dst);return;dst create(s

12、rc size 0, src type0);计算高斯矩阵核double *kernel = new doubleksize*ksize:double scale = -05/(sigma*sigma);const double PI = 3.141592653;double cons = -scale/PI;double sum = 0;for(int i = 0; i < ksize; i卄)for(int j = 0; j < ksize; j卄)int x = i-(ksizeT)/2;int y = j-(ksize-l)/2;kerneli*ksize + j二 cons

13、 eip(scale (x*x + y*y);sum *= kerneli*ksize*j;cout <<""<< kerneli*ksize - j;cout «endl;归一化for(int i = ksize*ksize-l; i >=0; i)*(kernel+i) /= sum;uchar* srcData = src.data; uchar* dstData = dst.data;/图像卷积运算for(int j = 0; j < src. cols-ksize; j卄)for(int i = 0; i < s

14、rc.ros-ksize; i+)double acc = 0;for(int m = 0; m < ksize; m+)for(int n = 0; n < ksize; n+)acc +二 *(srcData + src. step * (i+n) + src. channels0 * (j+m) kernelm*ksize+n; (dstData + dst. step * (i + (ksize - 1)/2) + (j + (ksize -1)/2)= (int)acc;delete Jkernel;利用该函数,収b = 0.84089642 ,即可得到上例中7T的模板,

15、该模板数据存在kernel中。利用该函数计算的归一化后的33, 55阶高斯模板如表2,3所示:表2 3*3的髙斯模板1.4716910050.00380683147169-00500080680 9847140 00380681.4716910050.003806831.47169005表3 5拿5的高斯模板6.58573e-0060.0004247810.001703540.0004247816.58573e-0060 0004247810.027398401098780.02739840.0004247810.001703540.1098780.4406550.1098780.001703

16、540.0004247810.02739840.1098780.02739840.0004247816.585730060.0004247810.001703540.0004247816.58573006山上表可以看出,高斯模板是中心对称的。模糊效果如图2所示。cr = 1.6b = 10.0图2二维髙斯模糊效果图对图2中边缘的处理:int center = (ksize-1) /2;图?像?椒积y运?算?for(int j = 0; j < src. cols; j卄)for(int i = 0; i < srcros; i卄) double acc = 0;for(int m

17、= -center, c = 0; m <= center; c+)for(int n = -center, r = 0; n <= center; n+, r*+)if(i+n) >=0 && (i*n) < src. rows && (j*m) >=0 && (j*m)< src.cols)acc 二 *(srcData + src.step (i+n) +src channels。 (jFn) * kernelr*ksize*c; (dstData + dst. step * (i) + (j) = (i

18、nt)acc;a边缘无处理b边缘处理图2.1处理边缘(b = 100)如上图所示.边缘明显变窄.但是存在黑边。3、改进的高斯模糊函数上述的二维高斯模糊函数GaussianSmooth2D达到髙斯模糊图像的目的,但是如图2所 示,会因模板的关系而适成边缘图像缺失,b越大,缺失像素越多,额外的边缘处理会增加计 算量。并且当b变大时,高斯模板(髙斯核)和卷积运算量将大幅度提高。根据高斯函数的可分 离性,可对二维高斯模糊函数进行改进。髙斯函数的可分离件 是指使用二维矩阵变换得到的效果也可以通过在水平方向进行一维髙 斯矩阵变换加上竖直方向的一维髙斯矩阵变换得到。从计算的角度來看,这是一项有用的特 性,因

19、为这样只需要次计算,而二维不可分的矩阵则需要 0(公xj/x")次计算,其中,为高斯矩阵的维数,M.N为二维图像的维数。另外.两次i维的高斯卷积将消除二维髙斯矩阵所产生的边缘。改进的崗斯模糊函数如下:void GaussianSmooth(const Mat &src, Mat &dst, double sigma) if(srcchannels() != 1 && srcchannels() != 3)return;/sigma = sigma > 0 ? sigma : -sigma;高斯核矩阵的人小为a(6*sigma*l)*(6*sigm

20、a+l)/ksize为奇数int ksize = ceil(sigma 3) *2+1;if(ksi" 1)src copyTo(dst);return;计算维高斯核/本例中水平方向和垂辽方向的高斯核维度相同.也可取不同的高斯核 double *kernel = new doubleksizel;double scale = -0. 5/(sigma*sigma);const double PI = 3.141592653;double cons = 1/sqrt(-scale / PI);double sum = 0;int kcenter = ksize/2;int i = 0,

21、 j = 0;ford = 0; i < ksize; i+)int x = i - kcenter;*(kernel+i) = cons * exp(x x scale);/-维高斯函数 sum y (kernel+i);/归一化,确保高斯权值在0J之间for(i = 0; i < ksize; i+)*(kernel+i) /= sum;dst create(src size 0, src type0);Mat temp;temp create(src size 0, src type 0);uchar* srcData = src. data;uchar* dstData =

22、 dst.data;uchar* tempData = temp .data;x方向一维高斯模糊for(int y = 0; y < src.roirs; y卄)for(int x = 0; x < src.cols; x卄)double mul = 0;sum = 0;double bmul = 0, gmul = 0, rmul = 0; for(i = -kcenter; i <= kcenter i+) if(x+i) >= 0 && (x+i) < src.cols) if (src channels。= 1)mul +二 *(srcDa

23、ta+y*src step*(x*i)(*(kernelkcenter+i);bmul +二+ O)*(»(kemel+kcenter+i);gmul +=+ 1)*(* (kerneHkcenter+i):else*(srcData-y*src step+(x+i)*src channels0*(srcDatay*src step+(x+i)*src channels0rmul +二*(srcData+y*src step*(x*i)*src channels0 2) ( (kernel+kcenteri); sum *= (*(kernel*kcenteri);if (src c

24、hannels。= 1)*(tempDataytemp stepx) = mul/sum;elsebmul/sum; gmul/sum; rmul/sum; (tempDaxtemp stepx*temp channels 0-K) (tempData+y*temp step-*-x*temp channels ()+1)*(tempDatay*temp stepx*temp channels()+2)/y方向一维崗斯模糊for(int x = 0; x < temp .cols; x+)for(int y = 0; y < temp .rows; y+)double mul =

25、0;sum = 0;double bmul = 0, gmul = 0, rmul = 0; for(i = -kcenter; i <= kcenter i+) if(y+i) >= 0 && (y+i) < temp, rows) if (temp channels。= 1)mul +二*(tempData+(y*i)*temp step*x)(*(kernel+kcenter*i);elsebmul +二*(tempData+(y*i)*temp stepx*temp channels 0 + 0)(*(kernel+kcenteri);gmul +=*

26、(tempData+ (y-*-i)*temp step-x*temp channels 0 + 1)*(*(kernel+kcenteri);rmul +二*(tempData*(y*i)*temp step*x*temp channels 0 + 2)*(kernel+kcenteri); sum + 二(*(kerneHkcenter*i);if (temp .channels。= 1)*(dstData+y*dststep+x) = mul/sum;else*(dstData+y*dst. stepx*dst channels()() = bmul/sum; (dstData+y*dst step+x*dst channels ()!.) = gmul sum; *(dstData+y*dststep+x#dstchannels()2) = rmul sum; deletekernel;该函数中使用的水平方向和垂直方向的高斯矩阵为同一矩阵,实际计算时可根据需要取不同。模糊效果如图3所示原图er = 2.0图3分离高斯模糊效果比较使用GetTic

温馨提示

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

评论

0/150

提交评论