首页 > 其他分享 >opencv - py_photo - py_non_local_means 非局部均值去噪

opencv - py_photo - py_non_local_means 非局部均值去噪

时间:2024-10-23 12:21:42浏览次数:7  
标签:gray non plt means py 噪声 像素 图像 cv

文章目录

图像去噪

目标

在本章中,

  • 您将了解非局部均值去噪算法,以去除图像中的噪声。
  • 您将看到不同的函数,如 cv.fastNlMeansDenoising()
    cv.fastNlMeansDenoisingColored() 等。

理论

在前面的章节中,我们已经看到了许多图像平滑技术,如高斯模糊、中值模糊等,它们在一定程度上可以很好地去除少量噪声。在这些技术中,我们在一个像素周围取一个小的邻域,并进行一些操作,如高斯加权平均值、值的中值等,以替换中心元素。简而言之,像素的噪声去除是其邻域的局部去除。

噪声有一个特性。噪声通常被认为是一个具有零均值的随机变量。
考虑一个噪声像素, p = p 0 + n p = p_0 + n p=p0​+n,其中 p 0 p_0 p0​ 是像素的真实值, n n n 是该像素中的噪声。您可以从不同的图像中获取大量相同的像素(例如 N N N)并计算它们的平均值。理想情况下,您应该得到 p = p 0 p = p_0 p=p0​,因为噪声的平均值是零。

你可以通过一个简单的设置来自己验证。将静态相机放在某个位置几秒钟。这将为你提供大量帧或同一场景的大量图像。然后编写一段代码来查找视频中所有帧的平均值(这对你来说现在应该太简单了)。比较最终结果和第一帧。你可以看到噪音减少了。不幸的是,这种简单的方法对相机和场景运动不稳健。而且通常只有一张嘈杂的图像可用。所以这个想法很简单,我们需要一组相似的图像来平均噪音。考虑图像中的一个小窗口(比如 5x5 窗口)。相同的补丁可能在图像中的其他地方。有时在它周围的一个小街区。如何将这些相似的补丁一起使用并找到它们的平均值?对于那个特定的窗口,这很好。请参见下面的示例图像:
在这里插入图片描述

图像中的蓝色斑块看起来很相似。绿色斑块看起来很相似。因此,我们取一个像素,在其周围取一个小窗口,在图像中搜索类似的窗口,对所有窗口求平均值,然后用我们得到的结果替换像素。这种方法是非局部均值去噪。与我们之前看到的模糊技术相比,它需要更多时间,但效果非常好。更多详细信息和在线演示可以在其他资源中的第一个链接中找到。

对于彩色图像,将图像转换为 CIELAB 颜色空间,然后分别对 L 和 AB分量进行去噪。

OpenCV 中的图像去噪

OpenCV 提供了此技术的四种变体。

  1. cv.fastNlMeansDenoising() - 适用于单个灰度图像

  2. cv.fastNlMeansDenoisingColored() - 适用于彩色图像。

  3. cv.fastNlMeansDenoisingMulti() - 适用于短时间内捕获的图像序列
    (灰度图像)

  4. cv.fastNlMeansDenoisingColoredMulti() - 与上文相同,但适用于彩色图像。

常见参数为:

  • h:决定过滤器强度的参数。较高的 h 值可以更好地去除噪音,但也会去除
    图像的细节。(10 也可以)
  • hForColorComponents:与 h 相同,但仅适用于彩色图像。(通常与 h 相同)
  • templateWindowSize:应为奇数。(建议 7)
  • searchWindowSize:应为奇数。 (推荐 21)

请访问其他资源中的第一个链接,了解有关这些参数的更多详细信息。

我们将在这里演示 2 和 3。剩下的留给你。

1. cv.fastNlMeansDenoisingColored()

如上所述,它用于从彩色图像中去除噪声。(噪声预计为高斯噪声)。
请参阅以下示例:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('die.png')

dst = cv.fastNlMeansDenoisingColored(img,None,10,10,7,21)

plt.subplot(121),plt.imshow(img)
plt.subplot(122),plt.imshow(dst)
plt.show()

以下是结果的放大版本。我的输入图像具有 σ = 25 \sigma = 25 σ=25 的高斯噪声。请参阅结果:
在这里插入图片描述

2. cv.fastNlMeansDenoisingMulti()

现在我们将同样的方法应用于视频。第一个参数是噪声帧的列表。第二个参数 imgToDenoiseIndex 指定我们需要对哪个帧进行去噪,为此我们传递输入列表中帧的索引。第三个参数是 temporaryWindowSize,它指定用于去噪的附近帧的数量。它应该是奇数。在这种情况下,总共使用 temporaryWindowSize 个帧,其中中心帧是要去噪的帧。例如,您传递了一个包含 5 个帧的列表作为输入。让 imgToDenoiseIndex = 2 和 temporaryWindowSize = 3。然后使用帧 1、帧 2 和帧 3 来对帧 2 进行去噪。让我们看一个例子。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

cap = cv.VideoCapture('vtest.avi')

# create a list of first 5 frames 创建前 5 帧的列表
img = [cap.read()[1] for i in range(5)]

# convert all to grayscale 将所有转换为灰度
gray = [cv.cvtColor(i, cv.COLOR_BGR2GRAY) for i in img]

# convert all to float64 将所有转换为 float64
gray = [np.float64(i) for i in gray]

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

# Add this noise to images 将此噪声添加到图像
noisy = [i+noise for i in gray]

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

# Denoise 3rd frame considering all the 5 frames 考虑所有 5 个噪声对第 3 帧进行去噪帧
dst = cv.fastNlMeansDenoisingMulti(noisy, 2, 5, None, 4, 7, 35)

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()

下图显示了我们得到的结果的放大版本:

在这里插入图片描述

计算需要花费大量时间。结果中,第一幅图像是原始帧,第二幅是噪声帧,第三幅是去噪图像。

其他资源

  1. ipol(其中包含详细信息、在线演示等。强烈建议访问。我们的测试图像由此链接生成)

  2. Coursera 在线课程(第一幅图像取自此处)

IPOL 是一本图像处理和图像分析研究期刊,强调数学作为算法设计来源的作用以及研究的可重复性。每篇文章都包含有关算法及其源代码的文本,并配有在线演示工具和实验档案。文本和源代码经过同行评审,演示受到控制。IPOL 是一本开放科学和可重复研究期刊。(https://www.ipol.im/)

标签:gray,non,plt,means,py,噪声,像素,图像,cv
From: https://blog.csdn.net/yuxing55555/article/details/143179695

相关文章

  • Python酷库之旅-第三方库Pandas(162)
    目录一、用法精讲741、pandas.Period.month属性741-1、语法741-2、参数741-3、功能741-4、返回值741-5、说明741-6、用法741-6-1、数据准备741-6-2、代码示例741-6-3、结果输出742、pandas.Period.ordinal属性742-1、语法742-2、参数742-3、功能742-4、返回值......
  • DictProxy和dict的内存大小_python_如何最小的保存dict_20241023
    缘由:在写多进程的时候,进程之间要用到共享变量,Manager,于是发现了一种新的数据类型:multiprocessing.managers.DictProxy简单来说,这种数据类型特点是,只读模式,内存占用的更少,平均减少了四分之一,最高测试可以减少到1/20,配合pickle.dumps来使用,那么存到本地的文件原本可能是......
  • 原创计算机毕业设计—69271 django重大公告卫生事件物资管理系统 (源码免费领)定制程序
    摘要随着信息技术的快速发展,计算机应用已经进入成千上万的家庭。随着物资数量的增加,物资库存管理也存在许多问题。物资数据的处理量正在迅速增加,原来的手工管理模式不适合这种形式。使用计算机可以完成数据收集、处理和分析,减少人力和物力的浪费。需要建立重大公告卫生事件......
  • 原创计算机毕业设计—58671 基于SpringBoot的健康管理系统(源码免费领)小程序、APP、JAV
    摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,健康管理系统被用户普遍使用,为方便用户能够可以随时进行健康管理系统的数据信息管理,特开发了基于springboot的健康管理系......
  • 3.12版本的python调用MATLAB2024b,安装matlab.engine教程
    #3.12版本的python只能使用2024b的matlab的接口。一、各个版本的兼容关系如下,可通过下面链接去官网查询。VersionsofPythonCompatiblewithMATLABProductsbyRelease-MATLAB&Simulink二、安装matlab.engine!可能由于版本比较新的原因,查了很多资料,给出的方法都没......
  • Python 文件路径与文件系统操作
    处理文件的另一个重要方面是文件路径和文件系统操作。Python提供了多个模块用于操作文件系统,其中最常用的是os模块和pathlib模块。掌握这些工具,能够让你在自动化任务中更轻松地管理文件和目录。1文件路径的基本操作在操作文件时,路径是一个至关重要的概念。文件路......
  • Python 学习记录
    前言简单情况:主要记录学习Python的简单情况,包括代码与结果,以及关键注释工具与来源:一下代码与结果都可在JupyterLab上实现,更多情况可看Github使用NumPy可视化数学函数1.可视化f=x1*e(-x12-x22)importnumpyasnpimportmatplotlib.pyplotaspltx1_array=np.linspa......
  • 计算机毕业设计Python+大模型知识图谱中华古诗词可视化 古诗词智能问答系统 古诗词数
    温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!开发技术:前端:vue.jsechartsD3.js后端:Flask/Django机器学习/深度学习:LSTM情感分析模型、PyTorch、T......
  • 计算机毕业设计Python+Spark知识图谱课程推荐系统 课程用户画像系统 课程大数据 课程
    《Python+Spark知识图谱课程推荐系统》开题报告一、研究背景与意义随着互联网技术的快速发展,在线教育平台已成为人们获取知识、提升技能的重要途径。然而,面对海量的课程资源,用户往往难以快速找到符合自己兴趣和需求的课程。传统的课程推荐系统大多基于简单的规则或统计方法,难......
  • python中的字典排序--sorted()
    字典的排序:在学习python的时候,了解到相比于列表,字典是一个无序的数据结构,一般都不对其进行排序的。但是要想对字典进行排序,是可以通过sorted()函数进行操作的!关于字典的排序,下面从键key和值value进行代码的运行和分析:【先看代码和执行结果,后面会进行详细的解析】#先定义一......