图像平滑处理(滤波)

Author:胡健

1、图像平滑(smooth)也称为“模糊处理”,最常见的smooth的用法是减少图像上的噪声或者失真。
2、图像滤波
什么是图像滤波呢?就是在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制。图像滤波的目的就是消除图像的噪声和抽出对象的特征,图像滤波的要求是:不能损坏图像的重要特征信息(如轮廓和边缘),还需要使得滤波处理后的图像更加清晰。
对于平滑滤波来说,他的目的有两类:(1)、模糊(2)、消噪
空间域内的平滑滤波采用平均法,就是求邻近像素域内的平均亮度值,所以邻域的大小与平滑的效果直接相关,邻域越大,平滑的效果越好,但是需要注意的是,邻域过大的话,平滑处理会使得边缘信息损失得越大。从而使输出的图像变得模糊。
那滤波器是什么呢?
我们可以将滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放在图像之上,透过这个窗口来看我们得到的图像。
下面是一些滤波器:
方框滤波–> boxblur函数来实现 –>线性滤波
均值滤波(邻域平均滤波)–> blur函数 –>线性滤波
高斯滤波–>GaussianBlur函数 –>线性滤波
中值滤波–>medianBlur函数 –>非线性滤波
双边滤波–>bilateralFilter函数 –>非线性滤波

-- PART A  线性滤波器介绍 --

–>什么叫做线性滤波器呢?
线性滤波器常用于剔除输入信号中不想要的频率或者从许多频率中选择一个想要的频率。
下面是几种常见的线性滤波器:
(1)、允许低频率通过的低通滤波器
(2)、允许高频率通过的高通滤波器
(3)、允许一定区域的频率通过的带通滤波器
(4)、阻止一定范围内的频率并且允许其他频率通过的带阻滤波器
(5)、仅仅改变相位的全通滤波器
(6)、阻止一个狭窄频率范围通过的特殊带阻滤波器,陷波滤波器

–>关于滤波和模糊
滤波是将信号中的特定波段频率过滤掉的操作,是为了抑制和防止干扰的措施。
比如高斯滤波,可以分为高斯低通滤波和高斯高通滤波,这个要看高斯函数,低通就是模糊,高通就是锐化。
高斯滤波就是指用高斯函数作为滤波函数的滤波操作,
同样的,高斯模糊就是高斯低通滤波,高斯锐化就是高斯高通滤波。

—–>关于方框滤波

void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )

—->参数介绍
第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。
第三个参数,int类型的ddepth,输出图像的深度,-1代表使用原图深度,即src.depth()。
第四个参数,Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
第五个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
第六个参数,bool类型的normalize,默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了。
第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。
–>均值滤波
均值滤波是最简单的一种滤波操作,输出图像的每一个像素是窗口内的输入图像对应的像素的平均值,也就是归一化后的方框滤波,它的实现也是使用方框滤波来实现的。
实现算法:对于每个像素点,用窗口内的平均像素来替换。
但是均值滤波会破坏图像的细节,从而使得图像变得模糊。

void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )


第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
第三个参数,Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
第四个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
第五个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。
–>高斯滤波
高斯滤波是一种线性滤波,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到的,他的具体操作方式为:
用一个模板(卷积,掩模)扫描图像中的每一个像素点,用模板确定的邻域内的像素的加权平均值取替换模板中心像素点的值。

void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT ) 

· 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
· 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
· 第三个参数,Size类型的ksize高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数。或者,它们可以是零的,它们都是由sigma计算而来。
· 第四个参数,double类型的sigmaX,表示高斯核函数在X方向的的标准偏差。
· 第五个参数,double类型的sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
· 为了结果的正确性着想,最好是把第三个参数Size,第四个参数sigmaX和第五个参数sigmaY全部指定到。
· 第六个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。
下面是二维高斯函数:

/*
    这是进行方框滤波操作的函数,也就是boxFilter
    Author:hujian
    Time:2016/4/5
*/
void cv::boxFilter( InputArray _src, OutputArray _dst, int ddepth,
                Size ksize, Point anchor,
                bool normalize, int borderType )
{
    CV_OCL_RUN(_dst.isUMat(), ocl_boxFilter(_src, _dst, ddepth, ksize, anchor, borderType, 
  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值