介绍几种邻域滤波的方法

本文详细介绍了图像处理中的几种邻域滤波方法,包括方框滤波、高斯滤波以及非线性滤波中的中值滤波和双边滤波。通过代码示例和实验结果展示了每种滤波器的实现与应用效果,帮助读者理解不同滤波器在图像去噪和平滑处理中的作用。
摘要由CSDN通过智能技术生成

     【卷积滤波

     邻域算子值利用给定像素周围像素的值决定此像素的最终输出。如图左边图像与中间图像卷积禅城右边图像。目标图像中绿色的像素由原图像中蓝色标记的像素计算得到。


通用线性邻域滤波是一种常用的邻域算子,输入像素加权得到输出像素:


其中权重核   为“滤波系数”。上面的式子可以简记为:



【方框滤波】

最简单的线性滤波是移动平均或方框滤波,用  窗口中的像素值平均后输出,核函数为:

其实等价于图像与全部元素值为1的核函数进行卷积再进行尺度缩放。

代码

OpenCV中的 blur函数是进行标准方框滤波:
  1. void cv::blur( InputArray src, OutputArray dst,  
  2.            Size ksize, Point anchor, int borderType )  
  3. {  
  4.     boxFilter( src, dst, -1, ksize, anchor, true, borderType );  
  5. }  
而boxFilter函数源码如下:
  1. cv::Ptr<cv::FilterEngine> cv::createBoxFilter( int srcType, int dstType, Size ksize,  
  2.                     Point anchor, bool normalize, int borderType )  
  3. {  
  4.     int sdepth = CV_MAT_DEPTH(srcType);  
  5.     int cn = CV_MAT_CN(srcType), sumType = CV_64F;  
  6.     if( sdepth <= CV_32S && (!normalize ||  
  7.         ksize.width*ksize.height <= (sdepth == CV_8U ? (1<<23) :  
  8.             sdepth == CV_16U ? (1 << 15) : (1 << 16))) )  
  9.         sumType = CV_32S;  
  10.     sumType = CV_MAKETYPE( sumType, cn );  
  11.   
  12.     Ptr<BaseRowFilter> rowFilter = getRowSumFilter(srcType, sumType, ksize.width, anchor.x );  
  13.     Ptr<BaseColumnFilter> columnFilter = getColumnSumFilter(sumType,  
  14.         dstType, ksize.height, anchor.y, normalize ? 1./(ksize.width*ksize.height) : 1);  
  15.   
  16.     return Ptr<FilterEngine>(new FilterEngine(Ptr<BaseFilter>(0), rowFilter, columnFilter,  
  17.            srcType, dstType, sumType, borderType ));  
  18. }  
这里 blur 和 boxFilter 的区别是,blur是标准化后的 boxFilter,即boxFilter的核函数:
其中,
  1. 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图像中表示为:

代码

  1. cv::Mat cv::getGaussianKernel( int n, double sigma, int ktype )  
  2. {  
  3.     const int SMALL_GAUSSIAN_SIZE = 7;  
  4.     static const float small_gaussian_tab[][SMALL_GAUSSIAN_SIZE] =  
  5.     {  
  6.         {1.f},  
  7.         {0.25f, 0.5f, 0.25f},  
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值