均值滤波器类型_详解图像滤波原理及实现!

均值滤波器类型_详解图像滤波原理及实现!
图像的实质是⼀种⼆维信号,滤波是信号处理中的⼀个重要概念。在图像处理中,滤波是⼀常见的技术,它们的原理⾮常简单,但是其思想却⼗分值得借鉴,滤波是很多图像算法的前置步骤或基础,掌握图像滤波对理解卷积神经⽹络也有⼀定帮助。
学习⽬标:了解图像滤波的分类和基本概念
理解⼏种图像滤波的原理
掌握OpenCV框架下滤波API的使⽤
蛋白芯片
算法理论介绍
滤波器分类
线性滤波:对邻域中的像素的计算为线性运算时,如利⽤窗⼝函数进⾏平滑加权求和的运算,或者某种卷积运算,都可以称为线性滤波。常见的线性滤波有:⽅框滤波、均值滤波、⾼斯滤波、拉普拉斯滤波等等,通常线性滤波器之间只是模版的系数不同。
⾮线性滤波:⾮线性滤波利⽤原始图像跟模版之间的⼀种逻辑关系得到结果,如最值滤波器,中值滤波器。⽐较常⽤的有中值滤波器和双边滤波器。
卷积核
数字图像是⼀个⼆维的数组,对数字图像做卷积操作其实就是利⽤卷积核在图像上滑动,将图像点上的像素值与对应的卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素点的像素值,并最终滑动完所有图像的过程。
通常,卷积核的宽度和⾼度⼀般是奇数,这样才有中⼼的像素点,所以卷积核⼀般都是3x3,5x5或者7x7等。$n×n$的卷积核的半径为$(n-1)/2$,例如5x5⼤⼩的卷积核的半径就是2。
两种常见噪声
函数介绍:python中的skimage图像处理模块,该函数可以⽅便的为图像添加各种类型的噪声。
skimage.util.random_noise(image, mode, seed=None, clip=True, **kwargs)参数:image 为输⼊图像数据,类型为ndarray,输⼊后将转换为float64格式。
mode  选择添加噪声的类别。字符串str类型。'gaussian' ⾼斯加性噪声
'poisson' 泊松分布的噪声
'salt' 盐噪声,随机⽤1替换像素。属于⾼灰度噪声。
'peppe' 胡椒噪声,随机⽤0或-1替换像素。属于低灰度噪声。b7125
's&p' 椒盐噪声,盐噪声和胡椒噪声同时出现,呈现出⿊⽩杂点。
'localvar' ⾼斯加性噪声,每点具有特定的局部⽅差。
'speckle' 使⽤ out = image + n *image 的乘法噪声,其中n是具有指定均值和⽅差的均匀噪声。
seed int类型。将在⽣成噪声之前设置随机种⼦,以进⾏有效的伪随机⽐较。
clip bool类型。若为True则在加⼊噪声后进⾏剪切以保证图像数据点都在[0,1]或[-1.1]之间。若为False,则数据可能超出这个范围。
1、椒盐噪声(脉冲噪声)
椒盐噪声也称为脉冲噪声,是图像中常常见到的⼀种噪声,它是⼀种随机出现的⽩点或者⿊点,可能是亮的区域有⿊⾊像素或是在暗的区域有⽩⾊像素(或是两者皆有)。产⽣具有椒盐噪声的图像:(pytho
n)
from skimage import utilimport cv2if __name__ == "__main__":img = cv2.imread("D:\\yt\\pictures2\\wink.jpg")#产⽣椒盐噪声,处理后图像变为float64格式noise_sp_img = util.random_noise(img, mode="s&p")#显⽰图像cv2.imshow("origin
image",img)cv2.imshow("sp noise",noise_sp_img)#将图像转换为uint8格式,否则保存后是全⿊的。noise_sp_img =
cv2.imwrite("D:\\yt\\pictures2\\sp_noise.jpg",noise_sp_img)cv2.waitKey(0)cv2.destroyAllWindows()
效果:左边为原图,右边加⼊了椒盐噪声
2、⾼斯噪声
⾼斯噪声是指它的概率密度函数服从⾼斯分布(即正态分布)的⼀类噪声。如果⼀个噪声,它的幅度分布服从⾼斯分布,⽽它的功率谱密度⼜是均匀分布的,则称它为⾼斯⽩噪声。
⾼斯⽩噪声的⼆阶矩不相关,⼀阶矩为常数,是指先后信号在时间上的相关性。⾼斯噪声是与光强没有关系的噪声,⽆论像素值是多少,噪声的平均⽔平(⼀般是0)不变。产⽣具有⾼斯噪声的图像:(python)
from skimage import utilimport cv2if __name__ == "__main__":img = cv2.imread("D:\\yt\\pictures2\\wink.jpg")#产⽣⾼斯噪声,处理后图像变为float64格式noise_gs_img = util.random_noise(img, mode="gaussian")#显⽰图像cv2.imshow("origin image",img)cv2.imshow("gaussian noise",noise_gs_img#将图像转换为uint8格式,否则保存后是全⿊的。noise_gs_img =
cv2.imwrite("D:\\yt\\pictures2\\gs_noise.jpg",noise_gs_img)cv2.waitKey(0)cv2.destroyAllWindows()
效果:左边为原图,右边加⼊了⾼斯噪声
⼏种图像滤波
均值滤波、⽅框滤波
丝绸之路经济带概念1、⽅框(盒⼦)滤波
⽅框滤波是⼀种⾮常有⽤的线性滤波,也叫盒⼦滤波。积分图:图像积分图中每个点的值是原图像中该点左上⾓的所有像素值之和。建⽴⼀个数组作为积分图像,其宽度和⾼度与原图像相等.,然后对这个数组赋值,每个点存储的是原图像中该点左上⾓的所有像素值之和。对⼀个灰度图⽽⾔,事先将其积分图构建好,当需要计算灰度图某个区域内所有像素点的像素值之和的时候,都可以通过查表的⽅法和有限次简单运算,迅速得到结果。优势:它可以使复杂度为O(MN)的求和,求⽅差等运算降低到O(1)或近似于O(1)的复杂度,也就是说与邻域尺⼨⽆关了,有点类似积分图,但是⽐积分图更快(与它的实现⽅式有关)。
⽅框滤波采⽤下⾯的卷积核与图像进⾏卷积:
应⽤:
可以说,⼀切需要求某个邻域内像素之和的场合,都有⽅框滤波的⽤武之地,⽐如:均值滤波、引导滤波、计算Haar特征等等。⽅框滤波还可以⽤来计算每个像素邻域上的各种积分特性,⽅差、协⽅差,平⽅和等等。
2、均值滤波
均值滤波就是⽅框滤波归⼀化的特殊情况。使卷积核所有的元素之和等于1。卷积核如下:
α为卷积核中点的个数。
均值滤波是⽅框滤波的特殊情况,均值滤波⽅法是:对要处理的像素,选择⼀个模板,该模板由其邻域内的若⼲个像素组成,⽤模板的均值来替代原像素的值。可见,归⼀化了就是均值滤波;不归⼀化则是⽅框滤波。
均值滤波的缺点:
均值滤波本⾝存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从⽽使图像变得模糊,不能很好地去除噪声点。特别是椒盐噪声。
利⽤均值滤波处理图像:
应⽤:
均值模糊可以模糊图像以便得到感兴趣物体的粗略描述,也就是说,去除图像中的不相关细节,其中“不相关”是指与滤波器模板尺⼨相⽐较⼩的像素区域,从⽽对图像有⼀个整体的认知。即为了对感兴趣的物体得到⼀个⼤致的整体的描述⽽模糊⼀幅图像,忽略细⼩的细节。
⾼斯滤波
在进⾏均值滤波和⽅框滤波时。其邻域内每个像素的权重是相等的。在⾼斯滤波中,会将中⼼点的权重值加⼤,原理中⼼点的权重值减⼩,在此基础上计算邻域内各个像素值不同权重的和。在⾼斯滤波中,核的宽度和⾼度可以不相同,但是它们都必须是奇数。在实际应⽤中,卷积核都会经过归⼀化,归⼀化后可以表⽰为⼩数形式或分数形式。没有进⾏归⼀化的卷积核进⾏滤波,结果往往是错误的。⾼斯滤波和均值滤波⼀样,都是利⽤⼀个掩膜和图像进⾏卷积求解。不同之处在于:均值滤波器的模板系数都是相同的为1,⽽⾼斯滤波器的模板系数,则随着距离模板中⼼的增⼤⽽系数减⼩(服从⼆维⾼斯分布)。所以,⾼斯滤波器相⽐于均值滤波器对图像的模糊程度较⼩,更能够保持图像的整体细节。
⾼斯滤波卷积核:
先介绍⼀下⼆维⾼斯分布:
⾸先我们要确定卷积核的尺⼨ksize,然后设定⾼斯分布的标准差。⽣成的过程,⾸先根据模板的⼤⼩,到模板的中⼼位置。 然后遍历,将模板中每个坐标带⼊⾼斯分布的函数,计算每个位置的系数。具体过程如下:
不必纠结于系数,因为它只是⼀个常数,并不会影响互相之间的⽐例关系,并且最终都要进⾏归⼀化,所以在实际计算时我们忽略它⽽只计算后半部分。根据⼆维⾼斯分布公式,其中为卷积核内任⼀点的坐标,为卷积核中⼼点的坐标,通常为;σ是标准差。
例如:要产⽣⼀个3×3的⾼斯滤波器模板,以模板的中⼼位置为坐标原点。模板中各个位置的坐标,如下图所⽰。
这时,⾼斯分布的函数可以改为:然后,将各个位置的坐标带⼊到⾼斯函数中,得到的值就是模板的系数。通常模板有两种形式:⼩数形式和整数形式。⼩数形式:模板的每个系数除以所有系数的和。就得到了归⼀化后的模板,通常为⼩数形式。
整数形式:处理⽅式为,将⼩数模板左上⾓的值归⼀化为1,其他每个系数都除以左上⾓原来的系数,然后四舍五⼊取整。使⽤整数的模板时,需要在模板的前⾯加⼀个系数,系数为模板系数和的倒数。不难发现,⾼斯滤波器模板的⽣成最重要的参数就是⾼斯分布的标准差σ。标准差代表着数据的离散程度,如果σ较⼩,那么⽣成的模板的中⼼系数较⼤,⽽周围的系数较⼩,这样对图像的平滑效
果就不是很明显;反之,σ较⼤,则⽣成的模板的各个系数相差就不是很⼤,⽐较类似均值模板,对图像的平滑效果⽐较明显。
⼀维⾼斯分布的概率分布密度图:图中,紫⾊的σ较⼩,青⾊的σ较⼤。
利⽤⾼斯滤波处理图像:
应⽤: ⾼斯滤波是⼀种线性平滑滤波器,对于服从正态分布的噪声有很好的抑制作⽤。在实际场景中,我们通常会假定图像包含的噪声为⾼斯⽩噪声,所以在许多实际应⽤的预处理部分,都会采⽤⾼斯滤波抑制噪声,如传统车牌识别等。琼斯矩阵
中值滤波
中值滤波不再采⽤加权求和的⽅式计算滤波结果,它⽤邻域内所有像素值的中间值来代替当前像素点的像素值。中值滤波会取当前像素点及其周围临近像素点的像素值,⼀般有奇数个像素点,将这些像素值排序,将排序后位于中间位置的像素值作为当前像素点的像素值。中值滤波对于斑点噪声(speckle noise)和椒盐噪声(salt-and-pepper  noise)来说尤其有⽤,因为它不依赖于邻域内那些与典型值差别很⼤的值,⽽且噪声成分很难被选上,所以可以在⼏乎不影响原有图像的情况下去除全部噪声。但是由于需要进⾏排序操作,中值滤波的计算量较⼤。中值滤波器在处理连续图像窗函数时与线性滤波器的⼯作⽅式类似,但滤波过程却不再是加权运算。
如下图:滤波核⼤⼩为3,邻域内的像素值排序后为[56,66,90,91,93,94,95,97,101],中值为93,所以⽤93替换中⼼点原来的像素值56。
双边滤波
双边滤波是综合考虑空间信息和⾊彩信息的滤波⽅式,在滤波过程中能有效的保护图像内的边缘信息。双边滤波在计算某⼀个像素点的像素值时,同时考虑距离信息(距离越远,权重越⼩)和⾊彩信息(⾊彩差别越⼤,权重越⼩)。既能去除噪声,⼜能较好的保护边缘信息。
如下图:左边为原图,中间为均值滤波可能的结果,右边为双边滤波的结果
在双边滤波中,计算左侧⽩⾊区域的滤波结果时:对于⽩⾊的点,权重较⼤
对于⿊⾊的点,与⽩⾊的⾊彩差别较⼤(0和255),所以可以将他们的权重设置为0。
计算右侧⿊⾊区域的滤波结果时:对于⿊⾊的点,权重较⼤
对于⽩⾊的点,与⿊⾊的⾊彩差别较⼤(255和0),所以可以将他们的权重设置为0。
这样,左侧⽩⾊的滤波结果仍是⽩⾊,⿊⾊的像素点权重为0,对它不会有影响;右侧⿊⾊的滤波结果仍是⿊⾊,⽩⾊的像素点权重为0,对它不会有影响。所以,双边滤波会将边缘信息保留。
边界处理
对于图像的边界点,不存在n×n的邻域区域,例如左上⾓第⼀⾏第⼀列的像素点,如果以其为中⼼取3×3的领域,则部分区域位于图像外部,图像外部是没有像素点和像素值的,所以⽆法计算像素和。在实际处理过程中需要对图像边界进⾏扩充,如下图。
扩充后的点需要填充像素值,常见的⼏种⽅式:BORDER_DEFAULT:以边界像素点为轴,填充对称的像素点处的像素值。也是OpenCV 的默认⽅式。
BORDER_CONSTANT:使⽤常数填充,可以是0或其他常数。
BORDER_REPLICATE:复制最近的⼀⾏或⼀列像素并⼀直延伸⾄添加边缘的宽度或⾼度;
BORDER_REFLECT:以边界为轴,填充对称的像素点处的像素值。
BORDER_WRAP:将对⾯的像素进⾏映射。
为了更直观的体现填充情况,这⾥设卷积核为5×5的,填充情况如下:
基于OpenCV的实现
菲特台风路径c++实现
1、⽅框滤波
void boxFilter( InputArray src, OutputArray dst,                int ddepth,                Size ksize,                  Point anchor = Point(-1,-1),                bool normalize = true,                int borderType = BORDER_DEFAULT );
参数:src 输⼊图像
dst 输出图像,和输⼊图像有相同尺⼨和类型
ddepth 输出图像的深度,-1代表使⽤原图深度
ksize 滤波核的⼤⼩,⼀般写成Size(w,h),w表⽰宽度,h表⽰⾼度。Size(3,3)就表⽰3x3的核⼤⼩,Size(5,5)就表⽰5x5的核⼤⼩
anchor 表⽰锚点(即被平滑的那个点),默认值为Point(-1,-1),表⽰当前计算的点位于核中⼼的位置。如果这个点坐标是负值,就表⽰取核的中⼼为锚点。在特殊情况下可以指定不同的点作为锚点
normalize – 表⽰在滤波时是否进⾏归⼀化。
当normalize=1或true时,表⽰要进⾏归⼀化处理;计算的就是均值滤波。
当normalize=0或false时,表⽰不进⾏归⼀化处理。
borderType – 边界样式,决定了以何种⽅式处理边界,⼀般采⽤默认值即可。
关于是否归⼀化:
如果没有进⾏归⼀化处理,邻域内的像素值和基本都会超过像素的最⼤值255,最后得到的图像接近纯⽩⾊,部分点处有颜⾊。有颜⾊的点是因为这些点周围邻域的像素值均较⼩,相加后仍⼩于255。如下图:
2、均值滤波
void blur( InputArray src,          OutputArray dst,          Size ksize,          Point anchor = Point(-1,-
1),          int borderType = BORDER_DEFAULT);
参数:src 输⼊图像
dst 输出图像,和输⼊图像有相同尺⼨和类型
ddepth 输出图像的深度,-1代表使⽤原图深度
ksize 滤波核的⼤⼩,⼀般写成Size(w,h),w表⽰宽度,h表⽰⾼度。Size(3,3)就表⽰3x3的核⼤⼩,Size(5,5)就表⽰5x5的核⼤⼩
anchor 表⽰锚点(即被平滑的那个点),默认值为Point(-1,-1),表⽰当前计算的点位于核中⼼的位置。如果这个点坐标是负值,就表⽰取核
的中⼼为锚点。在特殊情况下可以指定不同的点作为锚点
borderType – 边界样式,决定了以何种⽅式处理边界,⼀般采⽤默认值即可。
3、⾼斯滤波
void GaussianBlur(InputArray src, OutputArray dst,                  Size ksize,                  double sigmaX, double sigmaY=0,
参数:src 输⼊图像
闫肖锋
dst 输出图像,和输⼊图像有相同尺⼨和类型
ddepth 输出图像的深度,-1代表使⽤原图深度
ksize 滤波核的⼤⼩,⼀般写成Size(w,h),w表⽰宽度,h表⽰⾼度。Size(3,3)就表⽰3x3的核⼤⼩,Size(5,5)就表⽰5x5的核⼤⼩
sigmaX 表⽰卷积核在X⽅向的的标准偏差。
sigmaY 表⽰卷积核在Y⽅向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
sigmaX=0.3×[(ksize.width-1)×0.5-1]+0.8
sigmaY=0.3×[(ksize.height-1)×0.5-1]+0.8
borderType – 边界样式,决定了以何种⽅式处理边界,⼀般采⽤默认值即可。
4、中值滤波
void medianBlur(InputArray src, OutputArray dst, int ksize);

本文发布于:2024-09-22 07:31:59,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/116781.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   滤波   噪声   像素
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议