【OpenCV-Python】教程:8-1 图像去噪 Image Denoising

news2024/12/23 20:36:02

OpenCV Python 图像去噪 Image Denoising

【目标】

  • 非局部均值去噪算法去除图像中的噪声。
  • cv2.fastNlMeansDenoising() , cv2.fastNlMeansDenoisingColored() etc.

【理论】

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

噪声有一个特性。噪声通常被认为是一个均值为零的随机变量。考虑一个有噪声的像素, 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分量。

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

【代码】

在这里插入图片描述

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

img = cv2.imread("assets/die.png")

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

cv2.imshow("src image", img)
cv2.imshow("denoised image", dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

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

cap = cv2.VideoCapture("assets/vtest.avi")

# 连续读入帧
img = [cap.read()[1] for i in range(5)]

# 转换灰度
gray = [cv2.cvtColor(i, cv2.COLOR_BGR2GRAY) for i in img]
gray = [np.float64(i) for i in gray]
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]

gray_back = [np.uint8(np.clip(i, 0, 255)) for i in gray]

# 参考连续5帧为第3帧降噪
dst = cv2.fastNlMeansDenoisingMulti(noisy, 2, 5, None, 4, 7, 35)

cv2.imshow("gray", gray_back[2])
cv2.imshow("noisy", noisy[2])
cv2.imshow("dst", dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

【接口】

  • fastNlMeansDenoisingColored
cv2.fastNlMeansDenoisingColored(	src[, dst[, h[, hColor[, templateWindowSize[, searchWindowSize]]]]]	) ->	dst

修改彩色图像的fastnlmeans降噪函数。

  • src: 8位3通道图像
  • dst: 输出结果图像
  • templateWindowSize: 模板 patch 大小,奇数,推荐为7
  • searchWindowSize: 窗口大小(以像素为单位),用于计算给定像素的加权平均。奇数。更大的searchWindowsSize -更长的去噪时间。推荐值21像素
  • h: 亮度组件滤光强度调节参数。较大的h值可以完美地去除噪声,但也可以去除图像细节,较小的h值保留了细节,但也保留了一些噪声
  • hColor: 和h一样,只是颜色分量不同。对于大多数图像,值等于10将足以消除彩色噪声,不扭曲颜色

该函数将图像转换为CIELAB颜色空间,然后使用fastnlmeans降噪函数对给定h参数的L和AB分量分别进行降噪。

  • fastNlMeansDenoisingMulti
cv2.fastNlMeansDenoisingMulti(	srcImgs, imgToDenoiseIndex, temporalWindowSize[, dst[, h[, templateWindowSize[, searchWindowSize]]]]	) ->	dst
cv2.fastNlMeansDenoisingMulti(	srcImgs, imgToDenoiseIndex, temporalWindowSize, h[, dst[, templateWindowSize[, searchWindowSize[, normType]]]]	) ->	dst

利用多帧图像进行降噪

  • srcImgs: 8位,单通道,二通道,三通道,四通道图像序列
  • imgToDenoiseIndex: 需要降噪图像的序号
  • temporalWindowSize: 目标图像周围图像个数
  • dst: 输出与srcImgs图像大小和类型相同的图像。
  • templatewindowsize: 用于计算权重的模板补丁的像素大小。应该是奇数。推荐值7像素
  • searchWindowSize: 窗口大小(以像素为单位),用于计算给定像素的加权平均。应该是奇数。线性影响性能:更大的searchWindowsSize -更长的去噪时间。推荐值21像素
  • h: 参数调节过滤强度。较大的h值可以完美地去除噪声,但也可以去除图像细节,较小的h值保留了细节,但也保留了一些噪声

【参考】

  1. OpenCV: Image Denoising
  2. http://www.ipol.im/pub/art/2011/bcm_nlm/ (It has the details, online demo etc. Highly recommended to visit. Our test image is generated from this link)
  3. Online course at coursera (First image taken from here)
  4. Denoising

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1、MYSQL基础(DDL DML DCL)

(1)关于字段修改 change和modify的异同: 同:可以修改表的定义 异:change需要写两次列名,不方便,但是change可以修改表名,modify不可 (2)多表更新&#xff…

店铺如何快速实现数字化管理?不妨参考一下管理系统

百数店铺管理系统主要是以门店管理为核心,该应用管理涵盖商品、订单、库存、客户、采购、财务、营销等功能体系,维度数据分析,智能指导门店经营,账目清晰一目了然,店铺经营更高效。 1、销售看板 该分析报表里通过销售…

手把手教你玩转 Excel 数据透视表

1. 什么是数据透视表 数据透视表是一种可以快速汇总、分析大量数据表格的交互式分析工具。使用数据透视表可以按照数据表格的不同字段从多个角度进行透视,并建立交叉表格,用以查看数据表格不同层面的汇总信息、分析结果以及摘要数据。 使用数据透视表…

【Vue + Koa 前后端分离项目实战6】使用开源框架==>快速搭建后台管理系统 -- part6 前端实现期刊列表管理【增删查改】

要把努力当成一种习惯,而不是一时热血。 对应后端部分章节回顾: 【Vue Koa 前后端分离项目实战4】使用开源框架>快速搭建后台管理系统 -- part4 后端实现【增删改查】功能_小白Rachel的博客-CSDN博客 目录 一、前端项目准备 1.运行项目 …

支持百问网T113 D1-H D1s V853 V851s 等开发板 使用 Tina Linux NOR Flash文件系统 开发指南

此文章内容适用于 百问网T113 D1-H D1s V853 V851s 等开发板,开发板详情请访问 www.100ask.net 。 1 简介 编写目的 此文档描述Sunxi NOR 模块的使用方法,为相关人员调试提供指导 适用范围 boot0: 适用于brandy-2.0u-boot: 适用于u-boot-2018kernel: …

记录内值排序

记录内值排序 【问题】 could anyone please suggest a way to accomplish this. i have a table which consists of six columns : Table name : orders num1 number, num2 number , num3 number , num4 number , num5 number , num6 number there is a routine which fi…

修改后的代码只进行了git add操作不小心给他恢复了怎么找回来

一份干净的代码在main.js里加了一行console.log(666),并且只进行了git add 然后不小心给他reset了! git reset --hard哦豁,没了? 别急一样可以恢复,我们先执行 git fsck --lost-found然后我们去项目的.git下找到这个…

初级软件测试面试会问什么 除了常见问题,技术题也是重点

众所周知,面试是我们进入一个公司的门槛,面试者只有通过了面试才能进入公司,因此,很多新手测试人就想要知道,自己去面试初级软件测试的岗位,HR们都会问些什么样的问题?自己可以从哪些方面做准备…

多线程顺序运行的 4 种方法

1、在子线程中通过join()方法指定顺序 通过join()方法使当前线程“阻塞”,等待指定线程执行完毕后继续执行。 举例:在线程thread2中,加上一句thread1.join(),其意义在于,当前线程2运行到此行代码时会进入阻塞状态&…

FineReport填报报表常用属性方法

1、去除填报页面选中单元格时的黑色边框 // 加载结束事件 _g().curLGP.hideSelectFrame(); 2、 获取单元格焦点 预览填报报表时,希望页面加载完成后,自动将光标定位在某个控件中,可以直接编辑。 // 获取A2单元格 var cell _g().curLGP.getT…

风控模型算法

目录1 蚂蚁金服2 陆金所3 京东金融4 苏宁金融5 百度金融6 腾讯理财通7 宜信8 钱大掌柜9 万达金融10 网易理财11 美团金融主要是整理目前市面上的风控模型以及风控算法。1 蚂蚁金服 (1)对接第三方征信公司芝麻信用分,通过用户信用历史、行为偏…

echarts的xAxis和yAxis——x轴y轴以及网格线的详细配置

先看一下xAxis和yAxis配置的图表效果 下图详细的标注了图表中x轴y轴可见的内容 说明一下: x轴y轴在echarts配置项里,从内容上来说大体上没有太大区别,x轴能用的配置项y轴基本也可以用。 通过配置xAxis和yAxis可实现内容 坐标轴箭头的样式&…

Python量化交易01——构建基础策略

参考书目:深入浅出Python量化交易实战 量化交易是很早就想开的栏目了,之前没时间。现在正好放寒假,然后也找到了一本合适的书可以进行学习。 本次第一章就介绍一下简单的量化流程和一个简单的策略。 量化交易顾名思义就是用代码去验证交易策略是否赚钱…

【正点原子I.MX6U-MINI移植篇】Ubuntu-base根文件系统移植构建过程详解(四)

摘要:能不能在ARM板上运行Ubuntu呢?答案肯定是可以的,Ubuntu是Linux系统的一种,可以简单的将Ubuntu理解为一个根文件系统,和我们用busybox、buildroot制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移…

边缘计算概述

引用李开复在《ai 未来》书中说的,未来ai将会是中美双雄争霸的天下,美国虽然拥有创新的ai技术,重于开发,但现在ai已经到了可以实现落地到社会各个方面了,既然要落地就需要大量的测试和数据,只有中国的市场&…

我要是在学习 C 语言之前知道这些就好了

学习 C 语言好难啊。这门语言本身的基础知识并不是很难,但是“用 C 语言编程”需要用到各种知识,这些知识可没有那么容易掌握: C 语言在各个平台和操作系统上的行为有所差异,因此你需要了解平台; C 语言有许多编译器选…

SpringCloud+SpringCloud Alibaba(尚硅谷2020版)

文章目录1.传统单体架构和微服务架构的对比1.1传统单体架构1.1.1传统单体架构概述1.1.2单体架构的特点1.1.3单体架构的优点1.1.4单体架构的缺点1.2微服务架构1.2.1微服务架构概述1.2.2微服务架构的特点1.2.3微服务架构的优点1.2.4微服务架构的缺点2.SpringCloud简介3.SpringClo…

Service入门

Service入门 1.什么是Service 1.1手机中的Service案例 1.2为什么会有service? 由于手机的原因一个时刻只允许一个激活状态的Activity,其余的处于未激活 后台服务机制应运而生 1.3Service简介 四大组件之一没有UI界面,后台服务,长时…

Word处理控件Aspose.Words功能演示:在 Python 中将 Markdown 转换为 PDF

Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外, Aspose API支持流行文件格式处…

人物百度百科创建:建立人物百度百科都需要什么资料?

人物百度百科词条就像一张网络名片,词条上面的内容是非常具有权威性和公信力的。创建一个百度百科词条,可以帮助你很好地打造个人ip,尤其是在当今互联网时代,ip的打造对于个人的重要性是不言而喻的。 如果你想要提升自己的知名度…