为图像添加噪声可以起到数据增强的作用
对训练数据添加适量噪声,可以使训练后的模型更加鲁棒,对模型的性能提升有一定的帮助。
两种常用噪声:椒盐噪声和高斯噪声
import cv2
import numpy as np
import random
#添加椒盐噪声
def salt_and_pepper_noise(img,percentage):
rows,cols=img.shape
num=int(percentage*rows*cols)
for i in range(num):
x=random.randint(0,rows-1)
y=random.randint(0,cols-1)
if random.randint(0,1)==0:
img[x,y]=0 #黑色噪声
else:
img[x,y]=255 #白色噪声
return img
#添加高斯噪声
def gaussian_noise(img,mu,sigma,k):
rows,cols=img.shape
for i in range(rows):
for j in range(cols):
#生成高斯分布的随机数,与原始数据相加后要取整
value=int(img[i,j]+k*random.gauss(mu=mu,sigma=sigma))
#限定数据值的上下边界
value=np.clip(a_max=255,a_min=0,a=value)
img[i,j]=value
return img
img=cv2.imread('lena.jpg')
#转换为灰度图像
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imwrite('gray_lena.jpg',gray_img)
#需要复制一份,不然是对图像的引用,后面的操作会重叠
gray_img2=gray_img.copy()
#保存椒盐噪声图像
cv2.imwrite('salt_and_pepper.jpg',salt_and_pepper_noise(gray_img,0.3))
#保存高斯噪声图像
cv2.imwrite('gaussian.jpg',gaussian_noise(gray_img2,0,1,32))
cv2.filter2D(src,ddepth,kernel,dst,anchor,delta,borderType)
cv2.medianBlur(src,ksize,dst) #特征:中心点的像素被核中中位数的像素值代替
cv2.blur(src,ksize,dst,anchor,borderType) #取内核区域下所有像素的平均值替换中心像素,核中心区域贡献率相同,对椒盐噪声效果好
cv2.boxFilter(src,ddepth,ksize,dst,anchor,normalize,borderType)
cv2.GuassianBlur(src, ksize,sigmaX,dst,sigmaY,borderType) #核中区域贡献率与距离区域中心成正比,权重与高斯分布相关
cv2.bilateralFilter(src,d, sigmaColor, sigmaSpace,dst,borderType) #处理耗时。 作用:在滤波的同时能保证一定的边缘信息
import cv2
import numpy as np
salt_and_pepper_img=cv2.imread('salt_and_pepper.jpg')
gaussian_img=cv2.imread('gaussian.jpg')
#二维卷积
kernel=np.ones((5,5),np.float32)/25
conv_2d_img=cv2.filter2D(salt_and_pepper_img,-1,kernel)
cv2.imwrite('filter_2d_img.jpg',conv_2d_img)
#中值滤波
median_blur_img=cv2.medianBlur(salt_and_pepper_img,5)
cv2.imwrite('median_blur_img.jpg',median_blur_img)
#均值滤波
mean_blur_img=cv2.blur(salt_and_pepper_img,(5,5))
cv2.imwrite('mean_blur_img.jpg',mean_blur_img)
#方框滤波
box_blur_img=cv2.boxFilter(salt_and_pepper_img,-1,(2,2),normalize=False)
cv2.imwrite('box_blur_img.jpg',box_blur_img)
#高斯滤波
gaussian_blur_img=cv2.GaussianBlur(gaussian_img,(5,5),0)
cv2.imwrite('gaussian_blur_img.jpg',gaussian_blur_img)
#双边滤波
bilateral_filter_img=cv2.bilateralFilter(gaussian_img,9,75,75)
cv2.imwrite('bilateral_filter_img.jpg',bilateral_filter_img)