机器视觉学习-day11-图像噪点消除
1 噪声
噪声指的是图像中的一些干扰因素,通常由于图像的采集设备或传输过程中导致的,表现为图像中部分像素点出现随机亮度,也可以理解为一些像素点与周围的像素点格格不入。
常见噪声分为两类:
高斯噪声:是一种符合正态分布的噪声,会使图像变得有明暗不均的噪点,如果是彩图可能还会出现颜色的分布不均。
椒盐噪声:是一些黑色像素值分布在原图像中,可以把椒盐噪声理解为斑点,随机出现在画面中。
2 滤波器
滤波器:实际上就是之前的卷积核,与自适应二值化中的核一样,本身是一个小区域,有这特定的核值,并且工作原理也实在原图上从左向右、从上到下进行滑动计算。
滤波器可以分为两类:
线性滤波:对卷积核中的邻域像素进行线性计算,例如计算求和等,常见的线性滤波器有均值滤波、高斯滤波等。
非线性滤波:利用原始图像与模板之间的一种逻辑关系得到结果,常见的非线性滤波器有中值滤波、双边滤波等。
2.1 均值滤波
均值滤波是一种最简单的滤波器,它直接计算卷积核区域内元素的平均值。例如3x3的卷积核:
原始图像:1.jpg (高斯噪声图像)
import cv2if __name__ == '__main__':# 1.图片输入image_np = cv2.imread("1.jpg") # cv2.imread(): OpenCV的图像读取函数# 2.滤波算法no_noise_image = cv2.blur( # cv.blur(): OpenCV的均值滤波函数,用于模糊图像/降噪image_np, # 原图(5, 5) # 核)"""均值滤波原理:用一个小窗口(核)在图像上滑动,用窗口内所有像素的平均值代替中心像素(5, 5): 核的大小,这里表示使用5×5的窗口进行计算核大小越大,模糊效果越明显,但计算量也越大"""# 3. 图片输出cv2.imshow('no_noise_image', no_noise_image)cv2.waitKey(0)cv2.imwrite('junzhi.png', no_noise_image)cv2.destroyAllWindows() # 关闭所有由OpenCV创建的窗口,释放资源
均值滤波修改后的图像:junzhi.png
2.2 方框滤波
方框滤波与均值滤波非常像。如3x3的滤波核如下:
参数与均值滤波有相同的也有不同的,只讲解不同的(后文同),新参数:
ddepth 输出图像的深度
-1表示使用原图的深度,即每个像素点占用的位数,最常用的位数是cv2.CV_8U,即8位无符号整数:0-255
normalize 控制a的数值
当此参数为True时,方框滤波就是均值滤波;
当此参数为False时,a=1,相当于在区域内求像素和。
原始图片:2.jpg (暗) 方框滤波在消除噪声的同时会提高图片的亮度
import cv2if __name__ == '__main__':# 1. 图片输入image_np = cv2.imread('2.jpg')# 2. 滤波算法# 方框滤波no_noise_image = cv2.boxFilter(image_np, # 原图-1, # 位深度(3, 3), # 核normalize=False # 标准化参数)# 3. 图片输出cv2.imshow('no_noise_image', no_noise_image)cv2.waitKey(0)cv2.imwrite('fangkuang.png', no_noise_image)
代码运行后:fangkuang.png
2.3 高斯滤波
高斯滤波的核权重计算与自适应二值化的《高斯加权求和》过程完全相同。
当时以3x3为例,计算出核为:
原始图片同上:1.jpg
import cv2
import numpy as npif __name__ == '__main__':# 1. 图片输入image_np = cv2.imread('1.jpg')# 2. 滤波算法# 高斯滤波no_noise_image = cv2.GaussianBlur(image_np, # 原图(5, 5), # 核大小1 # SigmaX与中心像素的权重成反比)"""cv2.GaussianBlur(): OpenCV的高斯滤波函数高斯滤波原理: 使用高斯函数计算权重,对图像进行加权平均模糊与均值滤波不同,高斯滤波给中心像素附近的像素分配更高的权重权重分布遵循高斯分布(钟形曲线),中心权重最高,向外逐渐减小参数详解:image_np: 输入图像(5, 5): 核大小,必须是正奇数,如(3,3)、(5,5)等1: SigmaX,高斯核在X方向的标准差注意:如果只指定SigmaX,SigmaY会自动设为与SigmaX相同"""# 3. 图片输出cv2.imshow('no_noise_image', no_noise_image)cv2.waitKey(0)cv2.imwrite("gaosi.png", no_noise_image)"""
高斯滤波的特点与优势
高斯滤波是一种非常常用的线性滤波器,具有以下特点:平滑效果好: 能有效去除高斯噪声保留边缘: 相比均值滤波,能更好地保留图像边缘可调节性: 通过调整核大小和Sigma值可以控制模糊程度各向同性: 在各个方向上具有相同的平滑效果参数详解与调节核大小 (ksize):必须是正奇数,如(3,3)、(5,5)、(7,7)等值越大,模糊效果越明显,但计算量也越大如果设为(0,0),OpenCV会根据Sigma值自动计算核大小SigmaX:高斯核在X方向的标准差值越大,高斯分布越平坦,模糊效果越明显如果设为0,OpenCV会根据核大小自动计算Sigma值SigmaY:高斯核在Y方向的标准差如果设为0,则与SigmaX相同如果SigmaX和SigmaY都为0,则根据核大小自动计算
"""
运行后图片效果:gaosi.png
2.4 中值滤波
中值就是中位数,是核中对应的像素排序后的中间值,因此核本身没有数值,也不需要新增的参数。需要注意的是,默认的边界填充算法是边界复制。
原始图像:3.jpg (椒盐噪声)
import cv2if __name__ == '__main__':# 1. 图片输入image_np = cv2.imread('3.jpg') # 读取名为'123.jpg'的图片,并将其存储在变量image_np中# 2. 滤波算法# 中值滤波no_noise_image = cv2.medianBlur( # 调用中值滤波函数image_np, # 输入的原图像3 # 滤波核的大小,这里是3x3的窗口)# 3. 图片输出cv2.imshow('no_noise_image', no_noise_image) # 创建一个窗口显示处理后的图像cv2.waitKey(0) # 等待用户按下任意键继续cv2.imwrite('zhongzhi.png', no_noise_image)"""中值滤波是一种非线性数字滤波技术,常用于去除图像中的"椒盐噪声"(随机出现的黑白点),同时能较好地保留图像边缘信息。中值滤波步骤:定义滑动窗口:选择一个窗口(通常是奇数大小的正方形,如3×3、5×5) 遍历图像像素:将窗口中心对准图像的每一个像素 收集邻域值:获取窗口覆盖范围内的所有像素值 排序并取中值:将这些像素值按大小排序,取中间值 替换中心像素:用这个中值替换窗口中心的原始像素值"""
代码运行:zhongzhi.png
2.5 双边滤波
前面的滤波器都丢失了一些图像信息,使图像边缘变得更加难以处理,边缘是图像处理中非常重要的特征,因此可以使用双边滤波保留更多的边缘信息。
原始图片同上:3.jpg
import cv2
import numpy as npif __name__ == '__main__':# 1. 图片输入image_np = cv2.imread('3.jpg')# 2. 滤波算法# 双边滤波no_noise_image = cv2.bilateralFilter(image_np, # 原图9, # 核,直径d80, # SigmaColor80 # sigmaSpace)"""cv2.bilateralFilter(): OpenCV的双边滤波函数双边滤波原理: 与简单均值滤波不同,双边滤波是一种非线性滤波器,它同时考虑空间距离和像素值相似性空间距离: 靠近中心像素的像素有更大权重像素值相似性: 与中心像素值相似的像素有更大权重参数详解:image_np: 输入图像9: 滤波器的直径d,表示每个像素邻域的直径80: SigmaColor,颜色空间的标准差,控制颜色相似性判断80: SigmaSpace,坐标空间的标准差,控制空间距离判断"""# 3. 图片输出cv2.imshow('no_noise_image', no_noise_image)cv2.waitKey(0)cv2.imwrite("shuangbian.png", no_noise_image)
运行后图片:shuangbian.png