图像噪声处理

一、为图像添加噪声

为图像添加噪声可以起到数据增强的作用
对训练数据添加适量噪声,可以使训练后的模型更加鲁棒,对模型的性能提升有一定的帮助。

两种常用噪声:椒盐噪声高斯噪声

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))

图像噪声处理_第1张图片

二、图像滤波处理(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 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)

图像噪声处理_第2张图片
高斯和双边是对高斯噪声图滤波的,其余都是对椒盐滤波

你可能感兴趣的:(人脸识别,计算机视觉,opencv,cv)