Python FastNlMeansDenoising

17 Mar 2025 | 6 分钟阅读

在本文中,我们将学习噪声、各种类型的噪声、图像去噪、使用 OpenCV 进行图像去噪、OpenCV 中的非局部均值算法以及 OpenCV 中的 fastNlMeansDenosiong 函数。

fastNIMeansDenoising 是 OpenCV 模块中的一种方法。它用于对图像进行去噪。在分析之前去除图像中不希望存在的噪声的过程称为去噪。它指的是一个重要的预处理阶段。

去噪是图像预处理最重要的阶段之一。它用于去除图像中的噪声,因此让我们首先了解什么是噪声。

图像中的噪声

图像中存在的缺陷称为噪声,它与底层场景内容无关。统计上的随机过程产生的测量变化通常被认为是噪声。在成像中,噪声表现为覆盖图像的颗粒状纹理的伪影。

在图像中,噪声可以呈现各种形状和表现形式,通常是降低视觉质量的、不受欢迎的或令人困扰的伪影。

图像有两种主要类型的噪声

1. 椒盐噪声: 它具有零星的暗色和亮色干扰。

其独特之处在于,噪声像素的值不会影响其他像素的颜色。图像中的像素在颜色或强度上与周围像素明显不同。在大多数情况下,这种类型的噪声只会对少量图像像素产生轻微影响。之所以称之为“椒盐噪声”,是因为图像中出现的白色和黑色点。

2. 高斯噪声: 通常会在图像中每个像素的原始值上添加或减去少量(通常是适度的)。直方图显示了噪声的正态分布,绘制了像素值失真的程度与其频率的关系。虽然其他分布也是可能的,但根据中心极限定理,多种噪声的总和趋向于高斯分布,因此高斯(正态)分布是一个普遍可靠的模型。

现在我们已经理解了图像中的噪声是什么。现在是时候理解什么是去噪了。

图像去噪

图像去噪是计算机视觉和图像处理中的基本问题之一。去噪通过减少图像中的噪声量来估计原始图像。图像噪声可能来自各种来源(例如环境或传感器),在实际应用中,通常无法避免。

鉴于此,图像去噪在图像恢复、视觉跟踪、图像配准和图像分割等各种应用中至关重要。尽管已经提出了各种用于图像去噪的算法,但图像噪声抑制问题仍然是一个挑战,尤其是在图像是在不利条件下拍摄且噪声程度很高的情况下。

现在我们已经了解了图像去噪是什么。现在我们将理解 OpenCV 中用于去噪图像的各种方法。

使用 OpenCV 进行图像去噪

OpenCV 模块包含多种非局部均值算法来去噪图像。在查看 OpenCV 中的各种方法之前,让我们先理解非局部均值算法的含义。

非局部均值算法

非局部均值算法的基本原理是,用与构成像素邻域的图像子窗口相似的多个图像子窗口的颜色平均值来替换像素的颜色。

现在我们知道了非局部均值算法的含义。现在让我们看看 OpenCV 模块中用于去噪图像的各种函数。

OpenCV 中提供了该算法的四个版本。

  1. fastNlMeansDenoising(): 此函数仅对单个灰度图像进行操作。
  2. fastNlMeansDenoisingColored(): 此函数可用于彩色图像。
  3. fastNlMeansDenoisingMulti(): 此函数可用于在短时间内拍摄的图像序列。它也可以对单个灰度图像进行操作。
  4. fastNlMeansDenoisingColoredMulti(): 此函数可用于在短时间内拍摄的图像序列。但它用于彩色图像。

Python 中的 fastNlMeansDenoising() 函数

它是一个基于非局部均值算法的函数。此函数用于对单个灰度图像进行去噪。

fastNlMeansDenoising() 函数的语法

fastNlMeansDenoising() 函数的参数

  1. src: 这是 fastNlMeansDenoising() 函数的必需参数。它接受输入 8 位 1 通道、2 通道、3 通道或 4 通道的图像。
  2. Dst: dst 是输出或结果图像。输出图像的大小与输入图像或 src 图像的大小相同。
  3. templateWindowSize: 计算权重时模板块的大小(以像素为单位)。此参数的值应为奇数。templateWindowSize 参数的推荐大小为 7。
  4. searchWindowSize: 窗口大小(以像素为单位)用于计算特定像素的加权平均值。该参数的值应为奇数。它线性影响函数的性能。如果搜索窗口尺寸很大,去噪图像所需的时间将更长。21 是该参数的推荐值。
  5. H: 较小的 h 值可以保留图像细节但会保留一些噪声,而较大的 h 值可以完美地去除噪声但也会去除图像细节。

注意:该函数将图像转换为 CIELAB 颜色空间,并使用 fastNlMeansDenoising 函数使用提供的 h 参数独立地去噪 L 和 AB 分量。

让我们通过一个例子来理解如何从图像中去除噪声。

去除图像中的椒盐噪声

通过向图像添加随机的亮像素和随机的暗像素来添加椒盐噪声。由于它在统计上减少了原始数据值,因此这种模型通常被称为数据丢弃噪声。来源:相机中发生故障的传感器单元。

FastNlMeansDenoising in Python

在上图中,我们看到了椒盐噪声。图像中有一些暗区中的亮像素。因此,让我们看看使用 OpenCV 模块通过 Python 代码来减少或去除椒盐噪声。

输出

FastNlMeansDenoising in Python

在上例中,我们首先导入了代码中所有必需的库。这是一个椒盐噪声图像。现在我们将使用 cv2.imread() 来读取图像。图像应为黑白 1 通道、2 通道、3 通道或 4 通道图像。现在我们将使用 cv2.fastMlMeansDenoising() 来去噪椒盐噪声。现在我们将使用 pyplot 来可视化图像。

去除图像中的高斯噪声

高斯噪声是数字图像中最常见的噪声类型。由于在低光照条件下拍摄图像时的传感器限制,导致可见光传感器难以充分记录场景细节,因此在高斯噪声在数字成像中出现。

FastNlMeansDenoising in Python

在上例中,我们看到了图像是嘈杂的。这张图像是高斯噪声的一个例子。让我们看看使用 OpenCV 模块通过 Python 代码来去除高斯噪声。

输出

FastNlMeansDenoising in Python

在上例中,我们首先导入了代码中所有必需的库。这是一个高斯噪声图像。现在我们将使用 cv2.imread() 来读取图像。图像应为黑白 1 通道、2 通道、3 通道或 4 通道图像。现在我们将使用 cv2.fastMlMeansDenoising() 来去噪椒盐噪声。现在我们将使用 pyplot 来可视化图像。

结论

在本文中,我们讨论了噪声及其各种类型。然后我们讨论了什么是图像去噪及其特性,以及使用 OpenCV 进行图像去噪、OpenCV 中的非局部均值算法和 OpenCV 中的 fastNlMeansDenosiong 函数。


下一个主题Python Email.utils