数据增强常用的有:翻转,hsv调节,亮度、对比度调节,裁剪,模糊,padding。
整理成一个类:
import random import numpy as np import cv2 class Transformer: @staticmethod def flip_horizontal(image): return cv2.flip(image, 1) @staticmethod def flip_vertical(image): return cv2.flip(image, 0) @staticmethod def flip_horizontal_vertical(image): return cv2.flip(image, -1) @staticmethod def rotation(image, degrees): """ counter-clockwise direction. rotation with the center. """ (h, w) = image.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, degrees, 1.0) return cv2.warpAffine(image, M, (w, h)) @staticmethod def brightness_contrast(image, bt=0., ct=1.): # 亮度, 对比度 data = image.astype(np.float) data += data * ct + bt data = np.clip(data, 0, 255) data = data.astype(np.uint8) return data @staticmethod def hsv(image, h, s, v): # 色彩, 饱和度, 明度 img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) img_hsv = img_hsv.astype(np.float) if h != 0: img_hsv[:, :, 0] += img_hsv[:, :, 0] * h img_hsv[:, :, 0] = np.clip(img_hsv[:, :, 0], 0, 180) if s != 0: img_hsv[:, :, 1] += img_hsv[:, :, 1] * s img_hsv[:, :, 1] = np.clip(img_hsv[:, :, 1], 0, 255) if v != 0: img_hsv[:, :, 2] += img_hsv[:, :, 2] * v img_hsv[:, :, 2] = np.clip(img_hsv[:, :, 2], 0, 255) img_hsv = img_hsv.astype(np.uint8) return cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR) @staticmethod def crop(image, crop_scale=(0.5, 0.5)): # 色彩 """ :param image: Input image, that need numpy uint8 :param crop_scale: crop min scale with h,w, max scale is h,w of image """ h, w = image.shape[:2] rh = random.randint(int(h * crop_scale[0]), h) rw = random.randint(int(w * crop_scale[1]), w) offset_x = random.randint(0, w - rw) offset_y = random.randint(0, h - rh) return image[offset_x:min(offset_x + rw, w - 1), offset_y:min(offset_y + rh, h - 1):] @staticmethod def blur_gaussian(image, kernel=(3, 3), std=0): return cv2.GaussianBlur(image, kernel, std) @staticmethod def resize_padding(image, dst_hw=(128, 128)): """ :param image: Input image, that need numpy uint8 :param dst_hw: Target image size h,w :return: padding result image """ hs, ws = np.array(dst_hw) / np.array(image.shape[:2]) img_h, img_w = image.shape[:2] if hs < ws: align_W, align_H = int(img_w * hs), int(img_h * hs) else: align_W, align_H = int(img_w * ws), int(img_h * ws) img_resized = cv2.resize(image, (align_W, align_H)) img_paded = np.zeros([dst_hw[0], dst_hw[1], 3], dtype=np.uint8) ry, rx = int((dst_hw[0] - align_H) / 2), int((dst_hw[1] - align_W) / 2) img_paded[ry:align_H + ry, rx:align_W + rx, :] = img_resized return img_paded if __name__ == '__main__': for _ in range(100): img = cv2.imread(r'./example.png') img1 = Transformer.blur_gaussian(img, [3, 3]) img1 = Transformer.blur_gaussian(img1, [3, 3]) img1 = Transformer.blur_gaussian(img1, [3, 3]) cv2.imshow('ori', img) cv2.imshow('result', img1) cv2.waitKey(0)