一、为图像添加噪声
为图像添加噪声可以起到数据增强的作用
对训练数据添加适量噪声,可以使训练后的模型更加鲁棒,对模型的性能提升有一定的帮助。
两种常用噪声:椒盐噪声和高斯噪声
import cv2
import numpy as np
import random
#添加椒盐噪声
def salt_and_pepper_noise(img,percentage):rows,cols=img.shapenum=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.shapefor 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]=valuereturn imgimg=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))
二、图像滤波处理(filter)
1、2维卷积
cv2.filter2D(src,ddepth,kernel,dst,anchor,delta,borderType)
- src:输入图像
- ddepth:目标图像所需深度,若为-1表示输入和输出图像深度相同。 (图像深度:存储每个像素所用的位数)
- kernel:卷积核
- dst:目标图像,与原图像尺寸和通道数相同
- anchor:内核的基准点(锚点)。默认值(-1,-1)表示取核的中心为锚点
- delta:类似于偏置,默认为0
- borderType:像素向外逼近的方法,默认BORDER_DEFAULT
2、中值滤波
cv2.medianBlur(src,ksize,dst) #特征:中心点的像素被核中中位数的像素值代替
- src:原图
- ksize:方框的尺寸,将方框内的值排序,取中值作为当前值
- dst:目标图像,与原图像尺寸和通道数相同
3、均值滤波
cv2.blur(src,ksize,dst,anchor,borderType) #取内核区域下所有像素的平均值替换中心像素,核中心区域贡献率相同,对椒盐噪声效果好
- src:原图
- ksize:核大小
- dst:目标图像,与原图像尺寸和通道数相同
- anchor:内核的基准点(锚点)。默认值(-1,-1)表示取核的中心为锚点
- borderType:像素向外逼近的方法,默认BORDER_DEFAULT
4、方框滤波
cv2.boxFilter(src,ddepth,ksize,dst,anchor,normalize,borderType)
- src:原图
- ddepth:目标图像所需深度,若为-1表示输入和输出图像深度相同。 (图像深度:存储每个像素所用的位数)
- ksize:核大小
- dst:目标图像,与原图像尺寸和通道数相同
- anchor:内核的基准点(锚点)。默认值(-1,-1)表示取核的中心为锚点
- normalize:bool类型,表示内核是否被其区域归一化(normalized)了。默认值为true,等价于 均值滤波cv2.blur;normalize=False 时,卷积结果>255时,置为255。
- borderType:像素向外逼近的方法,默认BORDER_DEFAULT
5、高斯滤波
cv2.GuassianBlur(src, ksize,sigmaX,dst,sigmaY,borderType) #核中区域贡献率与距离区域中心成正比,权重与高斯分布相关
- src:原图
- ksize:核大小
- sigmaX,sigmaY:分别表示X,Y方向的标准偏差。如果仅指定了sigmaX,则sigmaY与sigmaX相同.如果两者都为零,则根据内核大小计算它们
- dst:目标图像,与原图像尺寸和通道数相同
- borderType:像素向外逼近的方法,默认BORDER_DEFAULT
6、双边滤波
cv2.bilateralFilter(src,d, sigmaColor, sigmaSpace,dst,borderType) #处理耗时。 作用:在滤波的同时能保证一定的边缘信息
- src:原图
- d:邻域直径
- sigmaColor:空间高斯函数标准差,参数越大,临近像素将会在越远的地方越小
- sigmaSpace:灰度值相似性高斯函数标准差,参数越大,那些颜色足够相近的的颜色的影响越大
- dst:目标图像,与原图像尺寸和通道数相同
- borderType:像素向外逼近的方法,默认BORDER_DEFAULT
图像滤波代码部分:
import cv2
import numpy as npsalt_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)
高斯和双边是对高斯噪声图滤波的,其余都是对椒盐滤波