opencv python 图像去噪的实现方法


Posted in Python onAugust 31, 2018

在早先的章节里,我们看到很多图像平滑技术如高斯模糊,Median模糊等,它们在移除数量小的噪音时在某种程度上比较好用。在这些技术里,我们取像素周围的一小部分邻居,做一些类似于高斯平均权重,中值等替换掉中间的元素。简单说,移除一个像素的噪音是基于本地邻居的。

噪音有一个属性,噪音一般被认为是具有零平均值的随机变量。假设一个像素噪音,p = p0 + n, 其中p0是像素的真实值,n是那个像素的噪音。你可以从不同图像取大量的同一个像素(N)并计算他们的平均值,理想情况下,你应该得到p=p0,因为均值是0.

你可以自己通过一个简单例子验证一下。保持一个静止的摄像机对准一个位置多呆几秒,这会给你很多帧,或者是对一个场景的很多图像。然后写一些代码来找到视频里所有帧的平均值。比较最终的结果和第一帧。你可以看到噪点被去掉了。不幸的是这个简单的方法对于摄像机和场景的运动来说就不健壮了。而且经常你也只有一个噪音图像可用。

Image Denoising

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

  • cv2.fastNlMeansDenoising() - 使用单个灰度图像
  • cv2.fastNlMeansDenoisingColored() - 使用彩色图像。
  • cv2.fastNlMeansDenoisingMulti() - 用于在短时间内捕获的图像序列(灰度图像)
  • cv2.fastNlMeansDenoisingColoredMulti() - 与上面相同,但用于彩色图像。

Common arguments:

  1. h:参数决定滤波器强度。较高的h值可以更好地消除噪声,但也会删除图像的细节 (10 is ok)
  2. hForColorComponents:与h相同,但仅适用于彩色图像。 (通常与h相同)
  3. templateWindowSize:应该是奇数。 (recommended 7)
  4. searchWindowSize:应该是奇数。 (recommended 21)

cv2.fastNlMeansDenoisingColored()

如上所述,它用于从彩色图像中去除噪声。 (噪音预计是高斯噪音)

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


img = cv2.imread('img.jpg')

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

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

opencv python 图像去噪的实现方法

cv2.fastNlMeansDenoisingMulti()

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

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


cap = cv2.VideoCapture('test.mp4')

# create a list of first 5 frames
img = [cap.read()[1] for i in range(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 python 图像去噪的实现方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python快速排序代码实例
Nov 21 Python
Python深入学习之内存管理
Aug 31 Python
详解Python中的序列化与反序列化的使用
Jun 30 Python
Python Queue模块详细介绍及实例
Dec 27 Python
Python实现发送QQ邮件的封装
Jul 14 Python
实时获取Python的print输出流方法
Jan 07 Python
详解Python Qt的窗体开发的基本操作
Jul 14 Python
python pandas cumsum求累计次数的用法
Jul 29 Python
python excel转换csv代码实例
Aug 26 Python
Python文本处理简单易懂方法解析
Dec 19 Python
Django搭建项目实战与避坑细节详解
Dec 06 Python
python re.match()用法相关示例
Jan 27 Python
python+numpy+matplotalib实现梯度下降法
Aug 31 #Python
python实现随机梯度下降法
Mar 24 #Python
python实现决策树分类(2)
Aug 30 #Python
python实现决策树分类
Aug 30 #Python
python实现多人聊天室
Mar 31 #Python
Python实现将数据写入netCDF4中的方法示例
Aug 30 #Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
Aug 30 #Python
You might like
PHP远程采集图片详细教程
2014/07/01 PHP
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
JS正则验证邮箱的格式详细介绍
2013/11/19 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
js AppendChild与insertBefore用法详细对比
2013/12/16 Javascript
JavaScript实现查找字符串中第一个不重复的字符
2014/12/29 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
全面解析Bootstrap图片轮播效果
2015/12/03 Javascript
ES6中的数组扩展方法
2016/08/26 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
vue项目中使用Svg的方法
2018/10/24 Javascript
Python函数中定义参数的四种方式
2014/11/30 Python
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
Python的装饰器用法学习笔记
2016/06/24 Python
简单谈谈python的反射机制
2016/06/28 Python
pandas系列之DataFrame 行列数据筛选实例
2018/04/12 Python
Python中的函数作用域
2018/05/07 Python
Python面向对象程序设计之类的定义与继承简单示例
2019/03/18 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
如何定义TensorFlow输入节点
2020/01/23 Python
加拿大鞋网:Globo Shoes
2019/12/26 全球购物
Tomcat Mysql datasource数据源配置
2015/12/28 面试题
Linux操作面试题
2012/05/16 面试题
护士专业推荐信
2013/11/02 职场文书
土木工程个人自荐信范文
2013/11/30 职场文书
标准的毕业生自荐信
2014/04/20 职场文书
骨干教师考核方案
2014/05/09 职场文书
班主任与学生安全责任书
2014/07/25 职场文书
2014大学生学生会工作总结
2014/12/19 职场文书
2015年感恩节演讲稿(优选篇)
2015/03/20 职场文书
MyBatis 动态SQL全面详解
2021/10/05 MySQL
Apache自带的ab压力测试工具的实现
2022/07/23 Servers