【OpenCV】邻域滤波:方框、高斯、中值、双边滤波_第1页
【OpenCV】邻域滤波:方框、高斯、中值、双边滤波_第2页
【OpenCV】邻域滤波:方框、高斯、中值、双边滤波_第3页
【OpenCV】邻域滤波:方框、高斯、中值、双边滤波_第4页
【OpenCV】邻域滤波:方框、高斯、中值、双边滤波_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

邻域滤波(卷积)邻域算子值利用给定像素周围像素的值决定此像素的最终输出。如图左边图像与中间图像卷积禅城右边图像。目标图像中绿色的像素由原图像中蓝色标记的像素计算得到。通用线性邻域滤波是一种常用的邻域算子,输入像素加权得到输出像素:其中权重核为“滤波系数”。上面的式子可以简记为:【方框滤波】最简单的线性滤波是移动平均或方框滤波,用窗口中的像素值平均后输出,核函数为:其实等价于图像与全部元素值为1的核函数进行卷积再进行尺度缩放。代码OpenCV中的 blur函数是进行标准方框滤波:cppview plaincopy1. voidcv:blur(InputArraysrc,OutputArraydst,2. Sizeksize,Pointanchor,intborderType)3. 4. boxFilter(src,dst,-1,ksize,anchor,true,borderType);5. 而boxFilter函数源码如下:cppview plaincopy1. cv:Ptrcv:createBoxFilter(intsrcType,intdstType,Sizeksize,2. Pointanchor,boolnormalize,intborderType)3. 4. intsdepth=CV_MAT_DEPTH(srcType);5. intcn=CV_MAT_CN(srcType),sumType=CV_64F;6. if(sdepth=CV_32S&(!normalize|7. ksize.width*ksize.height=(sdepth=CV_8U?(123):8. sdepth=CV_16U?(115):(116)9. sumType=CV_32S;10. sumType=CV_MAKETYPE(sumType,cn);11. 12. PtrrowFilter=getRowSumFilter(srcType,sumType,ksize.width,anchor.x);13. PtrcolumnFilter=getColumnSumFilter(sumType,14. dstType,ksize.height,anchor.y,normalize?1./(ksize.width*ksize.height):1);15. 16. returnPtr(newFilterEngine(Ptr(0),rowFilter,columnFilter,17. srcType,dstType,sumType,borderType);18. 这里 blur 和 boxFilter 的区别是,blur是标准化后的 boxFilter,即boxFilter的核函数:其中,cppview plaincopy1. blur(src,dst,Size(1,1),Point(-1,-1);2. blur(src,dst,Size(4,4),Point(-1,-1);3. blur(src,dst,Size(8,8),Point(-1,-1);4. blur(src,dst,Size(16,16),Point(-1,-1);实验结果下图是对一幅图像分别用1*1,4*4,8*8,16*16标准方框滤波后的图像:【高斯滤波】高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。它对去除服从正态分布的噪声很有效。常用的零均值离散高斯滤波器函数:2D图像中表示为:代码cppview plaincopy1. /*2. GaussianBlur3. */4. 5. cv:Matcv:getGaussianKernel(intn,doublesigma,intktype)6. 7. constintSMALL_GAUSSIAN_SIZE=7;8. staticconstfloatsmall_gaussian_tabSMALL_GAUSSIAN_SIZE=9. 10. 1.f,11. 0.25f,0.5f,0.25f,12. 0.0625f,0.25f,0.375f,0.25f,0.0625f,13. 0.03125f,0.f,0.21875f,0.28125f,0.21875f,0.f,0.03125f14. ;15. 16. constfloat*fixed_kernel=n%2=1&n=SMALL_GAUSSIAN_SIZE&sigma1:0;18. 19. CV_Assert(ktype=CV_32F|ktype=CV_64F);20. Matkernel(n,1,ktype);21. float*cf=(float*)kernel.data;22. double*cd=(double*)kernel.data;23. 24. doublesigmaX=sigma0?sigma:(n-1)*0.5-1)*0.3+0.8;25. doublescale2X=-0.5/(sigmaX*sigmaX);26. doublesum=0;27. 28. inti;29. for(i=0;in;i+)30. 31. doublex=i-(n-1)*0.5;32. doublet=fixed_kernel?(double)fixed_kerneli:std:exp(scale2X*x*x);33. if(ktype=CV_32F)34. 35. cfi=(float)t;36. sum+=cfi;37. 38. else39. 40. cdi=t;41. sum+=cdi;42. 43. 44. 45. sum=1./sum;46. for(i=0;in;i+)47. 48. if(ktype=CV_32F)49. cfi=(float)(cfi*sum);50. else51. cdi*=sum;52. 53. 54. returnkernel;55. 56. 57. 58. cv:Ptrcv:createGaussianFilter(inttype,Sizeksize,59. doublesigma1,doublesigma2,60. intborderType)61. 62. intdepth=CV_MAT_DEPTH(type);63. if(sigma2=0)64. sigma2=sigma1;65. 66. /automaticdetectionofkernelsizefromsigma67. if(ksize.width0)68. ksize.width=cvRound(sigma1*(depth=CV_8U?3:4)*2+1)|1;69. if(ksize.height0)70. ksize.height=cvRound(sigma2*(depth=CV_8U?3:4)*2+1)|1;71. 72. CV_Assert(ksize.width0&ksize.width%2=1&73. ksize.height0&ksize.height%2=1);74. 75. sigma1=std:max(sigma1,0.);76. sigma2=std:max(sigma2,0.);77. 78. Matkx=getGaussianKernel(ksize.width,sigma1,std:max(depth,CV_32F);79. Matky;80. if(ksize.height=ksize.width&std:abs(sigma1-sigma2)DBL_EPSILON)81. ky=kx;82. else83. ky=getGaussianKernel(ksize.height,sigma2,std:max(depth,CV_32F);84. 85. returncreateSeparableLinearFilter(type,type,kx,ky,Point(-1,-1),0,borderType);86. 87. 88. 89. voidcv:GaussianBlur(InputArray_src,OutputArray_dst,Sizeksize,90. doublesigma1,doublesigma2,91. intborderType)92. 93. Matsrc=_src.getMat();94. _dst.create(src.size(),src.type();95. Matdst=_dst.getMat();96. 97. if(borderType!=BORDER_CONSTANT)98. 99. if(src.rows=1)100. ksize.height=1;101. if(src.cols=1)102. ksize.width=1;103. 104. 105. if(ksize.width=1&ksize.height=1)106. 107. src.copyTo(dst);108. return;109. 110. 111. #ifdefHAVE_TEGRA_OPTIMIZATION112. if(sigma1=0&sigma2=0&tegra:gaussian(src,dst,ksize,borderType)113. return;114. #endif115. 116. Ptrf=createGaussianFilter(src.type(),ksize,sigma1,sigma2,borderType);117. f-apply(src,dst);118. 实验结果下图是对一幅图像分别用1*1,3*3,5*5,9*9标准方框滤波后的图像:非线性滤波线性滤波易于构造,且易于从频率响应的角度分析,但如果噪声是散粒噪声而非高斯噪声时线性滤波不能去除噪声。如图像突然出现很大的值,线性滤波只是转换为柔和但仍可见的散粒。这时需要非线性滤波。简单的非线性滤波有中值滤波,-截尾均值滤波,定义域滤波和值域滤波。中值滤波选择每个邻域像素的中值输出;-截尾均值滤波是指去掉百分率为的最小值和最大值;定义域滤波中沿着边界的数字是像素的距离;值域就是去掉值域外的像素值。中值滤波代码cppview plaincopy1. medianBlur(src,dst,i);中值滤波实验下图是对一幅图像分别用3*3,5*5,7*7,9*9(这里必须是奇数)标准方框滤波后的图像:【双边滤波】双边滤波的思想是抑制与中心像素值差别太大的像素,输出像素值依赖于邻域像素值的加权合:权重系数 取决于定义域核和依赖于数据的值域核的乘积。相乘后会产生依赖于数据的双边权重函数:双边滤波源码cppview plaincopy1. /*2. BilateralFiltering3. */4. 5. namespacecv6. 7. 8. staticvoid9. bilateralFilter_8u(constMat&src,Mat&dst,intd,10. doublesigma_color,doublesigma_space,11. intborderType)12. 13. intcn=src.channels();14. inti,j,k,maxk,radius;15. Sizesize=src.size();16. 17. CV_Assert(src.type()=CV_8UC1|src.type()=CV_8UC3)&18. src.type()=dst.type()&src.size()=dst.size()&19. src.data!=dst.data);20. 21. if(sigma_color=0)22. sigma_color=1;23. if(sigma_space=0)24. sigma_space=1;25. 26. doublegauss_color_coeff=-0.5/(sigma_color*sigma_color);27. doublegauss_space_coeff=-0.5/(sigma_space*sigma_space);28. 29. if(d=0)30. radius=cvRound(sigma_space*1.5);31. else32. radius=d/2;33. radius=MAX(radius,1);34. d=radius*2+1;35. 36. Mattemp;37. copyMakeBorder(src,temp,radius,radius,radius,radius,borderType);38. 39. vector_color_weight(cn*256);40. vector_space_weight(d*d);41. vector_space_ofs(d*d);42. float*color_weight=&_color_weight0;43. float*space_weight=&_space_weight0;44. int*space_ofs=&_space_ofs0;45. 46. /initializecolor-relatedbilateralfiltercoefficients47. for(i=0;i256*cn;i+)48. color_weighti=(float)std:exp(i*i*gauss_color_coeff);49. 50. /initializespace-relatedbilateralfiltercoefficients51. for(i=-radius,maxk=0;i=radius;i+)52. for(j=-radius;jradius)56. continue;57. space_weightmaxk=(float)std:exp(r*r*gauss_space_coeff);58. space_ofsmaxk+=(int)(i*temp.step+j*cn);59. 60. 61. for(i=0;isize.height;i+)62. 63. constuchar*sptr=temp.data+(i+radius)*temp.step+radius*cn;64. uchar*dptr=dst.data+i*dst.step;65. 66. if(cn=1)67. 68. f

温馨提示

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

评论

0/150

提交评论