前言
上篇文章:图像数据噪音种类以及Python生成对应噪音,汇总了常见的图片噪音以及噪音生成方法,主要用在数据增强上面,作为数据集填充的方式,可以避免模型过拟合。想要了解图像数据增强算法的可以去看本人所撰这篇文章:图像数据增强算法汇总(Python)。
本篇文章将介绍常用到的图像去噪滤波算法,采用实例代码和处理效果一并展现的方式进行介绍,能够更直观的看到每种算法的效果。本篇文章偏实战,所以不会涉及到过多每种算法的原理理论计算公式,以一篇文章快速了解并实现这些算法,以效率最高的方式熟练这些知识。
博主专注数据挖掘五年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使用各类数学模型、机器学习和深度学习以及代码,每一篇文章都包含实战项目以及可运行代码。博主紧跟各类数模比赛,每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码。希望有需求的小伙伴不要错过笔者精心打造的专栏。
一、图像噪音来源
随着图像获取技术的不断发展,我们在实际应用中常常会面临到各种形式的图像噪声,这些噪声会影响到图像的质量和特征的清晰度。为了有效地提升图像的质量,图像处理领域涌现出了多种去噪方法,它们以不同的原理和技术手段来应对各种噪声情况。在接下来的介绍中,我们将详细探讨一些常用的图像去噪方法,包括均值滤波、中值滤波、高斯滤波等,以及它们的适用场景和特点。让我们一起深入了解如何有效地应对图像噪声,提升图像处理的准确度和质量。 图像噪音可以由多种因素引起:
-
传感器噪音: 摄像机、扫描仪等图像采集设备本身会引入噪音,这是由于设备的电子元件和信号处理过程中的微小不确定性。
-
环境条件: 光线不足、强光、阴影等环境因素可能会导致图像中的噪音增加。
-
传输或存储中的干扰: 在图像传输或存储过程中,信号可能会受到电磁干扰、压缩算法等因素的影响,从而产生噪音。
-
设备老化或损坏: 图像采集设备的老化、损坏或不稳定可能会导致图像中出现各种噪音。
-
信号采样误差: 在信号采样过程中,由于采样率不足或量化误差等原因,会引入噪音。
-
电磁干扰: 来自电器设备、无线信号等电磁波的干扰可能会影响到图像质量。
-
传感器特性: 不同类型的传感器(例如CMOS、CCD)具有不同的特性,它们在信号处理过程中可能会引入特定类型的噪音。
二、图像去噪算法
1.均值滤波
均值滤波是一种常用的图像处理技术,它的原理是将图像中每个像素的值替换为周围像素值的平均数。这样可以平滑图像,减少噪声的影响。具体的实现步骤如下:
-
确定滤波器大小:均值滤波器的大小由一个参数决定,通常用一个正奇数来表示,如3x3、5x5等。这个值决定了滤波器在图像上的覆盖区域。
-
将滤波器放置在图像的每个像素上:以当前像素为中心,将滤波器覆盖在图像上。
-
计算周围像素的平均值:将滤波器覆盖区域内的所有像素值取平均,得到一个新的像素值。
-
将新的像素值赋给当前位置:用计算得到的新像素值替代原来的像素值。
均值滤波主要用于去除图像中的随机噪声,例如高斯噪声或盐椒噪声。它在保留图像整体结构的同时,可以有效地减轻噪声的影响。
使用均值滤波算法来去除图片的高斯噪音可以通过以下步骤实现:
1.应用均值滤波:
# 设置卷积核大小,通常选择奇数
kernel_size = 3
# 使用均值滤波进行去噪
denoised_image = cv2.blur(image, (kernel_size, kernel_size))
2.显示原始图片和去噪后的图片
cv2.imshow('Original Image', image)
cv2.imshow('Denoised Image', denoised_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
然而,均值滤波对于一些特定类型的噪声(如周期性噪声)可能效果不佳,因为这些噪声会在图像中形成特定的模式,而均值滤波只能模糊图像,无法针对特定模式的噪声进行处理。总的来说,均值滤波是一种简单而有效的去噪方法,适用于大多数情况下的随机噪声去除。但在特定情况下,可能需要考虑其他类型的滤波器或去噪技术。卷积核越大,参与到均值运算中的像素就会越多,即当前计算的算的是更多点的像素值的平均值,去噪效果越好,当然花费的计算时间也会越长,同时让图像失真越严重。因此在实际处理中,要在失真和去噪效果之间取得平衡,选取合适大小的卷积核。
2.中值滤波
中值滤波是一种常用于图像处理中的非线性滤波方法,其基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,从而达到去除噪音的目的。总共分两步:
-
将滤波器窗口置于图像的某一像素处。
-
将窗口中的像素值按大小排序,取其中间值作为该像素的新值。
能够处理的图像噪音类别:
中值滤波主要适用于以下几种图像噪音:
-
椒盐噪声:即图像中出现的黑白像素点。
-
横纹噪声:出现在图像中的横向条纹。
-
斑点噪声:散布在图像中的随机白点。
然而,中值滤波也有一些局限性,比如在保留图像细节的同时也会模糊图像,卷积核选择和均值滤波算法存在一样的问题,卷积核越大,参与到均值运算中的像素就会越多,即当前计算的算的是更多点的像素值的平均值,去噪效果越好,当然花费的计算时间也会越长,同时让图像失真越严重:
gray_image = cv2.cvtColor(noisy_image, cv2.COLOR_BGR2GRAY)
denoised_image = cv2.medianBlur(gray_image, 5) # 5表示核的大小,可以根据需要调整
cv2.imshow('Original Image', noisy_image)
cv2.imshow('Denoised Image', denoised_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.高斯滤波
高斯滤波是一种线性平滑滤波器,它采用高斯函数作为权值函数进行图像滤波。高斯滤波的基本思想是通过对图像中每个像素周围的像素进行加权平均,从而降低噪声的影响,同时保留图像的边缘信息。高斯滤波器会使用一个高斯函数来计算权重,距离中心点越近的像素拥有越大的权重,距离越远的像素拥有越小的权重。
高斯滤波主要用于去除图像中的高频噪声,使图像变得更加平滑,同时也可以用于图像模糊或降低图像的细节信息。高斯滤波对高斯噪声的去除效果非常显著,可以有效地使图像变得更加平滑:
# 设置高斯滤波的内核大小,通常选择一个奇数值
kernel_size = 5
blurred_image = cv2.GaussianBlur(noisy_image, (kernel_size, kernel_size), 0)
cv2.imshow('Original Image', noisy_image)
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.双边滤波
双边滤波(Bilateral Filtering)是一种用于图像去噪的非线性滤波器。与高斯滤波不同,双边滤波考虑了像素之间的空间距离和像素值之间的相似性。
原理和功能:
-
空间距离权重:除了像素值之间的相似性,双边滤波还考虑了像素之间的空间距离。这意味着附近的像素对于滤波的影响更大,而远离的像素对滤波的影响更小。
-
相似性权重:双边滤波器使用高斯函数来度量像素值之间的相似性。如果两个像素的值非常相似,它们的权重较大。如果它们的值差异很大,它们的权重较小。
-
保留边缘信息:相比于一般的平滑滤波器,双边滤波器可以保留图像的边缘信息。这是因为它会考虑到边缘处像素的相似性。
双边滤波器可以有效地处理各种类型的噪音,包括高斯噪音、椒盐噪音等。
# 应用双边滤波
filtered_image = cv2.bilateralFilter(image, d=9, sigmaColor=75, sigmaSpace=75)
在一些名画细节上面修复去噪更加能够体现出来:
修复前
修复后:
相比高斯滤波修复算法:
双边滤波器特别适用于那些需要保留图像细节和边缘的情况。
5.NL-Means(Non-Local Means)
NL-Means(Non-Local Means)是一种图像去噪算法,它通过利用图像中相似区域的信息来降低噪声水平,而不会损失图像的细节信息。NL-Means算法不仅可以处理高斯噪声,还可以有效地处理泊松噪声等其他类型的噪声。
NL-Means算法的基本思想是,对于图像中的每一个像素,通过计算该像素周围区域与其他像素区域的相似性来进行去噪。相似性计算可以基于像素强度的差异,也可以使用特征向量来进行。NL-Means算法的基本原理如下:
-
相似性比较: 对于图像中的每一个像素,NL-Means算法首先会在图像的局部区域内搜索与该像素相似的区域。相似性的度量可以基于像素强度的差异,也可以使用特征向量来进行。
-
权重计算: 对于每一个相似区域,算法会计算一个权重值,该权重值表示了该相似区域与目标像素的相似性。相似性越高,权重值越大。
-
加权平均: 使用计算得到的权重值,NL-Means算法对所有相似区域的像素值进行加权平均,得到目标像素的估计值。
-
重复处理: 以上步骤对图像中的每一个像素都进行处理,以达到整体去噪的效果。
通过这种方式,NL-Means算法能够保留图像的细节信息,并在降低噪声水平的同时,避免了模糊效果。
def denoise_nl_means(image, h=10, hForColor=10, templateWindowSize=7, searchWindowSize=21):
denoised_image = cv2.fastNlMeansDenoisingColored(image, None, h, hForColor, templateWindowSize, searchWindowSize)
return denoised_image
噪音图片:
NL-Means去噪后图片:
能够看出NL-Means算法保留图像的细节信息且图片没有那么模糊。
总结
综上所述,图像去噪是图像处理领域中的重要任务,其目的是消除或减弱图像中的噪音,以使图像更清晰、更易分析。不同的去噪算法适用于不同类型和强度的噪音,因此在实际应用中需要根据具体情况选择合适的方法。同时,对于特定的图像处理任务,也可能需要结合多种去噪技术以获得最佳效果。在实践中,通过理解各种去噪算法的原理和特性,可以更好地应用它们来解决实际问题,从而提升图像处理的质量和效率。