图像数据增强


"""
本代码共采用了四种数据增强,如采用其他数据增强方式,可以参考本代码,随意替换。
imageDir 为原数据集的存放位置
saveDir  为数据增强后数据的存放位置
"""
'''
def flip(root_path,img_name):   #翻转图像
    img = Image.open(os.path.join(root_path, img_name))
    if img.mode == "P":
        img = img.convert('RGB')
    elif img.mode == "RGBA":
        img = img.convert('RGB')
    filp_img = img.transpose(Image.FLIP_LEFT_RIGHT)
    # filp_img.save(os.path.join(root_path,img_name.split('.')[0] + '_flip.jpg'))
    return filp_img

def rotation(root_path, img_name): #图像旋转
    img = Image.open(os.path.join(root_path, img_name))
    if img.mode == "P":
        img = img.convert('RGB')
    elif img.mode == "RGBA":
        img = img.convert('RGB')
    theta = random.randint(0,180)
    rotation_img = img.rotate(theta) #旋转角度
    # rotation_img.save(os.path.join(root_path,img_name.split('.')[0] + '_rotation.jpg'))
    return rotation_img

def randomColor(root_path, img_name): #随机颜色
    
    #对图像进行颜色抖动
    #:param image: PIL的图像image
    #:return: 有颜色色差的图像image
    
    image = Image.open(os.path.join(root_path, img_name))
    random_factor = np.random.randint(0, 41) / 10.  # 随机因子
    color_image = ImageEnhance.Color(image).enhance(random_factor)  # 调整图像的饱和度
    random_factor = np.random.randint(10, 31) / 10.  # 随机因子
    brightness_image = ImageEnhance.Brightness(color_image).enhance(random_factor)  # 调整图像的亮度
    random_factor = np.random.randint(10, 31) / 10.  # 随机因子
    contrast_image = ImageEnhance.Contrast(brightness_image).enhance(random_factor)  # 调整图像对比度
    random_factor = np.random.randint(0, 41) / 10.  # 随机因子
    return ImageEnhance.Sharpness(contrast_image).enhance(random_factor)  # 调整图像锐度


def contrastEnhancement(root_path, img_name):  # 对比度增强
    image = Image.open(os.path.join(root_path, img_name))
    enh_con = ImageEnhance.Contrast(image)
    contrast = 2
    image_contrasted = enh_con.enhance(contrast)
    return image_contrasted

def brightnessEnhancement(root_path, img_name):#亮度增强
    image = Image.open(os.path.join(root_path, img_name))
    enh_bri = ImageEnhance.Brightness(image)
    brightness = 2
    image_brightened = enh_bri.enhance(brightness)
    return image_brightened

def colorEnhancement(root_path, img_name):#颜色增强
    image = Image.open(os.path.join(root_path, img_name))
    enh_col = ImageEnhance.Color(image)
    color = 2
    image_colored = enh_col.enhance(color)
    return image_colored

def translations(img_name):#图像平移(向右下角随机在0-50之间平移)
    #image = Image.open(os.path.join(root_path, img_name))
    height, width, channels = img_name.shape
    emptyImage2 = img_name.copy()
    x= random.randint(0,50)
    y= random.randint(0,50)
    for i in range(height):
     for j in range(width):
        if i>=x and j>=y:
            emptyImage2[i,j]=img_name[i-x][j-y]
        else:
            emptyImage2[i,j]=(0,0,0)
    return emptyImage2

    #img = cv2.imread("C:\\Users\\PC\\Desktop\\video-detection\\normal3.jpg")
 
    #cv2.namedWindow("Image")
    #SaltImage=move(image)
    #cv2.imshow("Image",image)
    #cv2.imshow("ss",SaltImage)
    #cv2.waitKey(0)

#随机生成符合正态(高斯)分布的随机数,高斯噪声
def GaussianNoise(root_path,img_name):   
    image=Image.open(os.path.join(root_path, img_name))
    means = 2
    sigma = 4
    percetage = 0.5   
    imageNum=int(percetage*image.shape[0]*image.shape[1])   
    for i in range(imageNum):        
        randX=random.randint(0,image.shape[0]-1)        
        randY=random.randint(0,image.shape[1]-1)
        #此处在原有像素灰度值上加上随机数
        image[randX,randY]=image[randX,randY]+random.gauss(means,sigma)        
        #若灰度值小于0则强制为0,若灰度值大于255则强制为255
        if  image[randX, randY]< 0:                 
            image[randX, randY]=0        
        elif image[randX, randY]>255:                 
            image[randX, randY]=255    
    return image

#椒盐噪声加噪
def  Salt_pepper_noise(root_path,img_name):     
    image=Image.open(os.path.join(root_path, img_name)) 
    percetage = 0.2   
    imageNum=int(percetage*src.shape[0]*src.shape[1])   
    for i in range(imageNum):   #返还一个迭代器  
    #把一张图片的像素用行和列表示的话,randX 代表随机生成的行,randY代表随机生成的列
    #random.randint生成随机整数
    #椒盐噪声图片边缘不处理,故-1
        randX=random.randint(0,src.shape[0]-1)       
        randY=random.randint(0,src.shape[1]-1)
        #random.random生成随机浮点数,随意取到一个像素点有一半的可能是白点255,一半的可能是黑点0      
        if random.random()<=0.5:           
            image[randX,randY]=0        
        else:            
            image[randX,randY]=255    
    return image



from PIL import Image
from PIL import ImageEnhance
import os
import cv2
import numpy as np
import math
import random

imageDir="C:\\Users\\PC\\Desktop\\光交光分光猫数据集\\new-pictures\\"     #要改变的图片的路径文件夹
saveDir="C:\\Users\\PC\\Desktop\\光交光分光猫数据集\\增强\\"   #要保存的图片的路径文件夹

for name in os.listdir(imageDir):
    #saveName = name[:-4]+"id.jpg"
    #image = Image.open(os.path.join(imageDir, name))
    #image.save(os.path.join(saveDir, saveName))

    # 随机颜色
    # saveName = name[:-4] + "rC.jpg"
    # saveImage = randomColor(imageDir, name)
    # saveImage.save(os.path.join(saveDir, saveName))

    #亮度增强
    # saveName = name[:-4]+"be.jpg"
    # saveImage = brightnessEnhancement(imageDir, name)
    # saveImage.save(os.path.join(saveDir, saveName))

    #翻转
    #saveName = name[:-4]+"fl.png"
    #saveImage = flip(imageDir, name)
    #saveImage.save(os.path.join(saveDir, saveName))

    #旋转
    #saveName = name[:-4]+"ro.jpg"
    #saveImage = rotation(imageDir, name)
    #saveImage.save(os.path.join(saveDir, saveName))



    #对比度增强
    #saveName = name[:-4]+"cotrE.png"
    #saveImage = contrastEnhancement(imageDir, name)
    #saveImage.save(os.path.join(saveDir, saveName))

    #颜色增强
    # saveName = name[:-4]+"colorE.jpg"
    # saveImage = colorEnhancement(imageDir, name)
    # saveImage.save(os.path.join(saveDir, saveName))




    #高斯噪声
    #saveName = name[:-4]+"GN.jpg"
    #saveImage = GaussianNoise(os.path.join(imageDir, Name))
    #saveImage.save(os.path.join(saveDir, saveName))



    #椒盐噪声
    #saveName = name[:-4]+"Spn.jpg"
    #saveImage = Salt_pepper_noise(os.path.join(imageDir, name))
    #saveImage.save(os.path.join(saveDir, saveName))


    #平移
    #saveName = name[:-4]+"tr.jpg"
    #saveImage = translations(name)
    #saveImage.save(os.path.join(saveDir, saveName))

'''



#对图片进行平移
import os
import random
import cv2
import math
import numpy as np
def move(image):
    #print(image)
    height, width, channels = image.shape
    emptyImage2 = image.copy()
    x= random.randint(0,50)
    y= random.randint(0,50)
    for i in range(height):
        for j in range(width):
            if i>=x and j>=y:
                emptyImage2[i,j]=image[i-x][j-y]
            else:
                emptyImage2[i,j]=(0,0,0)
 
    
    return emptyImage2

imageDir="C:\\Users\\PC\\Desktop\\2\\new-pictures\\"     #要改变的图片的路径文件夹
saveDir="C:\\Users\\PC\\Desktop\\2\\1\\"   #要保存的图片的路径文件夹

for name in os.listdir(imageDir):
    img=cv2.imread(os.path.join(imageDir, name)) 
    #img = cv2.imread("C:\\Users\\PC\\Desktop\\video-detection\\normal3.jpg")
    print(img)
    #cv2.namedWindow("Image")
    SaltImage=move(img)
    saveName = name[:-4] + "move.jpg"
    cv2.imwrite(os.path.join(saveDir, saveName),SaltImage)
    #cv2.imshow("Image",img)
    #cv2.imshow("ss",SaltImage)
    #cv2.waitKey(0)


"""
import numpy as np
import random
import cv2
 
def sp_noise(image,prob):
  '''
  添加椒盐噪声
  prob:噪声比例 
  '''
  output = np.zeros(image.shape,np.uint8)
  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
 
 
def gasuss_noise(image, mean=0, var=0.001):
  ''' 
    添加高斯噪声
    mean : 均值 
    var : 方差
  '''
  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)
  #cv.imshow("gasuss", out)
  return out
"""

'''
import numpy as np
import cv2  #pip install opencv_python
from numpy import shape
import random
import os
def  fun1(src,percetage):     
    NoiseImg=src    
    NoiseNum=int(percetage*src.shape[0]*src.shape[1])   
    for i in range(NoiseNum):   #返还一个迭代器  
    #把一张图片的像素用行和列表示的话,randX 代表随机生成的行,randY代表随机生成的列
    #random.randint生成随机整数
    #椒盐噪声图片边缘不处理,故-1
        randX=random.randint(0,src.shape[0]-1)       
        randY=random.randint(0,src.shape[1]-1)
        #random.random生成随机浮点数,随意取到一个像素点有一半的可能是白点255,一半的可能是黑点0      
        if random.random()<=0.5:           
            NoiseImg[randX,randY]=0        
        else:            
            NoiseImg[randX,randY]=255    
    return NoiseImg

imageDir="C:\\Users\\PC\\Desktop\\2\\"     #要改变的图片的路径文件夹
saveDir="C:\\Users\\PC\\Desktop\\3\\"   #要保存的图片的路径文件夹

for name in os.listdir(imageDir):
    #导入图片
    img=cv2.imread(os.path.join(imageDir, name),0)
    #调fun1函数,0.2为参数信噪比设定
    img1=fun1(img,0.2)
    #在文件夹中写入命名为PepperandSalt.jpg的加噪后的图片
    saveName = name[:-4] + "noise.jpg"
    cv2.imwrite(os.path.join(saveDir, saveName),img1)
    #展示加噪后的图片
    #cv2.imshow('PepperandSalt',img1)
    #cv2.waitKey(0)

'''


#随机生成符合正态(高斯)分布的随机数,means,sigma为两个参数
"""
import numpy as np
import cv2
from numpy import shape
import random
def GaussianNoise(src,means,sigma,percetage):   
    NoiseImg=src    
    NoiseNum=int(percetage*src.shape[0]*src.shape[1])   
    for i in range(NoiseNum):        
        randX=random.randint(0,src.shape[0]-1)        
        randY=random.randint(0,src.shape[1]-1)
        #此处在原有像素灰度值上加上随机数
        NoiseImg[randX,randY]=NoiseImg[randX,randY]+random.gauss(means,sigma)        
        #若灰度值小于0则强制为0,若灰度值大于255则强制为255
        if  NoiseImg[randX, randY]< 0:                 
            NoiseImg[randX, randY]=0        
        elif NoiseImg[randX, randY]>255:                 
            NoiseImg[randX, randY]=255    
    return NoiseImg
img=cv2.imread('C:\\Users\\PC\\Desktop\\video-detection\\normal3.jpg',0)
img1=GaussianNoise(img,2,4,0.5)
cv2.imwrite('C:\\Users\\PC\\Desktop\\video-detection\\GaussianNoise.jpg',img1)
cv2.imshow('C:\\Users\\PC\\Desktop\\video-detection\\GaussianNoise',img1)
cv2.waitKey(0)
"""


"""
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
import sys
import copy

#python 图像翻转,自定义翻转

img = cv.imread('C:\\Users\\PC\\Desktop\\video-detection\\normal3.jpg')

if img.all()==None:
    print('No Such image!')
    sys.exit(0)
size = img.shape
iCopy = copy.deepcopy(img)
iCopy1 = copy.deepcopy(img)
iCopy2 = copy.deepcopy(img)
h = size[0]
w = size[1]

for i in range(h):
    for j in range(w):
        iCopy[i,w-1-j] = img[i,j]#水平镜像
        iCopy1[h-1-i,j] = img[i,j]#垂直镜像
        iCopy2[h-1-i,w-1-j] = img[i,j]#对角镜像
plt.subplot(221),plt.imshow(img)
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222),plt.imshow(iCopy)
plt.title('Remap shuiping Image'), plt.xticks([]), plt.yticks([])
plt.subplot(223),plt.imshow(iCopy1)
plt.title('Remap chuizhi Image'), plt.xticks([]), plt.yticks([])
plt.subplot(224),plt.imshow(iCopy2)
plt.title('Remap duijiao Image'), plt.xticks([]), plt.yticks([])

plt.show()
#python 图像翻转,使用openCV flip()方法翻转
xImg = cv.flip(img,1,dst=None) #水平镜像
xImg1 = cv.flip(img,0,dst=None) #垂直镜像
xImg2 = cv.flip(img,-1,dst=None) #对角镜像
plt.subplot(221),plt.imshow(img)
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222),plt.imshow(xImg)
plt.title('Remap shuiping Image'), plt.xticks([]), plt.yticks([])
plt.subplot(223),plt.imshow(xImg1)
plt.title('Remap chuizhi Image'), plt.xticks([]), plt.yticks([])
plt.subplot(224),plt.imshow(xImg2)
plt.title('Remap duijiao Image'), plt.xticks([]), plt.yticks([])

plt.show()
"""


#图像模糊处理
# coding: utf-8
"""
import numpy as np
import cv2
import os

def motion_blur(image, degree=20, angle=45):
    image = np.array(image)

    # 这里生成任意角度的运动模糊kernel的矩阵, degree越大,模糊程度越高
    M = cv2.getRotationMatrix2D((degree / 2, degree / 2), angle, 1)
    motion_blur_kernel = np.diag(np.ones(degree))
    motion_blur_kernel = cv2.warpAffine(motion_blur_kernel, M, (degree, degree))

    motion_blur_kernel = motion_blur_kernel / degree
    blurred = cv2.filter2D(image, -1, motion_blur_kernel)

    # convert to uint8
    cv2.normalize(blurred, blurred, 0, 255, cv2.NORM_MINMAX)
    blurred = np.array(blurred, dtype=np.uint8)
    return blurred

imageDir="C:\\Users\\PC\\Desktop\\pictures\\"     #要改变的图片的路径文件夹
saveDir="C:\\Users\\PC\\Desktop\\project-pictures\\"   #要保存的图片的路径文件夹

for name in os.listdir(imageDir):
    img = cv2.imread(os.path.join(imageDir, name))
    img_blur = motion_blur(img)
    saveName = name[:-4] + "blur2.jpg"
    cv2.imwrite(os.path.join(saveDir, saveName),img_blur)
    #cv2.imshow('Source image',img)
    #cv2.imshow('blur image',img_blur)
    #cv2.waitKey()
"""

"""
#对图片画线
import cv2
import numpy as np
import os
import random

imageDir="C:/Users/PC/Desktop/image/"     #要改变的图片的路径文件夹
#saveDir="C:/Users/PC/Desktop/1/"   #要保存的图片的路径文件夹

for name in os.listdir(imageDir):

    img = cv2.imread(os.path.join(imageDir, name))
#img = cv2.imread("C:/Users/PC/Desktop/image/000008.jpg")
    print(img.shape[0])
    print(img.shape[1])
        #newImg = (500,500,3) #这里是创建一个空图片500x500 深度为3的彩色图片
        #dst = np.zeros(img,np.uint8)
        #line参数解析 1 图片 2 begin 3 end 4 color 5 line width 6 line style
        #cv2.line(img,(100,100),(400,400),(0,0,255))#画一条红色的线
        #x = random.radint(0,100)
    #for j in range(6,random.randint(15,20)):

    y = random.randint(1,img.shape[0])
    g = random.randint(1,img.shape[0]-300)
    z = random.randint(1,50)
    x = random.randint(51,100)
    i = random.randint(101,150)
    j = random.randint(151,200)
    cv2.line(img,(0,y),(img.shape[1],y),(random.randint(0,255),random.randint(0,255),random.randint(0,255)),random.randint(1,6)) #画一条宽度为4的线
    cv2.line(img,(0,y-z),(img.shape[1],y-z),(random.randint(0,255),random.randint(0,255),random.randint(0,255)),random.randint(1,6))
    cv2.line(img,(0,y-x),(img.shape[1],y-x),(random.randint(0,255),random.randint(0,255),random.randint(0,255)),random.randint(1,6))
    cv2.line(img,(0,y-i),(img.shape[1],y-i),(random.randint(0,255),random.randint(0,255),random.randint(0,255)),random.randint(1,6))
    cv2.line(img,(0,y-j),(img.shape[1],y-j),(random.randint(0,255),random.randint(0,255),random.randint(0,255)),random.randint(1,6))

    savename = name[:-4] + "id1.jpg"
        #cv2.imshow('test',img)
    img1 = img
    cv2.imwrite("C:/Users/PC/Desktop/1/" + savename, img)
            #cv2.imshow('test',img)

    #cv2.imwrite(os.path.join(saveDir, savename), img1)
        #cv2.waitKey(0) 
"""

"""
#镜像
import cv2
import numpy as np
import os

imageDir=""     #要改变的图片的路径文件夹
saveDir=""   #要保存的图片的路径文件夹

for name in os.listdir(imageDir):

    img=cv2.imread(os.path.join(imageDir, name))
    imgInfo = img.shape
    height= imgInfo[0]
    width = imgInfo[1]
    deep = imgInfo[2]

    dst = np.zeros([height*2, width, deep], np.uint8)

    for i in range(height):
        for j in range(width):
            dst[i,j] = img[i,j]
            dst[height*2-i-1,j] = img[i,j]

    for i in range(width):
        dst[height, i] = (0, 0, 255)

    saveName = name[:-4] + "mirror.jpg"
    cv2.imwrite(os.path.join(saveDir, saveName),dst)
    #cv2.imshow('image', dst)
    cv2.waitKey(0)
"""


"""
#仿射
import cv2
import numpy as np
import os


imageDir="C:\\Users\\PC\\Desktop\\pictures\\"     #要改变的图片的路径文件夹
saveDir="C:\\Users\\PC\\Desktop\\project-pictures\\"   #要保存的图片的路径文件夹

for name in os.listdir(imageDir):


    img=cv2.imread(os.path.join(imageDir, name))
    imgInfo = img.shape
    height= imgInfo[0]
    width = imgInfo[1]
    deep = imgInfo[2]
    # src 3 -> dst 3 (左上角, 左下角,右上角)
    matSrc = np.float32([[0,0],[0,height-1],[width-1, 0]]) # 需要注意的是 行列 和 坐标 是不一致的
    matDst = np.float32([[50,50],[100, height-50],[width-200,100]])

    matAffine = cv2.getAffineTransform(matSrc,matDst) #mat 1 src 2 dst 形成组合矩阵
    dst = cv2.warpAffine(img, matAffine,(height, width))
    
    saveName = name[:-4] + "affine.jpg"
    cv2.imwrite(os.path.join(saveDir, saveName),dst)
    cv2.waitKey(0)
"""

上述代码,是其他博客中的代码,原链接忘记了,如有看到,请提醒。

部分代码未调通。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值