在使用cnn进行物体检测或者物体识别之类任务中,往往都会对原图进行变化处理,已增加数据的复杂度减小overfitting的可能性。下面列出了部分常用的变换方法:
import cv2
import numpy as np
import random
class ImageProcess():
def RandomBrightness(self,bgr):#
if random.random() < 0.5:
hsv = self.BGR2HSV(bgr)
h,s,v = cv2.split(hsv)
adjust = random.choice([0.5,1.5])
v = v*adjust
v = np.clip(v, 0, 255).astype(hsv.dtype)
hsv = cv2.merge((h,s,v))
bgr = self.HSV2BGR(hsv)
return bgr
def RandomSaturation(self,bgr):
if random.random() < 0.5:
hsv = self.BGR2HSV(bgr)
h,s,v = cv2.split(hsv)
adjust = random.choice([0.5,1.5])
s = s*adjust
s = np.clip(s, 0, 255).astype(hsv.dtype)
hsv = cv2.merge((h,s,v))
bgr = self.HSV2BGR(hsv)
return bgr
def RandomHue(self,bgr):
if random.random() < 0.5:
hsv = self.BGR2HSV(bgr)
h,s,v = cv2.split(hsv)
adjust = random.choice([0.5,1.5])
h = h*adjust
h = np.clip(h, 0, 255).astype(hsv.dtype)
hsv = cv2.merge((h,s,v))
bgr = self.HSV2BGR(hsv)
return bgr
def randomBlur(self,bgr):
if random.random()<0.5:
bgr = cv2.blur(bgr,(5,5))
return bgr
def randomShift(self,bgr):
#平移变换
if random.random() <0.9:
height,width,c = bgr.shape
after_shfit_image = np.zeros((height,width,c),dtype=bgr.dtype)
after_shfit_image[:,:,:] = (104,117,123) #bgr
shift_x = random.uniform(-width*0.2,width*0.2)
shift_y = random.uniform(-height*0.2,height*0.2)
#print(bgr.shape,shift_x,shift_y)
#原图像的平移
if shift_x>=0 and shift_y>=0:
after_shfit_image[int(shift_y):,int(shift_x):,:] = bgr[:height-int(shift_y),:width-int(shift_x),:]
elif shift_x>=0 and shift_y<0:
after_shfit_image[:height+int(shift_y),int(shift_x):,:] = bgr[-int(shift_y):,:width-int(shift_x),:]
elif shift_x <0 and shift_y >=0:
after_shfit_image[int(shift_y):,:width+int(shift_x),:] = bgr[:height-int(shift_y),-int(shift_x):,:]
elif shift_x<0 and shift_y<0:
after_shfit_image[:height+int(shift_y),:width+int(shift_x),:] = bgr[-int(shift_y):,-int(shift_x):,:]
print(after_shfit_image.shape)
return after_shfit_image
return bgr
def randomScale(self,bgr):
#固定住高度,以0.6-1.4伸缩宽度,做图像形变
if random.random() < 0.5:
scale = random.uniform(0.6,1.4)
height,width,c = bgr.shape
bgr = cv2.resize(bgr,(int(width*scale),height))
return bgr
return bgr
def randomCrop(self,bgr):
if random.random() < 0.9:
height,width,c = bgr.shape
h = random.uniform(0.6*height,height)
w = random.uniform(0.6*width,width)
x = random.uniform(0,width-w)
y = random.uniform(0,height-h)
x,y,h,w = int(x),int(y),int(h),int(w)
img_croped = bgr[y:y+h,x:x+w,:]
return img_croped
return bgr
def subMean(self,bgr,mean):
mean = np.array(mean, dtype=np.float32)
bgr = bgr - mean
return bgr
def random_flip(self,im):
if random.random() < 0.5:
im_lr = np.fliplr(im).copy()
h,w,_ = im.shape
return im_lr
return im
def random_bright(self, im, delta=16):
alpha = random.random()
if alpha > 0.3:
im = im * alpha + random.randrange(-delta,delta)
im = im.clip(min=0,max=255).astype(np.uint8)
return im
ii=ImageProcess()
img=cv2.imread('1.png')
print(img.shape)
cv2.imshow('1',ii.random_flip(img))
cv2.imshow('2',ii.random_flip(img))
cv2.imshow('3',ii.random_flip(img))
cv2.imshow('4',ii.random_flip(img))
cv2.waitKey(0)