文章目录

  • 目标
  • 理论
  • OpenCV中的图像去噪
  • 1. cv2.fastNlMeansDenoisingColored()
  • 2. cv2.fastNlMeansDenoisingMulti()
  • 参考

图像降噪

目标

在本章中,

您将了解非局部平均去噪算法(Non-local Means Denoising algorithm)来消除图像中的噪声。

您将看到不同的函数,如cv2.fastnlmeansdenosing()、cv2.fastnlmeansdenosingcolored()等。

理论

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

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

可以通过一个简单的设置来验证它。将静态摄像头固定在某个位置几秒钟。这将为您提供大量的帧或相同场景的大量图像。然后写一段代码,找出视频中所有帧的平均值(这对您来说应该太简单了)。比较最终结果和第一帧。你可以看到噪音的减少。不幸的是,这种简单的方法对运动的摄像机和场景不具有鲁棒性。通常只有一张噪声图像时才可用。

所以想法很简单,我们需要一组相似的图像来平均噪音。考虑图像中的一个小窗口(比如5x5窗口)。同一个补丁可能在图像中的其他地方,这种可能性很大。有时在它周围的一个小街区。把这些相似的补丁放在一起,找出它们的平均值怎么样?对于那个特定的窗户,那就好了。请参见下面的示例图像:


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

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

OpenCV中的图像去噪

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

cv2.fastnlmeansdenosing()-用于单个灰度图像

cv2.fastnlmeansdenisingcolored()-用于彩色图像。

cv2.fastnlmeansdenisingmulti()-处理短时间内捕获的图像序列(灰度图像)

cv2.fastnlmeansdenisingcoloredmulti()-与上面相同,但用于彩色图像。

常见的参数有:

h:决定过滤强度的参数。较高的H值可以更好地去除噪声,但也可以去除图像的细节。(可以为10)hforcolorcomponents:与h相同,但仅用于彩色图像。(通常与H相同)TemplateWindowsize:应该是奇数。(建议为7)SearchWindowsize:应该是奇数。(建议为21)

有关这些参数的详细信息,请访问附加资源中的第一个链接。

1. cv2.fastNlMeansDenoisingColored()

如上所述,它用于去除彩色图像中的噪声。(噪声预计为高斯噪声)。见下例:

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('die.png')dst = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)plt.subplot(121),plt.imshow(img)
plt.subplot(122),plt.imshow(dst)
plt.show()

输入图像有一个高斯噪声,它是sigma=25
效果图如下:

2. cv2.fastNlMeansDenoisingMulti()

我们将对视频应用相同的方法。第一个参数是噪声帧列表。第二个参数imgToDenoiseIndex指定了需要去噪的帧,因为我们传递了输入列表中帧的索引。第三个是temporalWindowSize,它指定要用于去噪的相邻帧的数量。这应该很奇怪。在这种情况下,总共使用临时窗口大小的框架,其中中心框架是要去噪的框架。例如,您传递了一个5帧的列表作为输入。设imgToDenoiseIndex=2,temporalWindowSize=3。然后用帧1、帧2和帧3对帧2进行去噪。让我们看一个例子。

import numpy as np
import cv2
from matplotlib import pyplot as pltcap = cv2.VideoCapture('vtest.avi')# 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()


计算需要相当长的时间。结果表明,第一幅图像是原始帧,第二幅图像是噪声图像,第三幅图像是去噪图像。

参考

1.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)
2.Online course at coursera (First image taken from here)

OpenCV小例程——图像去噪相关推荐

  1. OpenCV小例程——分区域不同的显示视频

    文章目录 目标 视频效果图 Python3代码分区域显示视频 Python3+OpenCV在一个显示画面上同时显示两个不同的视频,希望能给需要的你提供个思路. 目标 在一个显示画面上同时显示两个不同的 ...

  2. OpenCV系列之图像去噪 | 五十八

    目标 在本章中, 你将学习用于去除图像中噪声的非局部均值去噪算法. 你将看到不同的函数,例如cv.fastNlMeansDenoising(),cv.fastNlMeansDenoisingColor ...

  3. OpenCV小部件的姿势Pose of a widget

    OpenCV小部件的姿势 小部件的姿势 目标 代码 解释 小部件的姿势 目标 在本教程中,您将学习如何 将小部件添加到可视化窗口 使用Affine3设置小部件的姿势 沿轴旋转和平移窗口小部件 代码 # ...

  4. python+opencv别踩白块儿游戏辅助,一天一个opencv小项目(已开源)

    python+opencv别踩白块儿游戏辅助,一天一个opencv小项目(已开源) 见链接

  5. 【图像去噪】基于matlab GUI butterworth+中值+维纳+小波图像去噪【含Matlab源码 520期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像去噪]基于matlab GUI butterworth+中值+维纳+小波图像去噪[含Matlab源码 520期] 获取代码方式2: ...

  6. 基于小波图像去噪的MATLAB实现

    基于小波图像去噪的MATLAB实现 一.课题背景 数字图像处理(Digital Image Processing,DIP)是指用计算机辅助技术对图像信号进行处理的过程.数字图像处理最早出现于 20世纪 ...

  7. 应用小波图像去噪的Matlab 实现

    小波图像去噪的方法大概分为3类 1:基于小波变换摸极大值原理 2:基于小波变换系数的相关性 3:基于小波阈值的去噪. 基于小波阈值的去噪方法3个步骤: 1: 计算含噪声图像的小波变换.选择合适的小波基 ...

  8. opencv光流例程_OpenCV 4.4 发布!新增YOLOv4 和 EfficientDet 推断支持

    新增特性: 1. 支持 YOLOv4! OpenCV一直对较为实用的YOLO系列算法情有独钟. 2. ONNX增加支持Resnet_backbone 3. 支持谷歌目标检测算法 EfficientDe ...

  9. opencv小程序:全景拼接

    SIFT 特征检测 Scale-invariant feature transform 是以一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner p ...

最新文章

  1. PHP5 VC9、VC6、Thread Safe、Non Thread Safe各个版本区别
  2. jquery遍历集合数组标签
  3. ActiveReports 报表中 RDF 文件解析
  4. nohup不输出日志信息的方法,及linux重定向学习
  5. 单片机烧录软件编写_单片机技术系列之一:单片机概述
  6. 第48讲:分布式利器 Scrapy-Redis 原理
  7. kaggle中zillow比赛中模型融合的方法及其代码
  8. exec su-exec_WildFly Kubernetes exec探针
  9. ssb门限_画出滤波法ssb信号调制器模型,并说明低通和高通滤波器分别得到哪个边带信号...
  10. UVa 11475 - Extend to Palindrome
  11. GMaps.js:让你快速集成 Google Maps 服务的 jQuery 插件
  12. NO.47 确定项目要完成的需求列表
  13. winform中的小技巧【自用】
  14. orangepi设置vnc开机自启动
  15. 使用Mybatis实例
  16. 开发对接微信卡包会员卡_微信公众号实现会员卡领取功能
  17. 微信小程序 - 基本原理
  18. python怎么退出全屏模式_notepad
  19. 【搬运工】值得一提的生活窍门
  20. LONG 类型与TO_LOB函数

热门文章

  1. 手忙脚乱的年货节从此拜拜,RPA让电商人年终奖一分不丢
  2. Vector3.Angle
  3. python读取C语言头文件
  4. 精心整理的70+款免费AI工具,总有适合你的(建议收藏)
  5. 我的 40 篇精选原创文章
  6. PCL 的欧式距离聚类
  7. 关于Google神牛Jeff Dean的笑话,非程序员勿入(转)
  8. 【头歌】抓取并筛选分组(计算机网络)
  9. HIT-大数据分析Lab1:数据预处理-实验记录
  10. 从键盘输入一个n,计算1到n的和。