当我们用树莓派进行opencv图像处理时,摄像头所获取的图像质量通常会有所下降,此时,需要多种手段来优化图像的质量,提高图像识别的准度。今天所记录的是当图片经过传输等过程后出现的图像噪声现象及对应解决方法——平滑
在数字图像的采集、处理和传输过程中,可能会受到各种噪声的干扰,这会导致图像质量下降、图像变得模糊,甚至使图像的特征难以辨认。为了增强图像的质量,我们需要对图像进行平滑处理,以去除这些噪声的影响。常见的图像噪声包括椒盐噪声和高斯噪声等。
椒盐噪声也称为脉冲噪声,是一种随机出现的白点或黑点,具体表现为亮的区域有黑色像素,或是暗的区域有白色像素,又或是两者皆有
下图中,左图为原图像,右图为添加椒盐噪声的图像
高斯噪声是指概率密度函数服从高斯分布(正态分布)的一类噪声
下图中,左图为原图像,右图为添加高斯噪声的图像
从信号处理的角度分析,图像平滑就是去除其中的高频信息,保留低频信息,即可以通过低通滤波来去除图像中的噪声,实现对图像的平滑处理。 根据滤波器的不同,滤波方式可分为均值滤波、高斯滤波和中值滤波。
均值滤波就是对图像的所有像素点进行取均值,即以一个方形区域为单位,将该区域的中心像素点赋值为区域内所有像素点的平均值。如图所示3*3矩形,中心值为235,这个值由于过大,会形成黑点,即噪声图像,为了消除噪声,将这个点重新设置为以它为中心的九个点的平均值,即:
(23+98+168+46+235+2+67+55+211) 9 = 100.5
均值滤波是一种简单的滤波方法,尤其对高斯噪声的消除有较好的作用,但通常会使图像的细节变的稍微模糊,在需要观察图像细节时不建议使用均值滤波
均值滤波处理函数如下:
cv2.blur(scr, ksize)
其中的两个参数分别为:
(1)“scr”, 要处理的图像
(2) “ksize”, 滤波核的大小,它是一个表示宽度和高度的元组。例如,(3, 3)表示一个3*3的滤波核
高斯滤波就是对图像的所有像素点进行加权平均,即以一个方形区域为单位,将其中心像素点赋值为该区域的加权平均值:
23*0.05+98*0.1+168*0.05+46*0.1+235*0.4+2*0.1+67*0.5+55*0.1+211*0.05 = 137
高斯滤波考虑了像素周围邻域的距离,使得离中心像素更近的像素具有更高的权重,可以有效地去除噪声,同时保留图像的边缘和细节
高斯滤波处理函数如下:
cv2.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType)
其中的五个参数分别为:
(1)“src”, 要处理的图像
(2)“ksize”, 高斯滤波核的大小,它是一个表示宽度和高度的元组。例如,(3, 3)表示一个3*3的滤波核
(3)“sigmaX”, X方向的高斯核标准差,通常可以写为0或者不写
(4)“sigmaY”, Y方向的高斯核标准差,如果sigmaY为0,则默认与sigmaX相同
(5)“borderType”, 边界处理类型,用于处理滤波核超出图像边界的情况
中值滤波就是对图像的所有像素点进行取中值,即以一个方形区域为单位,将其中心像素点赋值为该区域的中值。例如下图所示3*3矩形中:2、23、46、55、67、98、168、211、235,其中67为中值,所以将中心设置为67
中值滤波是一种非线性滤波方法,对于去除椒盐噪声等椒盐噪声非常有效,但可能会导致图像细节的模糊。
中值滤波处理函数如下:
cv2.medianBlur(src, ksize)
(1)“scr”, 要处理的图像
(2) “ksize”, 滤波核的大小,它是一个表示宽度和高度的元组。例如,(3, 3)表示一个3*3的滤波核
三种滤波方法的具体应用代码如下:
import cv2
# 图像读取
img = cv2.imread('noise.jpg')
# 图像平滑
blur1 = cv2.blur(img, (5, 5)) # 均值滤波
blur2 = cv2.GaussianBlur(img, (5, 5), 1) # 高斯滤波
blur3 = cv2.medianBlur(img, 5) # 中值滤波
# 图像显示
cv2.imshow('image1', img)
cv2.imshow('image2', blur1)
cv2.imshow('image3', blur2)
cv2.imshow('image4', blur3)
cv2.waitKey(0)
cv2.destroyAllWindows()