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 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)
    #

展示结果
opencv进行图像数据增广2021-03-19_第1张图片
原始

opencv进行图像数据增广2021-03-19_第2张图片
增广结果

你可能感兴趣的:(opencv进行图像数据增广2021-03-19)