均值滤波:
均值滤波是典型的线性滤波算法,是指用当前像素点周围n*n个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,可完成整幅图像的均值滤波。
不足之处:均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。
实现:
#均值滤波
import cv2
import numpy as np
img = cv2.imread('./m_girl.jpeg')
dst = cv2.blur(img,(5,5))
cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
高斯滤波:
高斯滤波是一种线性平滑滤波器,对于服从正态分布的噪声有很好的抑制作用。在实际场景中,我们通常会假定图像包含的噪声为高斯白噪声,所以在许多实际应用的预处理部分,都会采用高斯滤波抑制噪声。
高斯滤波和均值滤波一样,都是利用一个掩膜和图像进行卷积求解。不同之处在于:均值滤波器的模板系数都是相同的,为1。而高斯滤波器的模板系数,随着距离模板中心距离的增大,系数减小(服从二维高斯分布)。所以,高斯滤波器相比于均值滤波器而言,对图像模糊程度较小,更能保持图像的整体细节。
二维高斯分布。
其中(x,y)为任意一点坐标,σ是标准差。
首先我们需要产生一个3*3的高斯滤波器。
将各个位置上的坐标带入高斯函数,得到高斯模板。小数形式的模板,就是直接计算得到的值,没有经过任何的处理;整数形式的模板,需要进行归一化处理,将模板左上角的值归一化为1。使用整数的模板时,需要在模板的前面加一个系数,系数为模板中元素和的倒数。
高斯滤波器模板的生成最重要的参数就是高斯分布的标准差σ。标准差代表着数据的离散程度,如果σ较小,那么生成的模板的中心系数较大,而周围的系数较小,这样对图像的平滑效果就不是很明显;反之,σ较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显。
# GaussianBlur(src,ksize,sigmaX[,dst[,sigmaY[,borderType]]])
# kernel 高斯核的大小
# sigmaX X轴的标准差
# sigmaY Y轴的标准差,默认为0,这是sigmaX=sigmaY
# sigma越大,越平滑
利用函数进行实现:
import cv2
import numpy as np
img = cv2.imread('./m_girl.jpeg')
dst = cv2.GaussianBlur(img,(5,5),sigmaX=1)
cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
原图:
处理后:
中值滤波:
中值滤波是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。
中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的。
中值滤波会选取数字图像或数字序列中像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值排序,然后将位于中间位置的像素值作为当前像素点的像素值,让周围的像素值接近真实值,从而消除孤立的噪声点。
实现:
import numpy as np
import cv2
img = cv2.imread('./SJX.jpg')
print(img.shape)
for k in range(1000):
i = int(np.random.random() * img.shape[1])
j = int(np.random.random() * img.shape[0])
img[j, i] = [255, 255, 255]
img[j, i] = [255, 255, 255]
img[j, i] = [255, 255, 255]
dst = cv2.medianBlur(img,5)
cv2.imshow('dst',dst)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
原图:
处理后: