OpenCV小例程

您所在的位置:网站首页 降低视频噪点的代码 OpenCV小例程

OpenCV小例程

2024-07-14 04:57| 来源: 网络整理| 查看: 265

文章目录 目标理论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 plt img = 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 plt cap = 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)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3