图像去噪简单介绍—并给出示例代码

图像去噪简单介绍—并给出示例代码

图像去噪是指在图像中移除噪声,以使其更加清晰。在本教程中,我们将深入介绍图像去噪的基本原理、常见噪声类型,以及几种常用的去噪方法,包括传统的滤波方法和深度学习方法。

去噪的基本原理

在讲解去噪的方法之前,我们需要了解一些基本原理。噪声通常被定义为信号中的任何不希望的成分,它们可能来自摄像机或传感器中的电子噪声,图像传输过程中的信号干扰,或者是在拍摄时因环境条件而产生的混淆,比如高温、强光或者颜色失真等。

去噪的主要原理就是对噪声进行消除或压制,并尽可能保留原始图像的特征。在去噪过程中,我们需要将图像中的噪声与有用的图像信息区分开来,并尝试还原原始图像的细节和信息。

常见的噪声类型

在图像去噪之前,了解不同类型的噪声及其统计特性非常重要。下面介绍几种常见的噪声类型。

高斯噪声

高斯噪声是一种满足正态分布的噪声类型,它可以形成在各种摄像机、传感器、通信通道中,通常是由于不可避免的随机波动造成的。

椒盐噪声

椒盐噪声通常是由于数字图像传输或存储过程中丢失像素信息造成的。它会在图像中随机出现黑色或白色像素,对图像质量造成明显的影响。

马赛克噪声

马赛克噪声通常是由于像素化和压缩造成的,这种噪声让图像看起来像是由一组相同颜色的小方块组成的,从而影响图像的质量和清晰度。

脉冲噪声

脉冲噪声是由于短时间内发生的突发性信号造成的。它通常表现为明显的高亮度/低亮度的像素点,对图像的质量和清晰度造成极大影响。

添加噪声的代码

添加高斯噪声

以下是使用 Python 和 NumPy 库为一个图像添加高斯噪声的示例代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread('input.jpg')

# 添加高斯噪声
mean = 0
var = 0.1
sigma = var ** 0.5
gaussian = np.random.normal(mean, sigma, img.shape)
gaussian = gaussian.reshape(img.shape)
noisy_img = img + gaussian

# 将像素值限制在 0 和 255 之间
noisy_img = np.clip(noisy_img, 0, 255)

# 显示带噪声的图像
cv2.imshow('noisy image', noisy_img.astype(np.uint8))
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,我们首先使用 cv2.imread() 函数读取一个名为 input.jpg 的图像。然后,我们使用 NumPy 库中的 np.random.normal() 函数生成一个与输入图像大小相同的高斯噪声数组,并将其加到输入图像中。最后,我们使用 np.clip() 函数将像素值限制在 0 和 255 之间,并使用 cv2.imshow() 函数显示带噪声的图像。

在添加高斯噪声时,我们可以调整 var 参数来控制噪声的强度。如果 var 值较小,噪声将不太明显;如果 var 值较大,噪声将更明显。

添加椒盐噪声

以下是使用 Python 和 NumPy 库为一个图像添加椒盐噪声的示例代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread('input.jpg')

# 添加椒盐噪声
p = 0.05  # 像素点被替换为椒盐噪声的概率
salt_vs_pepper = 0.5  # 椒盐噪声的比例
num_salt = np.ceil(p * img.size * salt_vs_pepper)
num_pepper = np.ceil(p * img.size * (1.0 - salt_vs_pepper))
coords = [np.random.randint(0, i - 1, int(num_salt)) for i in img.shape]
img[coords[0], coords[1], :] = 255
coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in img.shape]
img[coords[0], coords[1], :] = 0

# 显示带噪声的图像
cv2.imshow('noisy image', img.astype(np.uint8))
cv2.imwrite('noise_pic.jpg', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,我们首先使用 cv2.imread() 函数读取一个名为 input.jpg 的图像。然后,我们使用 NumPy 库中的随机数函数来生成椒盐噪声,并将其添加到原始图像中。其中,p 是像素点被替换为椒盐噪声的概率,salt_vs_pepper 是椒盐噪声的比例,num_saltnum_pepper 是椒盐噪声点的数量。最后,我们使用 cv2.imshow() 函数显示带噪声的图像。

请注意,椒盐噪声会随机替换像素点的值为黑色或白色,因此它会严重破坏图像的细节和特征。因此,为了使噪声更加真实,通常需要在添加椒盐噪声时使用一些概率和比例参数来控制噪声的数量和分布。

同时添加高斯和椒盐噪声,处理图片之后如下所示。

import cv2
import numpy as np

# 读取图像
img = cv2.imread('pic_2.png')

# 添加高斯噪声
mean = 0
var = 0.1
sigma = var ** 0.5
# 生成符合高斯分布的随机噪声,均值为0,标准差为sigma
gaussian = np.random.normal(mean, sigma, img.shape)
# 将噪声的形状改为与原始图像相同
gaussian = gaussian.reshape(img.shape)
# 将随机噪声添加到原始图像中
noisy_img = img + gaussian

# 添加椒盐噪声
s_vs_p = 0.5
amount = 0.05
# 计算添加的椒盐噪声点的数量
num_salt = np.ceil(amount * img.size * s_vs_p)
num_pepper = np.ceil(amount * img.size * (1.0 - s_vs_p))
# 生成坐标数组,用于添加椒盐噪声
coords_salt = [np.random.randint(0, i - 1, int(num_salt)) for i in img.shape]
coords_pepper = [np.random.randint(0, i - 1, int(num_pepper)) for i in img.shape]
# 将椒盐噪声点的像素值分别设置为白色和黑色
noisy_img[coords_salt[0], coords_salt[1], :] = 255
noisy_img[coords_pepper[0], coords_pepper[1], :] = 0

# 将像素值限制在 0 和 255 之间
noisy_img = np.clip(noisy_img, 0, 255)

# 显示带噪声的图像
cv2.imshow('noisy image', noisy_img.astype(np.uint8))
cv2.imwrite('noise_pic.jpg', noisy_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

请添加图片描述

请添加图片描述

整幅原图如下:
请添加图片描述

常用的去噪方法

下面介绍几种常用的去噪方法。

均值滤波

均值滤波是一种基本的线性滤波算法,它是指通过取周围像素的平均值,来代替当前像素的值。这种方法适用于图像中的高斯噪声。噪声越多,需要取的邻域像素值就越多。具体操作如下:

  1. 首先,我们需要选取一个大小为 m×n 的窗口(m* 和 n* 一般为奇数)。
  2. 将该窗口置于图像的每一个像素上。
  3. 取窗口中所有像素的平均值,并将其设置为当前像素的值。
import cv2

# 读取图像
img = cv2.imread('noise_pic.jpg')

# 均值滤波
dst = cv2.blur(img, (3, 3))

# 保存处理后的图像
cv2.imwrite('output.jpg', dst)

中值滤波

中值滤波是一种简单而有效的图像去噪方法。它的原理是将每个像素的值替换为它周围像素值的中位数。这种方法特别适用于消除椒盐噪声,即随机黑白像素点。

中值滤波是一种非线性滤波方法,它是通过取邻域像素值的中值来代替当前像素的值。相比于均值滤波,中值滤波更能保留图像的细节。因此,它更适用于椒盐噪声等噪声类型(其中一些像素会被明显赋值为黑或白)。具体操作如下:

  1. 首先,我们需要选取一个大小为 m×n* 的窗口(m* 和 n* 一般为奇数)。
  2. 将该窗口置于图像的每一个像素上。
  3. 取窗口中所有像素的中值,并将其设置为当前像素的值。
import cv2

# 读取图像
img = cv2.imread('input.jpg')

# 中值滤波
dst = cv2.medianBlur(img, 3)

# 保存处理后的图像
cv2.imwrite('output.jpg', dst)

高斯滤波

高斯滤波是一种广泛应用的图像去噪方法。它的原理是将每个像素的值替换为其周围像素值的加权平均值,其中权重由高斯函数计算得出。高斯滤波器可以消除高斯噪声和一些其他类型的噪声。

以下是使用 Python 和 OpenCV 库去除图像中高斯噪声的示例代码:

import cv2
import numpy as np

# 读取带噪声的图像
img = cv2.imread('noisy_image.jpg')

# 去除高斯噪声
denoised_img = cv2.GaussianBlur(img, (5, 5), 0)

# 显示去噪后的图像
cv2.imshow('denoised image', denoised_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,我们首先使用 cv2.imread() 函数读取一个名为 noisy_image.jpg 的带有高斯噪声的图像。然后,我们使用 OpenCV 库中的 cv2.GaussianBlur() 函数应用高斯模糊来去除图像中的噪声。其中 (5, 5) 是高斯核的大小,可以根据图像的噪声强度和大小进行调整。最后,我们使用 cv2.imshow() 函数显示去噪后的图像。

请注意,高斯模糊也会使图像变得模糊,因此需要小心选择模糊核的大小。如果模糊核的大小太大,可能会导致图像失去细节和清晰度。

双边滤波

双边滤波是一种非线性滤波方法,可以在保留图像边缘信息的同时消除噪声。它的原理是根据像素之间的空间距离和像素值之间的差异来计算像素之间的相似度,然后将每个像素值替换为其周围像素的加权平均值。

import cv2

# 读取图像
img = cv2.imread('input.jpg')

# 双边滤波
dst = cv2.bilateralFilter(img, 7, 50, 50)

# 保存处理后的图像
cv2.imwrite('output.jpg', dst)

基于深度学习的图像去噪

基于深度学习的图像去噪方法利用卷积神经网络(Convolutional Neural Networks,CNN)来进行图像去噪。它将图像去噪问题看作是一个回归问题,在训练阶段使用带有噪声的图像作为输入,纯净的图像作为输出进行训练。在测试阶段,CNN可以根据噪声图像进行推理,从而输出一张去噪后的图像。相较于传统的滤波方法,基于深度学习的图像去噪能够在去除噪声的同时更好地保留图像的细节。

总结

图像去噪是一个广泛的领域,涉及许多技术和方法。在实际应用中,我们可以根据不同的噪声类型和去噪需求,选择不同的去噪方法,以便得到更好的去噪效果。在未来,随着技术的不断发展,图像去噪的方法和算法会不断改进和更新。

图片来源

网站:wallhaven

猜你喜欢

转载自blog.csdn.net/qq_36693723/article/details/130463530