OpenCV Python 图像去噪实现:fastNlMeansDenoising 详解

木白
木白
发布时间:2026-10-11| 3人浏览过
原创

本文介绍 OpenCV Python 中基于非局部均值(Non-Local Means)的图像去噪方法。重点解析 cv2.fastNlMeansDenoisingColored 处理单张彩色图像,以及 fastNlMeansDenoisingMulti 处理视频序列的原理。详细解读 h、templateWindowSize 和 searchWindowSize 等关键参数的作用与推荐值,并提供完整的去噪代码示例。

OpenCV 图像去噪技术概述

在图像处理中,平滑技术(如高斯模糊和中值模糊)常用于移除少量噪声。这些方法基于像素的局部邻居进行替换操作,假设噪声是均值为零的随机变量,通过计算大量同一像素的平均值来去除噪声。然而,这类传统方法对摄像机和场景的运动并不健壮。

OpenCV 提供了四种基于非局部均值(Non-Local Means)的去噪技术变体,能够更有效地处理复杂噪声:

  • cv2.fastNlMeansDenoising:用于单个灰度图像。
  • cv2.fastNlMeansDenoisingColored:用于彩色图像。
  • cv2.fastNlMeansDenoisingMulti:用于灰度图像序列。
  • cv2.fastNlMeansDenoisingColoredMulti:用于彩色图像序列。

关键参数详解

在使用上述函数时,理解以下参数对于平衡去噪效果与细节保留至关重要:

  • h (滤波器强度):决定滤波器的强度。推荐值为 10。较高的 h 值能更好地消除噪声,但可能会删除图像细节;较低的 h 值则保留更多细节,但去噪效果较弱。
  • hForColorComponents:仅适用于彩色图像,用于控制颜色分量的去噪强度。
  • templateWindowSize:模板窗口大小,应为奇数,推荐值为 7。
  • searchWindowSize:搜索窗口大小,应为奇数,推荐值为 21。

单张彩色图像去噪实现

对于单张彩色图像,可以使用 cv2.fastNlMeansDenoisingColored 去除高斯噪声。以下代码展示了如何读取图像、应用去噪算法并显示结果。

import numpy as np
import cv2
import matplotlib.pyplot as plt

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

# 应用彩色图像去噪算法
# 参数说明:img, None, h=10, hForColor=10, templateWin=7, searchWin=21
dst = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)

# 显示原始图像与去噪后图像
plt.subplot(121), plt.imshow(img)
plt.subplot(122), plt.imshow(dst)
plt.show()

视频序列去噪实现

对于视频序列,可以使用 cv2.fastNlMeansDenoisingMulti。该函数的第一个参数是嘈杂帧的列表,第二个参数 imgToDenoiseIndex 指定需要去噪的帧索引,第三个参数 temporalWindowSize 指定附近帧的数量。去噪过程使用总共 temporalWindowSize 帧,其中中心帧为目标帧。

以下示例展示了如何从视频中提取前 5 帧,添加高斯噪声,并对第 3 帧进行去噪处理:

import numpy as np
import cv2
import matplotlib.pyplot as plt

# 打开视频文件
cap = cv2.VideoCapture('test.mp4')

# 创建前 5 帧的列表
img = [cap.read()[1] for i in range(5)]

# 将所有帧转换为灰度图
gray = [cv2.cvtColor(i, cv2.COLOR_BGR2GRAY) for i in img]

# 将所有帧转换为 float64 类型
gray = [np.float64(i) for i in gray]

# 创建方差为 25 的噪声
noise = np.random.randn(*gray[1].shape) * 10

# 将噪声添加到图像中
noisy = [i + noise for i in gray]

# 转换回 uint8 类型
noisy = [np.uint8(np.clip(i, 0, 255)) for i in noisy]

# 对第 3 帧进行去噪,考虑所有 5 帧
# 参数说明:noisy, imgToDenoiseIndex=2, temporalWindowSize=5, None, h=4, templateWin=7, searchWin=35
dst = cv2.fastNlMeansDenoisingMulti(noisy, 2, 5, None, 4, 7, 35)

# 显示原始灰度、加噪后及去噪后的第 3 帧
plt.subplot(131), plt.imshow(gray[2], 'gray')
plt.subplot(132), plt.imshow(noisy[2], 'gray')
plt.subplot(133), plt.imshow(dst, 'gray')
plt.show()

总结

OpenCV 提供的非局部均值去噪算法在处理图像和视频噪声方面表现出色。通过合理调整 h、templateWindowSize 和 searchWindowSize 等参数,可以在去噪效果和细节保留之间找到最佳平衡。无论是单张彩色图像还是视频序列,OpenCV 都提供了相应的函数来满足不同的去噪需求。

以上就是 OpenCV Python 图像去噪实现的详细内容,更多关于 OpenCV 图像处理、Python 计算机视觉的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。