OpenCV——⼏种图像滤波总结(python 实现和c++实现)
OpenCV——图像滤波原理及实现
4.1 简介
图像的实质是⼀种⼆维信号,滤波是信号处理中的⼀个重要概念。在图像处理中,滤波是⼀种⾮常常见的技术,它们的原理⾮常简单,但是其思想却⼗分值得借鉴,滤波是很多图像算法的前置步骤或基础,掌握图像滤波对理解卷积神经⽹络也有⼀定帮助。
4.2 学习⽬标了解图像滤波的分类和基本概念理解⼏种图像滤波的原理
掌握OpenCV框架下滤波API的使⽤
4.3 内容介绍1、⼏种图像滤波的原理均值滤波/⽅框滤波⾼斯滤波中值滤波
双边滤波2、OpenCV代码实践c++实现
python实现
4.4 算法理论介绍
滤波器分类
线性滤波: 对邻域中的像素的计算为线性运算时,如利⽤窗⼝函数进⾏平滑加权求和的运算,或者某种卷积运算,都可以称为线性滤波。常见的线性滤波有:⽅框滤波、均值滤波、⾼斯滤波、拉普拉斯滤波等等,通常线性滤波器之间只是模版的系数不同。
⾮线性滤波: ⾮线性滤波利⽤原始图像跟模版之间的⼀种逻辑关系得到结果,如最值滤波器,中值滤波器。⽐较常⽤的有中值滤波器和双边滤波器。
卷积核
数字图像是⼀个⼆维的数组,对数字图像做卷积操作其实就是利⽤卷积核在图像上滑动,将图像点上的像素值与对应的卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素点的像素值,并最终滑动完所有图像的过程。
通常,卷积核的宽度和⾼度⼀般是奇数,这样才有中⼼的像素点,所以卷积核⼀般都是3x3,5x5或者7x7等。的卷积核的半径为,例如5x5⼤⼩的卷积核的半径就是2。
两种常见噪声
函数介绍:python中的skimage图像处理模块
skimage .util .random_noise (image , mode , seed =None , clip =True , **kwargs )
该函数可以⽅便的为图像添加各种类型的噪声。
参数:
n ×n (n −1)/2
image 为输⼊图像数据,类型为ndarray,输⼊后将转换为float64格式。
mode 选择添加噪声的类别。字符串str类型。
‘gaussian’ ⾼斯加性噪声
‘poisson’ 泊松分布的噪声
‘salt’ 盐噪声,随机⽤1替换像素。属于⾼灰度噪声。
‘peppe’ 胡椒噪声,随机⽤0或-1替换像素。属于低灰度噪声。
‘s&p’ 椒盐噪声,盐噪声和胡椒噪声同时出现,呈现出⿊⽩杂点。
‘localvar’ ⾼斯加性噪声,每点具有特定的局部⽅差。
‘speckle’ 使⽤ out = image + n *image 的乘法噪声,其中n是具有指定均值和⽅差的均匀噪声。
seed int类型。 将在⽣成噪声之前设置随机种⼦,以进⾏有效的伪随机⽐较。
clip bool类型。若为True则在加⼊噪声后进⾏剪切以保证图像数据点都在[0,1]或[-1.1]之间。若为False,则数据可能超出这个范围。
1、椒盐噪声(脉冲噪声)
椒盐噪声也称为脉冲噪声,是图像中常常见到的⼀种噪声,它是⼀种随机出现的⽩点或者⿊点,可能是亮的区域有⿊⾊像素或是在暗的区域有⽩⾊像素(或是两者皆有)。
产⽣具有椒盐噪声的图像:(python)
from skimage import util
import cv2
if __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 = alize(noise_sp_img,None,0,255, cv2.NORM_MINMAX, cv2.CV_8U)
#储存图像
cv2.imwrite("D:\\yt\\pictures2\\sp_noise.jpg",noise_sp_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果:左边为原图,右边加⼊了椒盐噪声
2、⾼斯噪声
⾼斯噪声是指它的概率密度函数服从⾼斯分布(即正态分布)的⼀类噪声。如果⼀个噪声,它的幅度分布服从⾼斯分布,⽽它的功率谱密度⼜是均匀分布的,则称它为⾼斯⽩噪声。⾼斯⽩噪声的⼆阶矩不相关,⼀阶矩为常数,是指先后信号在时间上的相关性。⾼斯噪声是与光强没有关系的噪声,⽆论像素值是多少,噪声的平均⽔平(⼀般是0)不变。
产⽣具有⾼斯噪声的图像:(python)
from skimage import util
import cv2
if __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 = alize (noise_gs_img , None , 0, 255, cv2.NORM_MINMAX , cv2.CV_8U )
#储存图像
cv2.imwrite ("D:\\yt\\pictures2\\gs_noise.jpg",noise_gs_img )
cv2.waitKey (0)
cv2.destroyAllWindows ()
效果:左边为原图,右边加⼊了⾼斯噪声
4.4.1 均值滤波、⽅框滤波
1. ⽅框(盒⼦)滤波
⽅框滤波是⼀种⾮常有⽤的线性滤波,也叫盒⼦滤波。htmlborder
积分图:
图像积分图中每个点的值是原图像中该点左上⾓的所有像素值之和。
建⽴⼀个数组作为积分图像,其宽度和⾼度与原图像相等.,然后对这个数组赋值,每个点存储的是原图像中该点左上⾓的所有像素值之和。对⼀个灰度图⽽⾔,事先将其积分图构建好,当需要计算灰度图某个区域内所有像素点的像素值之和的时候,都可以通过查表的⽅法和有限次简单运算,迅速得到结果。
优势: 它可以使复杂度为O(MN)的求和,求⽅差等运算降低到O(1)或近似于O(1)的复杂度,也就是说与邻域尺⼨⽆关了,有点类似积分图,但是⽐积分图更快(与它的实现⽅式有关)。
⽅框滤波采⽤下⾯的卷积核与图像进⾏卷积:
应⽤:
可以说,⼀切需要求某个邻域内像素之和的场合,都有⽅框滤波的⽤武之地,⽐如:均值滤波、引导滤波、计算Haar特征等等。⽅框滤波还可以⽤来计算每个像素邻域上的各种积分特性,⽅差、协⽅差,平⽅和等等。
2. 均值滤波
M =⎣⎢⎢⎡111111 (111111)
⎦⎥⎥⎤
均值滤波就是⽅框滤波归⼀化的特殊情况。使卷积核所有的元素之和等于1。卷积核如下:
为卷积核中点的个数。
均值滤波是⽅框滤波的特殊情况,均值滤波⽅法是:对要处理的像素,选择⼀个模板,该模板由其邻域内的若⼲个像素组成,⽤模板的均值来替代原像素的值。
可见,归⼀化了就是均值滤波;不归⼀化则是⽅框滤波。
均值滤波的缺点:
均值滤波本⾝存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从⽽使图像变得模糊,不能很好地去除噪声点。特别是椒盐噪声。
利⽤均值滤波处理图像:
应⽤:
均值模糊可以模糊图像以便得到感兴趣物体的粗略描述,也就是说,去除图像中的不相关细节,其中“不相关”是指与滤波器模板尺⼨相⽐较⼩的像素区域,从⽽对图像有⼀个整体的认知。即为了对感兴趣的物体得到⼀个⼤致的整体的描述⽽模糊⼀幅图像,忽略细⼩的细节。
4.4.2 ⾼斯滤波
在进⾏均值滤波和⽅框滤波时。其邻域内每个像素的权重是相等的。在⾼斯滤波中,会将中⼼点的权重值加⼤,原理中⼼点的权重值减⼩,在此基础上计算邻域内各个像素值不同权重的和。
在⾼斯滤波中,核的宽度和⾼度可以不相同,但是它们都必须是奇数。
在实际应⽤中,卷积核都会经过归⼀化,归⼀化后可以表⽰为⼩数形式或分数形式。没有进⾏归⼀化的卷积核进⾏滤波,结果往往是错误的。
⾼斯滤波和均值滤波⼀样,都是利⽤⼀个掩膜和图像进⾏卷积求解。不同之处在于:均值滤波器的模板系数都是相同的为1,⽽⾼斯滤波器的模板系数,则随着距离模板中⼼的增⼤⽽系数减⼩(服从⼆维⾼斯分布)。所以,⾼斯滤波器相⽐于均值滤波器对图像的模糊程度较⼩,更能够保持图像的整体细节。
⾼斯滤波卷积核:
先介绍⼀下⼆维⾼斯分布:
⾸先我们要确定卷积核的尺⼨ksize,然后设定⾼斯分布的标准差。⽣成的过程,⾸先根据模板的⼤⼩,到模板的中⼼位置。 然后遍历,将模板中每个坐标带⼊⾼斯分布的函数,计算每个位置的系数。
具体过程如下:
不必纠结于系数,因为它只是⼀个常数,并不会影响互相之间的⽐例关系,并且最终都要进⾏归⼀化,所以在实际计算时我们忽略它⽽只计算后半部分。
根据⼆维⾼斯分布公式,其中为卷积核内任⼀点的坐标,为卷积核中⼼点的坐标,通常为;σ是标准差。
M =α1⎣⎢
⎢⎡111111 (111111)
⎦⎥⎥⎤
αf (x ,y )=e (σ)2π21
−((x −u )+(y −u ))/2σ
x 2y 22(u ,u )x y (x ,y )(u ,u )x y (0,0)
例如:要产⽣⼀个3×3的⾼斯滤波器模板,以模板的中⼼位置为坐标原点。模板中各个位置的坐标,
如下图所⽰。
这时,⾼斯分布的函数可以改为:
然后,将各个位置的坐标带⼊到⾼斯函数中,得到的值就是模板的系数。通常模板有两种形式:⼩数
形式和整数形式。⼩数形式:模板的每个系数除以所有系数的和。就得到了归⼀化后的模板,通常为⼩数形式。
整数形式:处理⽅式为,将⼩数模板左上⾓的值归⼀化为1,其他每个系数都除以左上⾓原来的系数,然后四舍五⼊取整。使⽤整数的模板时,需要在模板的前⾯加⼀个系数,系数为模板系数和的倒数。
不难发现,⾼斯滤波器模板的⽣成最重要的参数就是⾼斯分布的标准差σ。标准差代表着数据的离散程度,如果σ较⼩,那么⽣成的模板的中⼼系数较⼤,⽽周围的系数较⼩,这样对图像的平滑效果就不是很明显;反之,σ较⼤,则⽣成的模板的各个系数相差就不是很⼤,⽐较类似均值模板,对图像的平滑效果⽐较明显。
⼀维⾼斯分布的概率分布密度图:图中,紫⾊的σ较⼩,青⾊的σ较⼤。
利⽤⾼斯滤波处理图像:
应⽤: ⾼斯滤波是⼀种线性平滑滤波器,对于服从正态分布的噪声有很好的抑制作⽤。在实际场景中,
我们通常会假定图像包含的噪声为⾼斯⽩噪声,所以在许多实际应⽤的预处理部分,都会采⽤⾼斯滤波抑制噪声,如传统车牌识别等。
4.4.3 中值滤波
中值滤波不再采⽤加权求和的⽅式计算滤波结果,它⽤邻域内所有像素值的中间值来代替当前像素点的像素值。
中值滤波会取当前像素点及其周围临近像素点的像素值,⼀般有奇数个像素点,将这些像素值排序,将排序后位于中间位置的像素值作为当前像素点的像素值。f (x ,y )=e (σ)2π21
−(x +y )/2σ
222(x ,y )
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论