最近在做剪纸图案的生成,但是特定风格的剪纸图案很少,采用数据增广的方式进行扩充。一般数据增广有以下几个方面
翻转变换 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 cropImg
def 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 dst
file_path = './yuanshi/'
save_path = './aug/'
i = 0
for 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=(255,255,255)) #缩小一倍,并填充到原来大小
save_name1 = save_path+str(i)+'.jpg'
cv2.imwrite(save_name1, test)
i += 1
img_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 += 1
img_flip = cv2.flip(binay,1) #翻转
save_name3 = save_path+str(i)+'.jpg'
cv2.imwrite(save_name3, img_flip)
i += 1
ret,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)
#
展示结果