目录
一、什么是滤波以及滤波的目的?
二、均值滤波(cv2.blur())
1、原理
2、关键代码
3、封装代码
二、中值滤波(cv2.medianBlur())
1、原理
2、关键代码
3、封装代码
三、高斯滤波(cv2.GasussBlur())
1、原理
2、核模板(权值)
核大小3x3
核大小5x5
3、关键代码
4、封装代码
四、核相同的情况下三种滤波方法对椒盐噪声和高斯噪声的滤波效果比较
1、对椒盐噪声的滤波效果
2、对高斯噪声的滤波效果
五、其他滤波方法
一、什么是滤波以及滤波的目的?
图像滤波也就是图像平滑化, 图像平滑是一种区域增强的算法,平滑算法有邻域平均法、中指滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量(某一像素,如果它与周围像素点相比有明显的不同,则该点被噪声所感染)。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响。图像平滑 有均值滤波、方框滤波、中值滤波和高斯滤波等.
在opencv中都是通过一个搜索窗口即核来对图像进行扫描,将扫描后的结果经过处理作为新的像素值,最终实现滤波
二、均值滤波(cv2.blur())
1、原理
将单个像素及其指定邻域内的所有像素按某种规则计算平均灰度值,再作为新图像中的对应像素值,可以达到滤波去噪的目的。图像边缘一般集中了图像的细节和高频信息,如果通过邻域平均法去噪,往往会引起图像边缘模糊
2、关键代码
dst = cv2.blur(src, (kernalsize,kernalsize))
其中,参数:
src 表示源图像;
ksize 表示核大小。核必须是大于1的奇数,如3、5、7等。这里是以元祖的形式进行赋值
3、封装代码
def mean_denoise(image,kernal_size=3):
'''
对噪声图像进行均值去噪
:param image: 噪声图像
:param kernal_size: 进行均值计算的区域尺寸大小,为奇数,称为核,默认为3
:return: 返回的是去噪后的图像矩阵
'''
noise_img = cv2.imread(image)
md_img = cv2.blur(noise_img,(kernal_size,kernal_size))
return md_img
二、中值滤波(cv2.medianBlur())
常用于处理椒盐噪声
1、原理
在使用邻域平均法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。计算过程如下图所示:
2、关键代码
dst = cv2.medianBlur(src, ksize)
其中,参数:
src 表示源图像;
ksize 表示核大小。核必须是大于1的奇数,如3、5、7等。
3、封装代码
def medium_denoise(image,kernal_size=3):
'''
对噪声图像进行中值去噪
:param image: 噪声图像
:param kernal_size: 进行中值计算的区域尺寸大小,为奇数,称为核,默认为3
:return: 返回的是去噪后的图像矩阵
'''
noise_img = cv2.imread(image)
memd_img = cv2.medianBlur(noise_img,kernal_size)
return memd_img
三、高斯滤波(cv2.GasussBlur())
1、原理
为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。
图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值,下图的所示的 3\times3 和 5\times5 邻域的高斯模板。
常用的非线性滤波方法,具有处理能力强、运算简单、能快速去除脉冲噪声的特点。在去除噪声的同时也能很好地保护图像的边缘信息
2、核模板(权值)
核大小3x3
核大小5x5
3、关键代码
dst = cv2.GaussianBlur(src, ksize, sigmaX)
其中,参数:
src 表示原始图像;
ksize 表示核大小;
sigmaX 表示X方向方差。
注:核大小(N, N)必须是奇数,X方向方差主要控制权重。
4、封装代码
def gasuss_denoise(image,kernal_size=3,sigmaX=0):
'''
对噪声图像进行高斯去噪
:param image: 噪声图像
:param kernal_size: 进行均值计算的区域尺寸大小,为奇数,称为核,默认为3
:param sigmaX:在x方向上的方差分布,默认为0
:return: 返回去噪后的图像矩阵
'''
noise_img = cv2.imread(image)
gasd_img = cv2.GaussianBlur(noise_img, (kernal_size, kernal_size), sigmaX)
return gasd_img
四、核相同的情况下三种滤波方法对椒盐噪声和高斯噪声的滤波效果比较
核越大,平滑效果越好,但是图像模糊,失真
1、对椒盐噪声的滤波效果
def main():
denoise_img1 =mean_denoise("sp_noise.jpg",kernal_size=3)
denoise_img2 = medium_denoise("sp_noise.jpg", kernal_size=3)
denoise_img3 =gasuss_denoise("sp_noise.jpg",kernal_size=3)
noise_img = cv2.imread('sp_noise.jpg')
cv2.imshow('sp_noise',noise_img)
cv2.imshow('mean_denoise',denoise_img1)
cv2.imshow('medium_denoise',denoise_img2)
cv2.imshow('gasuss_denoise',denoise_img3)
cv2.waitKey(0)
if __name__ == '__main__':
main()
中值滤波对椒盐噪声的滤波效果比起其他两种好得多
2、对高斯噪声的滤波效果
def main():
denoise_img1 =mean_denoise("gasuss_noise.jpg",kernal_size=3)
denoise_img2 = medium_denoise("gasuss_noise.jpg", kernal_size=3)
denoise_img3 =gasuss_denoise("gasuss_noise.jpg",kernal_size=3)
noise_img = gasuss_noise=cv2.imread('gasuss_noise.jpg')
cv2.imshow('gasuss_noise',noise_img)
cv2.imshow('mean_denoise',denoise_img1)
cv2.imshow('medium_denoise',denoise_img2)
cv2.imshow('gasuss_denoise',denoise_img3)
cv2.waitKey(0)
if __name__ == '__main__':
main()
滤波效果谁滤波效果谁优谁劣还得看指标参数,可参考下一篇文章:《【图像处理】——图像质量评价指标信噪比(PSNR)和结构相似性(SSIM)》
五、其他滤波方法
参考:《图像滤波》
非局部均值滤波
参考:《OpenCV3学习(5.2)——图像修复inpaint函数和图像去噪fastNlMeansDenoising系列函数》
适用于滤除高斯噪点
在一个图像中,在包含目标像素(噪点)目标区域的附近会存在与之相似的区域,我们将其所有相似的区域的像素值的平均值作为该目标像素点去噪后的像素值。只是这里是通过权重来进行均值的求得。
双边滤波
高通滤波
高通滤波就是去掉低频信号,留下高频信号,这就是高通滤波。
低通滤波
低通滤波就是去掉高频信号,留下低频信号,这就是低通滤波