图片数据增强:
包括重采样改变分辨率,裁剪,翻转和旋转,饱和度亮度对比度锐度变换,颜色变换,噪声,模糊
效果:
import os
import glob
import random
import shutil
import collections
import os.path as osp
import numpy as np
from PIL import Image,ImageEnhance,ImageFilter
import scipy.io
import torch
from torch.utils import data
from torchvision import transforms as T
from torch.utils.data import DataLoader
import fcn
import scipy.misc
def randomResampleTrans(img,lbl):
height = random.randint(280,3000)
width = random.randint(int(0.7*height),int(min(2*height,4000)))
imgResized = img.resize((width, height), Image.ANTIALIAS)
labelImg = lbl.resize((width, height), Image.NEAREST)
return imgResized,labelImg
def randomCropTrans(img,lbl,tw,th):
w, h = img.size
assert w>=tw and h>=th# 确保height 和width大于256,因为256时我们要裁剪的大小
if w == tw and h == th:
return 0, 0, h, w
i = random.randint(0, h - th)
j = random.randint(0, w - tw)
imgCrop = img.crop((j,i,j+tw,i+th))
lblCrop = lbl.crop((j,i,j+tw,i+th))
return imgCrop,lblCrop
def randomFlipAndRotate(img,lbl):
if random.random()<0.5:
img = img.transpose(Image.FLIP_LEFT_RIGHT)
lbl = lbl.transpose(Image.FLIP_LEFT_RIGHT)
if random.random()<0.5:
img = img.transpose(Image.FLIP_TOP_BOTTOM)
lbl = lbl.transpose(Image.FLIP_TOP_BOTTOM)
if random.random() < 0.5:
img = img.transpose(Image.ROTATE_90)
lbl = lbl.transpose(Image.ROTATE_90)
if random.random()<0.5:
img = img.transpose(Image.ROTATE_180)
lbl = lbl.transpose(Image.ROTATE_180)
if random.random()<0.5:
img = img.transpose(Image.ROTATE_270)
lbl =lbl.transpose(Image.ROTATE_270)
return img,lbl
def randomHueBrightContrastShap(img,lbl=None):
hue = random.uniform(0.5,1.5)#控制饱和度
img = ImageEnhance.Color(img).enhance(hue)
bri = random.uniform(0.8,1.5)#控制亮度
img = ImageEnhance.Brightness(img).enhance(bri)
con = random.uniform(0.8,1.5)#控制对比度
img = ImageEnhance.Contrast(img).enhance(con)
shap = random.uniform(0, 2) # 控制对比度
img = ImageEnhance.Sharpness(img).enhance(shap)
return img,lbl
def randomColorChange(img,lbl=None):#最后在做实验查看 感觉随机在某个通道上全部减少只是一种方式,而是要随机在各个像素 各个通道上减少某个很小的值
# imgArr = np.asarray(img)
# rVal = random.randint(-20,20)
# imgArr = [imgArr[i]+rVal for i in range(len(imgArr))]
if random.random()<1:
img = img.point(lambda i:i+random.randint(-20,20))
return img,lbl
def randomNoise(img,lbl=None):#PIL中没有找到怎么加噪声 所以用cv2实现
imgArr = np.asarray(img)
imgArr2 = imgArr.copy()
if random.random()<0.25:
for i in range(random.randint(100,200)): # 添加点噪声
temp_x = np.random.randint(0, imgArr.shape[0])
temp_y = np.random.randint(0, imgArr.shape[1])
imgArr2[temp_x][temp_y] = random.randint(0,255)
return Image.fromarray(imgArr2),lbl
def randomBlur(img,lbl=None):
if random.random()<0.5:
radius = random.randint(1,2)
img = img.filter(ImageFilter.GaussianBlur(radius))
return img,lbl
调用程序:
if __name__ == '__main__':
img = Image.open('/home/mlxuan/project/DeepLearning/data/image_Segmentation/js-segment-annotator-master/data/images/DJI_0200.JPG')
lbl = Image.open('/home/mlxuan/project/DeepLearning/FCN/fcn_mlx/data/dst.png')
img,lbl = randomResampleTrans(img,lbl)
img,lbl = randomCropTrans(img,lbl,256,256)
img,lbl = randomFlipAndRotate(img,lbl)
img,lbl = randomHueBrightContrastShap(img,lbl)
img,lbl = randomColorChange(img,lbl)
img,lbl = randomNoise(img,lbl)
img,lbl = randomBlur(img,lbl)
img.save('./1.png')
lbl.save('2.png')
resample('./1.png','./2.png')
_ = fcn.utils.label2rgb(lbl=np.asarray(Image.open('./2.png')), img=np.asarray(Image.open('./1.png')),
label_names=['b', 'R', 'T', 'G', 'A', 'S', 'w', 'W', 'B', 'H'])
# if dstVisPath not None:
scipy.misc.imsave('./3.png', _)