OpenCV官方教程中文版 —— 图像去噪
OpenCV官方教程中文版 —— 图像去噪
- 前言
- 一、原理
- 二、OpenCV 中的图像去噪
- 1.cv2.fastNlMeansDenoisingColored()
- 2.cv2.fastNlMeansDenoisingMulti()
前言
目标
• 学习使用非局部平均值去噪算法去除图像中的噪音
• 学习函数 cv2.fastNlMeansDenoising(),cv2.fastNlMeansDenoisingColored()等
一、原理
在前面的章节中我们已经学习了很多图像平滑技术,比如高斯平滑,中值平滑等,当噪声比较小时这些技术的效果都是很好的。在这些技术中我们选取像素周围一个小的邻域然后用高斯平均值或者中值平均值取代中心像素。简单来说,像素级别的噪声去除是限制在局部邻域的。
噪声有一个性质。我们认为噪声是平均值为一的随机变量。考虑一个带噪声的像素点,p = p0 + n,其中 p0 为像素的真实值,n 为这个像素的噪声。我们可以从不同图片中选取大量的相同像素(N)然后计算平均值。理想情况下我们会得到 p = p0。因为噪声的平均值为 0。
通过简单的设置我们就可以去除这些噪声。将一个静态摄像头固定在一个位置连续拍摄几秒钟。这样我们就会得到足够多的图像帧,或者同一场景的大量图像。写一段代码求解这些帧的平均值(这对你来说应该是小菜一碟)。将最终结果与第一帧图像对比一下。你会发现噪声减小了。不幸的是这种简单的方法对于摄像头和运动场景并不总是适用。大多数情况下我们只有一张导游带有噪音的图像。
想法很简单,我们需要一组相似的图片,通过取平均值的方法可以去除噪音。考虑图像中一个小的窗口(5x5),有很大可能图像中的其他区域也存在一个相似的窗口。有时这个相似窗口就在邻域周围。如果我们找到这些相似的窗口并取他们的平均值会怎样呢?对于特定的窗口这样做挺好的。如下图所示。

上图中的蓝色窗口看起来是相似的。绿色窗口看起来也是相似的。所以我们可以选取包含目标像素的一个小窗口,然后在图像中搜索相似的窗口,最后求取所有窗口的平均值,并用这个值取代目标像素的值。这种方法就是非局部平均值去噪。与我们以前学习的平滑技术相比这种算法要消耗更多的时间,但是结果很好。
对于彩色图像,要先转换到 CIELAB 颜色空间,然后对 L 和 AB 成分分别去噪。
二、OpenCV 中的图像去噪
OpenCV 提供了这种技术的四个变本。
- cv2.fastNlMeansDenoising() 使用对象为灰度图。
- cv2.fastNlMeansDenoisingColored() 使用对象为彩色图。
- cv2.fastNlMeansDenoisingMulti() 适用于短时间的图像序列(灰度图像)
- cv2.fastNlMeansDenoisingColoredMulti() 适用于短时间的图像序列(彩色图像)
共同参数有:
• h : 决定过滤器强度。h 值高可以很好的去除噪声,但也会把图像的细节抹去。(取 10 的效果不错)
• hForColorComponents : 与 h 相同,但使用与彩色图像。(与 h 相同)
• templateWindowSize : 奇数。(推荐值为 7)
• searchWindowSize : 奇数。(推荐值为 21)
1.cv2.fastNlMeansDenoisingColored()
和上面提到的一样,它可以被用来去除彩色图像的噪声。(假设是高斯噪声)。下面是示例。
# -*- coding: utf-8 -*-
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('die.png')
b,g,r = cv2.split(img)
img = cv2.merge([r,g,b])
dst = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
plt.subplot(121), plt.xticks([]), plt.yticks([]), plt.imshow(img)
plt.subplot(122), plt.xticks([]), plt.yticks([]), plt.imshow(dst)
plt.show()
下面是结果的放大图,我们的输入图像中含有方差为 25 的噪声,下面是结果。

2.cv2.fastNlMeansDenoisingMulti()
现在我们要对一段视频使用这个方法。第一个参数是一个噪声帧的列表。第二个参数 imgtoDenoiseIndex 设定那些帧需要去噪,我们可以传入一个帧的索引。第三个参数 temporaWindowSize 可以设置用于去噪的相邻帧的数目,它应该是一个奇数。在这种情况下 temporaWindowSize 帧的图像会被用于去噪,中间的帧就是要去噪的帧。例如,我们传入 5 帧图像,imgToDenoiseIndex = 2 和 temporalWindowSize = 3。那么第一帧,第二帧,第三帧图像将被用于第二帧图像的去噪。让我们来看一个例子。
# -*- coding: utf-8 -*-
import numpy as np
import cv2
from matplotlib import pyplot as plt
cap = cv2.VideoCapture('vtest.avi')
# create a list of first 5 frames
img = [cap.read()[1] for i in xrange(5)]
# convert all to grayscale
gray = [cv2.cvtColor(i, cv2.COLOR_BGR2GRAY) for i in img]
# convert all to float64
gray = [np.float64(i) for i in gray]
# create a noise of variance 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
noisy = [np.uint8(np.clip(i,0,255)) for i in noisy]
# Denoise 3rd frame considering all the 5 frames
dst = cv2.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()
下图是我得到结果的放大版本。

计算消耗了相当可观的时间。第一张图是原始图像,第二个是带噪音个图像,第三个是去噪音之后的图像。
相关文章:
OpenCV官方教程中文版 —— 图像去噪
OpenCV官方教程中文版 —— 图像去噪 前言一、原理二、OpenCV 中的图像去噪1.cv2.fastNlMeansDenoisingColored()2.cv2.fastNlMeansDenoisingMulti() 前言 目标 • 学习使用非局部平均值去噪算法去除图像中的噪音 • 学习函数 cv2.fastNlMeansDenoising(),cv2.fa…...
AcWing 102. 最佳牛围栏(前缀和+二分+DP)
AcWing 102. 最佳牛围栏 1、问题 2、分析 (1)暴力做法 看到这道题以后,我们可以先想一个最暴力的做法,就是我们去枚举所有长度至少为 F F F的区间,然后求出这个区间的和,再求出这个区间的平均值。最后在…...
React-表单受控绑定和获取Dom元素
一、表单受控组件 1.声明一个react状态 说明:useState const [value,setValue]useState("") 2.核心绑定流程 2.1绑定react状态 <div><input value{value}type"text"></input> 2.2绑定onChange事件 说明:e.…...
python hashlib模块及实例
hashlib 模块密码加密密码撞库密码加盐 一,hashlib模块 hashlib模块是用来为字符串进行加密的模块,通过该作用就可以为用户的密码进行加密。 通过模块中的hash算法可以为任意长度的字符串加密成长度相同的一串hash值。该hash算法得到的hash值有一下几个…...
垃圾回收GC
为什么要有垃圾回收? JVM之所以要有垃圾回收,是因为它能够自动管理内存,避免内存泄漏和内存溢出的问题,垃圾回收机制会自动检测和清理不再使用的对象,释放内存空间,使得开发者不需要手动管理内存,降低了开发难度和错误风险,同时,垃圾回收还可以优化内存分配,提高程序性能和响…...
kubernetes-service微服务
目录 一、service微服务 二、Ipvs模式 三、ClusterIP 1.ClusterIP 2.headless 四、NodePort 1.NodePort 2.默认端口 五、LoadBalancer 1.LoadBalancer 2.metallb 六、ExternalName 一、service微服务 Kubernetes Service微服务是一种基于Kubernetes的微服务架构&…...
让你笑到不行的笑话短视频接口,快来试试!
11在当今这个快节奏的社会中,笑话成为了许多人调节情绪的有效方法。如今,短视频平台已经成为了最受欢迎的娱乐方式之一,因此,将笑话和短视频结合起来,成为了一种很有趣的方式来带给我们欢乐。今天我们要介绍的是挖数据…...
系列四十五、Spring的事务传播行为案例演示(五)#MANDATORY
一、演示Spring的传播行为(MANDATORY) 1.1、StockServiceImplMANDATORY /*** Author : 一叶浮萍归大海* Date: 2023/10/30 15:43* Description: 演示MANDAORY的传播行为* 外部不存在事务:抛出异常 No existing transaction found for…...
idea插件(二)-- String Manipulation(字符串处理工具)
目录 1. 安装 String Manipulation 2. 默认快捷键 3. 操作说明 3.1 变量名的形式处理 3.2 文本形式的转化...
HQChart实战教程67-worker批量计算股票指标
HQChart实战教程67-worker批量计算股票指标 什么是Worker批量指标计算示例地址步骤1. 创建一个后台工作线程类2. 发送指标计算任务3. 接收计算结果数据对接 完整源码demo_workerthread_sina.htmlhqchart_worker_sina.js HQChart插件源码地址 什么是Worker Worker 接口是 Web W…...
博客系统自动化测试项目实践
文章目录 一.测试需求分析1.功能分析2.非功能分析 二.制定测试方案(计划 策略)三.编写测试用例四.执行自动化测试用例五.编写测试报告六.项目总结 一.测试需求分析 1.功能分析 通过功能测试需求分析 2.非功能分析 非功能分析主要从:界面,性能,安全性,…...
软考高级之系统架构师系列之操作系统基础
概念 接口 操作系统为用户提供两类接口:操作一级的接口和程序控制一级的接口。操作一级的接口包括操作控制命令、菜单命令等;程序控制一级的接口包括系统调用。 UMA和NUMA UMA,统一内存访问,Uniform Memory Access,…...
制作一个可以arm架构下运行的docker镜像(for Python)
看完本篇文章,你将得到一个可以arm架构下运行的python 基础镜像。 题外话 这里直接说docker镜像有点儿草率,因为目前很多容器都是Podman了。 podman的介绍 arm和aarch傻傻分不清楚 现在这两个是一样的意思了。 arm64和aarch64之间的区别 开始制作镜…...
Goland连接服务器/虚拟机远程编译开发
创建SSH连接 SSH用于与远程服务器建立连接 Settings -> Tools -> SSH Configurations 添加新的ssh连接,Host为ip地址,Username为用户名,认证方式这里选择密码验证 全部填完后可以点击Test Connection测试连接是否成功 创建Deployment…...
大数据Doris(十四):Doris表中的数据基本概念
文章目录 Doris表中的数据基本概念 一、Row & Column...
【Linux】Linux环境配置以及部署项目后端
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Linux的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Linux环境配置 1.JDK ①上传安装包到…...
RabbitMQ消费者的可靠性
目录 一、消费者确认 二、失败重试机制 2.1、失败处理策略 三、业务幂等性 3.1、唯一消息ID 3.2、业务判断 3.3、兜底方案 一、消费者确认 RabbitMQ提供了消费者确认机制(Consumer Acknowledgement)。即:当消费者处理消息结束后&#x…...
云计算助力史上首届“云上亚运”圆满成功!
201金,魔幻的BGM,以及崛起的中国科技,让杭州亚运会成功出圈。 很多网友表示太震撼了!开幕式很漂亮,杭州为了奥运造新城真豪横,看完一整个文化自信住! 赛场内外除了无数个令人感动的瞬间&#…...
博彦科技:以金融为起点,凭借创新技术平台真打实干
【科技明说 | 重磅专题】 成立于1995年的博彦科技,已有28年左右的发展历程。 我没有想到,博彦科技也对AIGC领域情有独钟。博彦科技自研的数字人产品SaaS平台,可以接入包括百度文心一言、阿里通义千问等AI大模型产品。可见&#…...
NLP实践——中文指代消解方案
NLP实践——中文指代消解方案 1. 参考项目2. 数据2.1 生成conll格式2.2 生成jsonline格式 3. 训练3.1 实例化模型3.2 读取数据3.3 评估方法3.4 训练方法 4. 推理5. 总结 1. 参考项目 关于指代消解任务,有很多开源的项目和工具可以借鉴,比如spacy的基础模…...
位置编码详解
位置编码(Positional Encoding, PE) 是自然语言处理(NLP)中,特别是 Transformer 模型架构里的一个核心概念。它的作用是给序列中的每个词(Token)注入“顺序”或“位置”信息。一、WHY࿱…...
每日安全情报报告 · 2026-04-08
每日安全情报报告 2026-04-08 报告时间:2026年04月08日 12:49 覆盖周期:近48小时(2026-04-06 ~ 2026-04-08) 今日特别关注:微软 Patch Tuesday 日(Kerberos RC4 强制弃用生效) FortiClient EMS…...
5步掌握抖音无水印下载终极指南:从零到批量处理高效方案
5步掌握抖音无水印下载终极指南:从零到批量处理高效方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback sup…...
别再手动敲代码了!我用GitHub Copilot+Python Django,10分钟搞定电商用户注册模块
用GitHub Copilot和Django十分钟搭建电商用户注册系统 最近在重构一个老旧的电商项目时,我面临着一个看似简单却极其耗时的任务:重写用户注册模块。按照传统方式,我需要手动创建Django表单、编写验证逻辑、设计数据库模型,整个过程…...
Linux服务器上Jupyter Notebook的完整配置指南:从安装到开机自启动
Linux服务器Jupyter Notebook企业级部署全攻略:安全、稳定与自动化实践 在数据科学与机器学习领域,Jupyter Notebook已成为不可或缺的交互式开发环境。对于企业级应用而言,如何在Linux服务器上搭建一个安全稳定、支持多用户协作且能长期运行…...
FireRedASR Pro实战案例:如何将1小时会议录音快速整理成文字稿
FireRedASR Pro实战案例:如何将1小时会议录音快速整理成文字稿 1. 场景痛点与解决方案 1.1 会议记录的传统困境 想象一下这样的场景:公司每周的部门例会刚刚结束,作为会议记录负责人的你,面对长达1小时的录音文件发愁。传统的人…...
nli-distilroberta-base数据库智能查询:自然语言问题与SQL语句的蕴含关系判断
NLI-DistilRoBERTa-base数据库智能查询:自然语言问题与SQL语句的蕴含关系判断 1. 场景痛点:数据库查询中的语义鸿沟 想象一下这样的场景:一位市场部门的同事想查询"上个月销售额超过10万元且复购率高于30%的客户名单"。他打开数据…...
ModbusRTU上位机系统功能说明文档
C# ModbusRtu或者TCP协议上位机源码,包括存储,数据到SQL SERVER数据库,趋势曲线图,数据报表,实时和历史报警界面,有详细注释,需要哪个协议版本一、系统概述 ModbusRTU上位机系统是基于C#语言开发…...
告别复杂对抗训练:用Python+PyTorch实现傅里叶域自适应(FDA),5分钟搞定语义分割的域迁移
5行代码实现傅里叶域自适应:用PythonPyTorch零成本完成语义分割域迁移 当你在GTA5游戏画面训练的模型遇到真实街景时,准确率突然暴跌30%——这是计算机视觉工程师最熟悉的噩梦。传统域自适应方法往往需要复杂的对抗训练和精细调参,而2020年CV…...
IPXWrapper:让经典游戏在Windows 11重获联机能力的技术解析
IPXWrapper:让经典游戏在Windows 11重获联机能力的技术解析 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 在现代Windows 11系统中,许多经典游戏因缺乏IPX协议支持而无法实现局域网联机,IPXW…...
