魏老师学生——Cecil:学习OpenCV-机器视觉之旅
Aim:使用非局部平均值去噪算法去除图像中的噪音
学习函数cv2.fastNlMeansDenoising() ,cv2.fastNlMeansDenoising()
原理
- 图像平滑技术(噪声小时):高斯平滑、中值平滑
- 选取像素周围一个小的邻域,再用高斯平均值或者中值平均值取代中心像素。所以:像素级别的噪声去除限制在局部邻域。
- 噪声性质:平均值唯一的随机变量。
- 带噪声的像素点:p=p0+n,p0像素真实值,n像素噪声。从不同图片中选取大量相同像素,计算平均值。理想情况:p=p0,噪声平均值是0.
- 非局部平均值去噪:对一组相似的图片,通过取平均值的方法去除噪音。对图片取5×5的小窗口,寻找其他相似窗口,再求所有窗口平均值,以平均值代替目标像素的值。
- 算法占内存大,但结果质量高。
OpenCV中的图像去噪
- cv2.fastNlMeansDenoising() 使用对象是灰度图
- cv2.fastNlMeansDenoisingColored() 使用对象是彩色图
- cv2.fastNlMeansDenoisingMulti() 适用于短时间的灰度图像序列
- cv2.fastNlMeansDenoisingColoredMulti() 适用于短时间的彩色图像序列
共同参数:
h:决定过滤器强度。h值高可以很好去除噪声,但也会抹去图像细节。
hForColorComponents:与h效果一样,适用于彩色图像。
templateWindowSize:奇数。推荐值7.
searchWindowsSize:奇数。推荐值21.
cv2.fastNlMeansDenoisingColored()
#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('./image2/tuxiangxue1.jpg')
dst=cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)
plt.subplot(121),plt.imshow(img)
plt.subplot(122),plt.imshow(dst)
plt.show()
cv2.fastNlMeansDenoisingMulti()
参数一:噪声帧列表;
参数二:imgtoDenoiseIndex 设定需要去噪的帧,可用通过传入帧的索引。
参数三:temporaWindowSize 设置用于去噪的相邻帧的数目,为奇数。此帧用于去噪,中间帧为要去噪的帧。
举例:传入5帧图像,imgToDenoiseIndex=2和temporaWindowSize=3,第一二三帧图像用于对第二帧图像去噪。
#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
cap=cv2.VideoCapture('./video/dali.mp4')
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]
noisy=[np.uint8(np.clip(i,0,255)) for i in noisy]
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()
左:原始图 中:带噪音 右:去噪音