基本概念
高频信息与低频信息
低频就是颜色缓慢变化,也就是灰度缓慢地变化,就代表着那是连续渐变的一块区域。相反高频即灰度变化快,相邻区域的灰度差别大,例如边缘,噪点都是灰度变化快的区域。
图像平滑
图像平滑是要突出图像的低频成分、主干部分或抑制图像噪声和干扰高频成分的图像处理方法,目的是使图像亮度平缓渐变,减小突变梯度,改善图像质量。字面意思就是让图像上颜色灰度变化更光滑。我们也称图像平滑为图像模糊,因为在平滑的时候,也失去了尖锐的特点。
图像去噪
现实中的数字图像在数字化和传输过程中常受到成像设备与外部环境噪声干扰等影响,称为含噪图像或噪声图像。那么除去这些噪声的过程就是图像去噪。
图像去噪平滑常见算法
import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline
def cv_showimg(name,img):
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread('lenaNoise.png')
cv_showimg('img',img)
均值滤波
均值滤波也成线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用原图像中某个像素临近值的均值代替原图像中的像素值。即滤波器的核(kernel)中所有的系数都相等,然后用该核去对图像做卷积。
- 优点: 在一定程度上拉小灰度差异,减少噪声影响。对高斯噪声的表现比较好。
- 缺点: 对图像的边缘处也做均值,导致边缘处变模糊。对椒盐噪声的表现比较差。
blur = cv2.blur(img, (3, 3))
cv_showimg('blur',blur)
方框滤波
基本和均值一样,即滤波器的核(kernel)中所有的系数都相等。但是它可以选择是否归一化,如果归一化,则和均值滤波毫无差别;若不选择归一化,则会导致像素点的值超过255,发生越界。
# -1表示输出图像和原图像在颜色通道上一致
box = cv2.boxFilter(img,-1,(3,3), normalize=True)
cv_showimg('box',box)
box = cv2.boxFilter(img,-1,(3,3), normalize=False)
cv_showimg('box',box)
高斯滤波
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的,离得越近的像素点发挥的作用越大。
高斯核主要取决于σ。如果σ越小,高斯分布中心区域更加聚集,平滑效果越差;反之,则更离散,平滑效果越明显。
aussian = cv2.GaussianBlur(img, (5, 5), 75)
cv_showimg('aussian',aussian)
中值滤波
中值滤波器,使用滤波器窗口包含区域的像素值的中值来得到窗口中心的像素值。是一种非线性平滑滤波器。在去噪同时,较好的保持边缘轮廓细节,适合处理椒盐噪声,但对高斯噪声效果不好。
median = cv2.medianBlur(img, 5)
cv_showimg('median',median)
双边滤波
双边滤波器是一种可以保边去噪的滤波器,也是一种加权平均滤波器,与高斯滤波不同的是,其滤波核是由两个函数构成,一个函数是由几何空间距离决定滤波器系数,另一个由像素差值决定滤波器系数。
适合处理高斯噪声,但对椒盐噪声基本不起任何作用。
# 5是邻域直径,两个75分别是空间高斯函数标准差、灰度值相似性高斯函数标准差
double = cv2.bilateralFilter(img,5,75,75)
cv_showimg('double',double)