数据增强(噪声,模糊,缩放,色域变换,均衡化,色彩抖动)

本篇为处女作,请大家多多指教。

在做深度学习时,数据的处理是重中之重。在做自己的数据集时,可能会面临数据图像数目不均衡,数据量少的困扰。本篇文章就是介绍图像增强的方法,对图像进行增强,增加图像的数目。

一、增加噪声

在图像中增加适量噪声可以增强学习能力。噪声有很多种,常见的有椒盐噪声,高斯噪声等。

1.椒盐噪声:一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。

#添加椒盐噪声
def sp_noise(image):
      output = np.zeros(image.shape,np.uint8)
      prob=rand(0.0005,0.001)  #随机噪声比例
      thres = 1 - prob
      for i in range(image.shape[0]):
          for j in range(image.shape[1]):
              rdn = random.random()
              if rdn < prob:
                output[i][j] = 0
              elif rdn > thres:
                output[i][j] = 255
              else:
                output[i][j] = image[i][j]
      return output

2.高斯噪声:概率密度函数服从高斯分布。

def gasuss_noise(image, mean=0, var=0.001):

    '''
        &#x6DFB;&#x52A0;&#x9AD8;&#x65AF;&#x566A;&#x58F0;
        mean : &#x5747;&#x503C;
        var : &#x65B9;&#x5DEE;
    '''
    image = np.array(image/255, dtype=float)
    noise = np.random.normal(mean, var ** 0.5, image.shape)
    out = image + noise
    if out.min() < 0:
        low_clip = -1.

    else:
        low_clip = 0.

    out = np.clip(out, low_clip, 1.0)
    out = np.uint8(out*255)
    return out

数据增强(噪声,模糊,缩放,色域变换,均衡化,色彩抖动)

二、滤波(模糊)处理

滤波处理主要是让图像变得模糊,提取图像的重要信息。常见的模糊处理有:高斯模糊,中值模糊,均值(椒盐)模糊。

卷积核大小一般为奇数:(3,3)、(5,5)、(7,7)

#&#x5229;&#x7528;opencv&#x6A21;&#x5757;
img1 = cv2.blur(img,(5,5))  #&#x4E2D;&#x503C;&#x6EE4;&#x6CE2;
img2 = cv2.medianBlur(img,5)  #&#x6912;&#x76D0;&#x6EE4;&#x6CE2;
img3 = cv2.GaussianBlur(img,(5,5)&#xFF0C;0)  #&#x9AD8;&#x65AF;&#x6EE4;&#x6CE2;

数据增强(噪声,模糊,缩放,色域变换,均衡化,色彩抖动)

三、旋转

图像的大小不变,可以将图像进行上下旋转,左右旋转等增加数据量,一般根据自己的需求,有些数据旋转之后就不符合原数据的要求了。

#&#x5229;&#x7528;pil&#x6A21;&#x5757;
img=Iamge.open('xxx')

#1.&#x81EA;&#x5B9A;&#x4E49;&#x65CB;&#x8F6C;&#x7684;&#x89D2;&#x5EA6;
img2 = img.rotate(90)

#2.&#x5F15;&#x7528;&#x56FA;&#x5B9A;&#x7684;&#x5E38;&#x91CF;&#x503C;
img2 = im.transpose(Image.FLIP_LEFT_RIGHT)    #&#x955C;&#x50CF;&#x65CB;&#x8F6C;
img2 = im.transpose(Image.FLIP_TOP_BOTTOM)    #&#x4E0A;&#x4E0B;&#x65CB;&#x8F6C;

数据增强(噪声,模糊,缩放,色域变换,均衡化,色彩抖动)

此处其实没必要进行翻转,因为会不符合要求。所以要根据自己的需求进行选择。

四、图像缩放

可以通过改变图像的大小对数据增强,但有可能会引起图像的失真。

def change_scale(image,input_shape,jitter=.5)
    iw, ih = image.size
    h, w = input_shape
    # &#x5BF9;&#x56FE;&#x50CF;&#x8FDB;&#x884C;&#x7F29;&#x653E;&#x5E76;&#x4E14;&#x8FDB;&#x884C;&#x957F;&#x548C;&#x5BBD;&#x7684;&#x626D;&#x66F2;
    new_ar = w/h * rand(1-jitter,1+jitter)/rand(1-jitter,1+jitter)
    scale = rand(.15,2.5)
    if new_ar < 1:
        nh = int(scale*h)
        nw = int(nh*new_ar)
    else:
        nw = int(scale*w)
        nh = int(nw/new_ar)
        image = image.resize((nw,nh), Image.BICUBIC)
    retuen image

数据增强(噪声,模糊,缩放,色域变换,均衡化,色彩抖动)

五、色彩抖动

色彩抖动是通过随机调整原始图片的饱和度,亮度,对比度来对产生新的图像,增加数据集

def randomColor(image):
    #&#x968F;&#x673A;&#x751F;&#x6210;0&#xFF0C;1&#x6765;&#x968F;&#x673A;&#x786E;&#x5B9A;&#x8C03;&#x6574;&#x54EA;&#x4E2A;&#x53C2;&#x6570;&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x8C03;&#x6574;&#x9971;&#x548C;&#x5EA6;&#xFF0C;&#x4E5F;&#x53EF;&#x80FD;&#x4F1A;&#x8C03;&#x6574;&#x56FE;&#x50CF;&#x7684;&#x9971;&#x548C;&#x5EA6;&#x548C;&#x4EAE;&#x5EA6;
    saturation=random.randint(0,1)
    brightness=random.randint(0,1)
    contrast=random.randint(0,1)
    sharpness=random.randint(0,1)

    #&#x5F53;&#x4E09;&#x4E2A;&#x53C2;&#x6570;&#x4E2D;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x4E3A;1&#xFF0C;&#x5C31;&#x53EF;&#x6267;&#x884C;&#x76F8;&#x5E94;&#x7684;&#x64CD;&#x4F5C;
    if random.random() < saturation:
        random_factor = np.random.randint(0, 31) / 10.  # &#x968F;&#x673A;&#x56E0;&#x5B50;
        image = ImageEnhance.Color(image).enhance(random_factor)  # &#x8C03;&#x6574;&#x56FE;&#x50CF;&#x7684;&#x9971;&#x548C;&#x5EA6;
    if random.random() < brightness:
        random_factor = np.random.randint(10, 21) / 10.  # &#x968F;&#x673A;&#x56E0;&#x5B50;
        image = ImageEnhance.Brightness(image).enhance(random_factor)  # &#x8C03;&#x6574;&#x56FE;&#x50CF;&#x7684;&#x4EAE;&#x5EA6;
    if random.random() < contrast:
        random_factor = np.random.randint(10, 21) / 10.  # &#x968F;&#x673A;&#x56E0;1&#x5B50;
        image = ImageEnhance.Contrast(image).enhance(random_factor)  # &#x8C03;&#x6574;&#x56FE;&#x50CF;&#x5BF9;&#x6BD4;&#x5EA6;
    if random.random() < sharpness:
        random_factor = np.random.randint(0, 31) / 10.  # &#x968F;&#x673A;&#x56E0;&#x5B50;
        ImageEnhance.Sharpness(image).enhance(random_factor)  # &#x8C03;&#x6574;&#x56FE;&#x50CF;&#x9510;&#x5EA6;
    return image

数据增强(噪声,模糊,缩放,色域变换,均衡化,色彩抖动)

色彩抖动之后的图像可以根据自己的需求进行删减,对于一些阴间图像可以剔除掉。

六、图像均衡化

#&#x9650;&#x5236;&#x5BF9;&#x6BD4;&#x5EA6;&#x81EA;&#x9002;&#x5E94;&#x76F4;&#x65B9;&#x56FE;&#x5747;&#x8861;
def clahe(image):
    b, g, r = cv2.split(image)
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
    b = clahe.apply(b)
    g = clahe.apply(g)
    r = clahe.apply(r)
    image_clahe = cv2.merge([b, g, r])
    return image_clahe

#&#x4F3D;&#x9A6C;&#x53D8;&#x6362;
def gamma(image):
        fgamma = rand(0,2)
        image_gamma = np.uint8(np.power((np.array(image) / 255.0), fgamma) * 255.0)
        cv2.normalize(image_gamma, image_gamma, 0, 255, cv2.NORM_MINMAX)
        cv2.convertScaleAbs(image_gamma, image_gamma)
        return image_gamma

#&#x76F4;&#x65B9;&#x56FE;&#x5747;&#x8861;
def hist(image):
        r, g, b = cv2.split(image)
        r1 = cv2.equalizeHist(r)
        g1 = cv2.equalizeHist(g)
        b1 = cv2.equalizeHist(b)
        image_equal_clo = cv2.merge([r1, g1, b1])
        return image_equal_clo

数据增强(噪声,模糊,缩放,色域变换,均衡化,色彩抖动)

全部代码

#&#x5DF2;&#x6709;&#xFF1A;&#x7FFB;&#x8F6C;&#xFF0C;&#x8272;&#x57DF;&#x53D8;&#x6362;&#xFF0C;&#x566A;&#x58F0;&#xFF0C;&#x5927;&#x5C0F;&#x6539;&#x53D8;&#xFF0C;&#x6A21;&#x7CCA;&#xFF0C;&#x8272;&#x5F69;&#x6296;&#x52A8;&#xFF0C;&#x5747;&#x8861;&#x5316;
import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image,ImageEnhance
from matplotlib.colors import rgb_to_hsv, hsv_to_rgb
import os
import random

#&#x9650;&#x5236;&#x5BF9;&#x6BD4;&#x5EA6;&#x81EA;&#x9002;&#x5E94;&#x76F4;&#x65B9;&#x56FE;&#x5747;&#x8861;
def clahe(image):
    b, g, r = cv2.split(image)
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
    b = clahe.apply(b)
    g = clahe.apply(g)
    r = clahe.apply(r)
    image_clahe = cv2.merge([b, g, r])
    return image_clahe
#&#x4F3D;&#x9A6C;&#x53D8;&#x6362;
def gamma(image):
        fgamma = 2
        image_gamma = np.uint8(np.power((np.array(image) / 255.0), fgamma) * 255.0)
        cv2.normalize(image_gamma, image_gamma, 0, 255, cv2.NORM_MINMAX)
        cv2.convertScaleAbs(image_gamma, image_gamma)
        return image_gamma
#&#x76F4;&#x65B9;&#x56FE;&#x5747;&#x8861;
def hist(image):
        r, g, b = cv2.split(image)
        r1 = cv2.equalizeHist(r)
        g1 = cv2.equalizeHist(g)
        b1 = cv2.equalizeHist(b)
        image_equal_clo = cv2.merge([r1, g1, b1])
        return image_equal_clo
#&#x6912;&#x76D0;&#x566A;&#x58F0;
def sp_noise(image):
      output = np.zeros(image.shape,np.uint8)
      prob=rand(0.0005,0.001)
      thres = 1 - prob
      for i in range(image.shape[0]):
          for j in range(image.shape[1]):
              rdn = random.random()
              if rdn < prob:
                output[i][j] = 0
              elif rdn > thres:
                output[i][j] = 255
              else:
                output[i][j] = image[i][j]
      return output
#&#x8272;&#x5F69;&#x6296;&#x52A8;
def randomColor(image):
    saturation=random.randint(0,1)
    brightness=random.randint(0,1)
    contrast=random.randint(0,1)
    sharpness=random.randint(0,1)
    if random.random() < saturation:
        random_factor = np.random.randint(0, 31) / 10.  # &#x968F;&#x673A;&#x56E0;&#x5B50;
        image = ImageEnhance.Color(image).enhance(random_factor)  # &#x8C03;&#x6574;&#x56FE;&#x50CF;&#x7684;&#x9971;&#x548C;&#x5EA6;
    if random.random() < brightness:
        random_factor = np.random.randint(10, 21) / 10.  # &#x968F;&#x673A;&#x56E0;&#x5B50;
        image = ImageEnhance.Brightness(image).enhance(random_factor)  # &#x8C03;&#x6574;&#x56FE;&#x50CF;&#x7684;&#x4EAE;&#x5EA6;
    if random.random() < contrast:
        random_factor = np.random.randint(10, 21) / 10.  # &#x968F;&#x673A;&#x56E0;1&#x5B50;
        image = ImageEnhance.Contrast(image).enhance(random_factor)  # &#x8C03;&#x6574;&#x56FE;&#x50CF;&#x5BF9;&#x6BD4;&#x5EA6;
    if random.random() < sharpness:
        random_factor = np.random.randint(0, 31) / 10.  # &#x968F;&#x673A;&#x56E0;&#x5B50;
        ImageEnhance.Sharpness(image).enhance(random_factor)  # &#x8C03;&#x6574;&#x56FE;&#x50CF;&#x9510;&#x5EA6;
    return image
def rand(a=0, b=1):
    return np.random.rand()*(b-a) + a

def get_data(image,input_shape=[200,200],random=True, jitter=.5,hue=.1, sat=1.5, val=1.5, proc_img=True):
    iw, ih = image.size
    h, w = input_shape
    # &#x5BF9;&#x56FE;&#x50CF;&#x8FDB;&#x884C;&#x7F29;&#x653E;&#x5E76;&#x4E14;&#x8FDB;&#x884C;&#x957F;&#x548C;&#x5BBD;&#x7684;&#x626D;&#x66F2;
    new_ar = w/h * rand(1-jitter,1+jitter)/rand(1-jitter,1+jitter)
    scale = rand(.15,2.5)
    if new_ar < 1:
        nh = int(scale*h)
        nw = int(nh*new_ar)
    else:
        nw = int(scale*w)
        nh = int(nw/new_ar)
        image = image.resize((nw,nh), Image.BICUBIC)
     # &#x7FFB;&#x8F6C;&#x56FE;&#x50CF;
    flip = rand()<.5 1 if flip: image="image.transpose(Image.FLIP_LEFT_RIGHT)" #噪声或者虚化,二选一 cv2.color_rgb2bgr) a1="np.random.randint(0," 3) elif (5, 5), 0) else: #均衡化 index_noise="np.random.randint(0," 10) print(index_noise) print('hist,done') print('clahe,done') print('gamma,done') #色彩抖动 print(image.size) # 色域扭曲 hue="rand(-hue," hue) sat="rand(1," sat) rand()<.5 else rand(1, val="rand(1," val) x="rgb_to_hsv(np.array(image)/255.)" x[..., 0] +="hue" 0][x[...,>1] -= 1
    x[..., 0][x[..., 0]<0] +="1" x[..., 1] *="sat" 2] x[x>1] = 1
    x[x<0] 0 = image_data="hsv_to_rgb(x)" return if __name__="=" "__main__": #图像批量处理 dirs="./class_pic3/407_3/" #原始图像所在的文件夹 dets="./class_pic3/dets/407_3/" #图像增强后存放的文件夹 mylist="os.listdir(dirs)" l="len(mylist)" #文件夹图片的数量 for j in range(0,l): image="cv2.imread(dirs+mylist[j])" img="Image.fromarray(np.uint8(image))" i range(0,2): #自定义增强的张数 img_ret="get_data(img)" #imwrite(存入图片路径+图片名称+'.jpg',img) #注意:名称应该是变化的,不然会覆盖原来的图片 cv2.imwrite(dets+'1'+str(j)+'0'+str(i)+'.jpg',img_ret) print('done') #单个图像处理 ''' range(0,4): cv2.imwrite('. class_pic3 323'+'02'+str(i)+'.jpg',img_ret) < code></0]></0]></.5>

大家可以根据自己的需求对代码有所调整。

Original: https://blog.csdn.net/qq_52050692/article/details/119698239
Author: 小谭爱学习
Title: 数据增强(噪声,模糊,缩放,色域变换,均衡化,色彩抖动)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/703687/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球