opencv进行图像数据增广2021-03-19

最近在做剪纸图案的生成,但是特定风格的剪纸图案很少,采用数据增广的方式进行扩充。一般数据增广有以下几个方面
翻转变换 flip
随机修剪 random crop
色彩抖动 color jittering
平移变换 shift
尺度变换 scale
对比度变换 contrast
噪声扰动 noise
旋转变换/反射变换 Rotation/reflection
但是因为平移变换、随机裁剪会破坏剪纸内在的连通性且破坏剪纸本身的语义,因此不采用平移变换(虽然最后生成的剪纸连通性还是没有保证)。剪纸图案一般作为二值图作为输入因此色彩抖动,对比度变换也舍弃。经过实验发现旋转也会对实验结果产生不利的影响。因此最后采用翻转、缩放和仿射变换来增广。

import os import numpy as np def center_crop(image): sp = image.shape# 获取图像形状:返回【行数值,列数值】列表 sz1 = sp[0]# 图像的高度(行 范围) sz2 = sp[1]# 图像的宽度(列 范围) # sz3 = sp[2]#像素值由【RGB】三原色组成# 你想对文件的操作 a = int(sz1 / 2 - 128)# x start b = int(sz1 / 2 + 128)# x end c = int(sz2 / 2 - 128)# y start d = int(sz2 / 2 + 128)# y end cropImg = image[a:b, c:d]# 裁剪图像 return cropImgdef warp(img,p1,p2): M = cv2.getAffineTransform(p1, p2)#以变化前后的三个点来计算仿射变换矩阵(应该是的) dst = cv2.warpAffine(thresh2, M, (cols, rows))#根据变换矩阵完成插值 _, dst = cv2.threshold(dst, 127, 255, cv2.THRESH_BINARY_INV)#仿射变换之后吧黑底白图转换成白底黑图 return dstfile_path = './yuanshi/' save_path = './aug/' i = 0for item in os.listdir(file_path): img_name = file_path+item img = cv2.imread(img_name) GrayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度图_,binay = cv2.threshold(GrayImage,127,255,cv2.THRESH_BINARY) #二值化 img_128 = cv2.resize(binay,(128,128)) test = cv2.copyMakeBorder(img_128,64,64,64,64,borderType=cv2.BORDER_CONSTANT,value=https://www.it610.com/article/(255,255,255)) #缩小一倍,并填充到原来大小 save_name1 = save_path+str(i)+'.jpg' cv2.imwrite(save_name1, test) i += 1img_300= cv2.resize(binay,(300,300)) #放大 test_300 = center_crop(img_300) save_name2 = save_path + str(i) + '.jpg' cv2.imwrite(save_name2, test_300) i += 1img_flip = cv2.flip(binay,1) #翻转 save_name3 = save_path+str(i)+'.jpg' cv2.imwrite(save_name3, img_flip) i += 1ret,thresh2=cv2.threshold(GrayImage,127,255,cv2.THRESH_BINARY_INV) #反向二值化 rows, cols, channels = img.shape p1 = np.float32([[0,0], [cols-1,0], [0,rows-1]])p2 = np.float32([[(cols-1)/4,0],[3*(cols-1)/4,0],[(cols-1)/4,rows-1]])#纵向压缩 p3 = np.float32([[(cols-1)/6,0],[5*(cols-1)/6,0],[(cols-1)/6,rows-1]])p4 = np.float32([[0,(rows-1)/4],[cols-1,(rows-1)/4],[0,3*(rows-1)/4]])#横向压缩 p5 = np.float32([[0,(rows-1)/6],[cols-1,(rows-1)/6],[0,3*(rows-1)/6]])p6 = np.float32([[0,rows*0.3], [cols*0.8,rows*0.2], [cols*0.15,rows*0.7]])#随机变形 p7 = np.float32([[0,rows*0.2], [cols*0.7,rows*0.3], [cols*0.2,rows*0.8]])p8 = np.float32([[0,rows*0.15], [cols*0.6,rows*0.15], [cols*0.3,rows*0.6]])img_w2 = warp(thresh2,p1,p2) img_w3 = warp(thresh2,p1,p3) img_w4 = warp(thresh2,p1,p4) img_w5 = warp(thresh2,p1,p5) img_w6 = warp(thresh2,p1,p6) img_w7 = warp(thresh2,p1,p7) img_w8 = warp(thresh2,p1,p8)save_name4 = save_path + str(i) + '.jpg' cv2.imwrite(save_name4, img_w2) i += 1 save_name5 = save_path + str(i) + '.jpg' cv2.imwrite(save_name5, img_w3) i += 1 save_name6 = save_path + str(i) + '.jpg' cv2.imwrite(save_name6, img_w4) i += 1 save_name7 = save_path + str(i) + '.jpg' cv2.imwrite(save_name7, img_w5) i += 1 save_name8 = save_path + str(i) + '.jpg' cv2.imwrite(save_name8, img_w6) i += 1 save_name9 = save_path + str(i) + '.jpg' cv2.imwrite(save_name9, img_w7) i += 1 save_name10 = save_path + str(i) + '.jpg' cv2.imwrite(save_name10, img_w8) i += 1# # cv2.imshow('original', binay) # cv2.imshow('result2', img_w2) # cv2.imshow('result3', img_w3) # cv2.imshow('result4', img_w4) # cv2.imshow('result5', img_w5) # cv2.imshow('result6', img_w6) # cv2.imshow('result7', img_w7) # cv2.imshow('result8', img_w8) # cv2.waitKey(0) #


【opencv进行图像数据增广2021-03-19】
展示结果 opencv进行图像数据增广2021-03-19
文章图片
原始
opencv进行图像数据增广2021-03-19
文章图片
增广结果

    推荐阅读