7.3 噪声减少
在图像处理领域,通过降低图像中的噪声水平可以改善图像的视觉质量。在现实中,常用的噪声减少方法包括平滑滤波和去噪算法。
7.3.1 均值滤波器
均值滤波器是一种简单而常用的噪声减少技术。它通过在图像中的每个像素周围取一个固定大小的窗口,计算窗口中所有像素的平均值,并将该平均值赋给中心像素。这种方法对于高斯噪声和均匀噪声的去除效果较好,但可能会导致图像的模糊。例如在下面的实例中,演示了使用均值滤波器实现图像噪声减少的过程。
实例7-17:使用均值滤波器实现图像噪声减少
源码路径:daima\7\junjian.py
import cv2
import numpy as np
# 读取图像
image = cv2.imread('888.jpg', cv2.imread_color)
# 将图像转换为灰度图像
gray_image = cv2.cvtcolor(image, cv2.color_bgr2gray)
# 定义均值滤波器的窗口大小
kernel_size = 5
# 使用均值滤波器进行滤波
filtered_image = cv2.blur(gray_image, (kernel_size, kernel_size))
# 显示原始图像和滤波后的图像
cv2.imshow('original image', gray_image)
cv2.imshow('filtered image', filtered_image)
cv2.waitkey(0)
cv2.destroyallwindows()
在上述代码中,首先使用opencv库读取一张彩色图像,并将其转换为灰度图像。然后,我们定义了均值滤波器的窗口大小(在这里是5x5)。最后,使用cv2.blur()函数应用均值滤波器进行滤波,并将滤波后的图像显示出来。通过调整kernel_size的大小,你可以控制滤波器的窗口大小,从而影响滤波的效果。较大的窗口大小可以更有效地平滑图像,但可能会导致细节的丢失。执行效果如图7-10所示。
图7-10 执行效果
7.3.2 中值滤波器
中值滤波器是一种非线性滤波器,对于椒盐噪声等脉冲性噪声的去除效果较好。它的原理是在窗口中取所有像素的中值,并将中值赋给中心像素。中值滤波器能够有效去除离群值,但可能会导致图像细节的损失。例如下面是一个使用中值滤波器实现图像噪声减少的例子。
实例7-18:使用中值滤波器实现图像噪声减少
源码路径:daima\7\zhong.py
import cv2
import numpy as np
# 读取图像
image = cv2.imread('image.jpg', cv2.imread_color)
# 将图像转换为灰度图像
gray_image = cv2.cvtcolor(image, cv2.color_bgr2gray)
# 定义中值滤波器的窗口大小
kernel_size = 5
# 使用中值滤波器进行滤波
filtered_image = cv2.medianblur(gray_image, kernel_size)
# 显示原始图像和滤波后的图像
cv2.imshow('original image', gray_image)
cv2.imshow('filtered image', filtered_image)
cv2.waitkey(0)
cv2.destroyallwindows()
在上述代码中,opencv库读取一张彩色图像,并将其转换为灰度图像。然后,我们定义了中值滤波器的窗口大小(在这里是5x5)。最后,我们使用cv2.medianblur()函数应用中值滤波器进行滤波,并将滤波后的图像显示出来。通过调整kernel_size的大小,可以控制滤波器的窗口大小,从而影响滤波的效果。较大的窗口大小可以更有效地去除椒盐噪声等脉冲性噪声,但可能会导致细节的损失。
7.3.3 高斯滤波器
高斯滤波器是一种线性滤波器,它基于高斯函数对像素进行加权平均。它能够在滤波过程中保留边缘信息,并对高斯噪声有较好的去除效果。高斯滤波器的滤波窗口大小和标准差可以调整以平衡去噪效果和保留图像细节之间的权衡。例如下面是一个使用高斯滤波器实现图像噪声减少的例子。
实例7-19:使用高斯滤波器实现图像噪声减少
源码路径:daima\7\gaolv.py
import cv2
import numpy as np
# 读取图像
image = cv2.imread('image.jpg', cv2.imread_color)
# 将图像转换为灰度图像
gray_image = cv2.cvtcolor(image, cv2.color_bgr2gray)
# 定义高斯滤波器的窗口大小和标准差
kernel_size = 5
sigma = 1.5
# 使用高斯滤波器进行滤波
filtered_image = cv2.gaussianblur(gray_image, (kernel_size, kernel_size), sigma)
# 显示原始图像和滤波后的图像
cv2.imshow('original image', gray_image)
cv2.imshow('filtered image', filtered_image)
cv2.waitkey(0)
cv2.destroyallwindows()
在上述代码中,首先使用opencv库读取一张彩色图像,并将其转换为灰度图像。然后,定义了高斯滤波器的窗口大小(在这里是5x5)和标准差(sigma,控制滤波器的平滑程度)。最后,我们使用cv2.gaussianblur()函数应用高斯滤波器进行滤波,并将滤波后的图像显示出来。通过调整kernel_size的大小和sigma的值,可以控制滤波器的窗口大小和平滑程度,从而影响滤波的效果。较大的窗口大小和较大的标准差可以更有效地平滑图像,但可能会导致细节的损失。
7.3.4 双边滤波器
双边滤波器是一种非线性滤波器,结合了空间域和像素值域的相似性。它通过考虑像素之间的空间距离和灰度值差异来进行滤波。双边滤波器能够保留边缘细节,并对噪声进行有效的抑制。例如下面是一个使用双边滤波器实现图像噪声减少的例子。
实例7-20:使用双边滤波器实现图像噪声减少
源码路径:daima\7\shuang.py
import cv2
import numpy as np
# 读取图像
image = cv2.imread('image.jpg', cv2.imread_color)
# 定义双边滤波器的参数
d = 15 # 邻域直径
sigma_color = 75 # 颜色空间标准差
sigma_space = 75 # 坐标空间标准差
# 使用双边滤波器进行滤波
filtered_image = cv2.bilateralfilter(image, d, sigma_color, sigma_space)
# 显示原始图像和滤波后的图像
cv2.imshow('original image', image)
cv2.imshow('filtered image', filtered_image)
cv2.waitkey(0)
cv2.destroyallwindows()
在上述代码中,首先使用opencv库读取一张彩色图像。然后,我们定义了双边滤波器的参数,包括邻域直径d、颜色空间标准差sigma_color和坐标空间标准差sigma_space。最后,我们使用cv2.bilateralfilter()函数应用双边滤波器进行滤波,并将滤波后的图像显示出来。双边滤波器在滤波时考虑了像素之间的空间距离和灰度值差异,因此能够保留边缘细节,并对噪声进行有效的抑制。
7.3.5 小波降噪
小波降噪是一种基于小波变换的噪声减少技术。小波变换可以将信号分解成不同尺度的频带,噪声通常集中在高频带中。通过对小波系数进行阈值处理,可以将噪声系数设置为零或减小其幅值,然后再进行小波逆变换,恢复图像。小波降噪能够在去噪的同时保留图像的细节和边缘信息。例如下面是一个使用小波降噪实现图像噪声减少的例子。
实例7-21:使用小波降噪实现图像噪声减少
源码路径:daima\7\xiao.py
import cv2
import numpy as np
import pywt
# 读取图像
image = cv2.imread('image.jpg', cv2.imread_grayscale)
# 小波降噪参数
wavelet = 'db1' # 选取小波函数
level = 3 # 分解的层数
# 对图像进行小波分解
coeffs = pywt.wavedec2(image, wavelet, level=level)
# 降噪处理
coeffs_threshold = list(coeffs)
threshold = 10 # 设定阈值
for i in range(1, len(coeffs_threshold)):
coeffs_threshold[i] = tuple(
pywt.threshold(c, threshold) for c in coeffs_threshold[i]
)
# 对图像进行小波重构
image_denoised = pywt.waverec2(coeffs_threshold, wavelet)
# 将像素值限制在0到255之间
image_denoised = np.clip(image_denoised, 0, 255)
# 将图像转换为uint8类型
image_denoised = image_denoised.astype(np.uint8)
# 显示原始图像和降噪后的图像
cv2.imshow('original image', image)
cv2.imshow('denoised image', image_denoised)
cv2.waitkey(0)
cv2.destroyallwindows()
在上述代码中,首先使用opencv库读取一张灰度图像。然后,我们选择了小波函数(这里的参数表示选择了'daubechies 1'小波函数)和分解的层数(这里选择了3级)。然后,我们使用pywt.wavedec2()函数对图像进行小波分解,得到系数数组。接下来,我们对系数进行阈值处理,将小于阈值的系数置为零。最后,我们使用pywt.waverec2()函数对处理后的系数进行小波重构,得到降噪后的图像。通过调整参数wavelet和参数level可以选择不同的小波函数和分解层数,从而影响降噪的效果。调整参数threshold可以控制阈值的大小,进一步调节降噪效果。
发表评论