cyclegan——数据处理

1.生成mask模型(只保留人脸区域)

# -*- coding:utf-8 -*-
import os
import cv2

root_path='data2/'
save_path='data2/cut/'
files=os.listdir(root_path)
for file in files:
	if file.find('face') !=-1:
		filesplit=file.split('_face')[0]
		filename1=filesplit+'_face.bmp'
		filename2=filesplit+'_mask.bmp'
		filename3=filesplit+'.jpg'
		print(filename2)
		faceImg = cv2.imread(root_path+filename1)
		maskImg = cv2.imread(root_path+filename2)
		skinImg = cv2.bitwise_and(faceImg,maskImg)
		cv2.imwrite(save_path+filename3,skinImg)

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

2.mask模型切片(切成小块进行训练)

from PIL import Image
import os

def mkdir(path):
        folder=os.path.exists(path)
        if not folder:
          os.makedirs(path)

path='data2/1/'
save_path='data2/cut/'
n=0
files=os.listdir(path)
for file in files:
    print(file)
    n=n+1
    folder=str(n)+'-'+file
    mkdir(save_path+folder)

    im = Image.open(path+file)
    img_size = im.size

    x = 16
    y = 24
    # width = img_size[0] // x
    # height = img_size[1] // y
    width=100
    height=100

    #横向切割,先切第一行6块,再切第2行6块······
    for j in range(y):
        for i in range(x):
            g = i + j * x
            left = i*width
            up = j*height
            right = left + width
            low = up + height
            region = im.crop((left,up,right,low))

            temp = str(j+1)+'-'+str(i+1)
            region.save(save_path+folder+'/'+str(g)+".jpg")


å¨è¿éæå¥å¾çæè¿°

3.做肤色均匀(把生成后的图片肤色还原)

# -*- coding:utf-8 -*-
import cv2
import os

def get_avg(list5):
    if len(list5)==0:
        avg=0;
    else:
        avg = float(sum(list5)) / len(list5)
    return avg

def get_rgb(img1,img2,x,y):
    size = img1.shape
    width = int(size[0] / x)
    height = int(size[1] / y)
    list_avg_b = []
    list_avg_g = []
    list_avg_r = []
    for m in range(y):
        for n in range(x):
            list_b = []
            list_g = []
            list_r = []
            for i in range(0, width):  # 遍历所有长度的点
                for j in range(0, height):  # 遍历所有宽度的点
                    if img1[i + n * width, j + m * height][2] < 230:
                        if img1[i, j][2] > 20 and img1[i, j][1] > 20 and img1[i, j][0] > 20:
                            b = img2[i+n*width, j+m*height][0]
                            g = img2[i+n*width, j+m*height][1]
                            r = img2[i+n*width, j+m*height][2]
                            list_b.append(b)
                            list_g.append(g)
                            list_r.append(r)
            avg_b = '%.2f' % get_avg(list_b)
            avg_g = '%.2f' % get_avg(list_g)
            avg_r = '%.2f' % get_avg(list_r)
            list_avg_b.append(avg_b)
            list_avg_g.append(avg_g)
            list_avg_r.append(avg_r)
    return list_avg_b, list_avg_g, list_avg_r

def change_rgb(img1,img2,save_path,bgr1,bgr2,x,y):
    size = img1.shape
    width = int(size[0] / x)
    height = int(size[1] / y)
    for m in range(y):
        for n in range(x):
            g=n+m*x
            # 计算差距
            dif_b = float(bgr1[0][g]) - float(bgr2[0][g])
            dif_g = float(bgr1[1][g]) - float(bgr2[1][g])
            dif_r = float(bgr1[2][g]) - float(bgr2[2][g])
            for i in range(0, width):  # 遍历所有长度的点
                for j in range(0, height):  # 遍历所有宽度的点
                    if img2[i+n*width, j+m*height][2] <230:
                        img2[i + n * width, j + m * height][0] += dif_b
                        img2[i + n * width, j + m * height][1] += dif_g
                        img2[i + n * width, j + m * height][2] += dif_r
                    if img1[i + n * width, j + m * height][0] < 20 or img1[i + n * width, j + m * height][1] < 20 or \
                        img1[i + n * width, j + m * height][2] < 20:
                        img2[i + n * width, j + m * height][0] = img1[i + n * width, j + m * height][0]
                        img2[i + n * width, j + m * height][1] = img1[i + n * width, j + m * height][1]
                        img2[i + n * width, j + m * height][2] = img1[i + n * width, j + m * height][2]

                    # if j==255 or j==5:
                    #     for q in range(6):
                    #         img2[i + n * width, j + m * height-5+q][0] = img1[i + n * width, j + m * height-5+q][0]
                    #         img2[i + n * width, j + m * height-5+q][1] = img1[i + n * width, j + m * height-5+q][1]
                    #         img2[i + n * width, j + m * height-5+q][2] = img1[i + n * width, j + m * height-5+q][2]
                    # if i==255 or i==5:
                    #     for q in range(6):
                    #         img2[i + n * width-5+q, j + m * height][0] = img1[i + n * width-5+q, j + m * height][0]
                    #         img2[i + n * width-5+q, j + m * height][1] = img1[i + n * width-5+q, j + m * height][1]
                    #         img2[i + n * width-5+q, j + m * height][2] = img1[i + n * width-5+q, j + m * height][2]
    cv2.imwrite(save_path, img2)

x=1
y=1
path1='img/256/'   #遍历的路径
files1 = os.listdir(path1)
path2='img/256-1/'   #遍历的路径
path3='img/256-3/'
files2 = os.listdir(path2)
lens=len(files1)
list1=[]
list2=[]
for file in files1:
    if file.endswith('jpg'):
        pic1=path1+file
        list1.append(pic1)
for file in files2:
    if file.endswith('jpg'):
        pic2 = path2 + file
        list2.append(pic2)

for i in range(lens):
    pic1=list1[i]
    pic2=list2[i]
    print(pic1)
    # 读取图片,计算bgr
    img1 = cv2.imread(pic1, cv2.IMREAD_UNCHANGED)
    bgr1 = get_rgb(img1,img1,x,y)
    img2 = cv2.imread(pic2, cv2.IMREAD_UNCHANGED)
    bgr2 = get_rgb(img1,img2,x,y)

    name=pic1.split('/')[-1]
    save_path = path3+name
    change_rgb(img1,img2,save_path,bgr1,bgr2,x,y)

4.图像拼接(把生成后的图片拼接回来)

import PIL.Image as Image
import os


# 定义图像拼接函数
def image_compose(file_path,save_path):
    new_img = Image.new('RGB', (col * img_size, row * img_size))  # 创建一个新图
    # 循环遍历,把每张图片按顺序粘贴到对应位置上
    for y in range(1, row + 1):
        for x in range(1, col + 1):
            from_image = Image.open(file_path + img[col * (y - 1) + x - 1]).resize((img_size, img_size),
                                                                                   Image.ANTIALIAS)
            new_img.paste(from_image, ((x - 1) * img_size, (y - 1) * img_size))
    return new_img.save(save_path + 'a5.jpg')  # 保存新图


path = 'data2/cut/gg/'
save_path = 'data2/cut/'  # 图片转换后的地址
img_size = 256  # 每张小图片的大小
row = 9  # 图片间隔,也就是合并成一张图后,一共有几行
col = 6  # 图片间隔,也就是合并成一张图后,一共有几列

# 获取图片集地址下的所有图片名称
# for root, dirs, files in os.walk(path):
#     n = 0
#     for dir in dirs:
#         n = n + 1
#         img = []
#         file_path = path + dir + '/'
files = os.listdir(path)
files.sort(key=lambda x: int(x.split('.')[0]))  # 按自然数顺序排序
img=[]
for file in files:
    img.append(file)
print(img)

# 简单的对于参数的设定和实际图片集的大小进行数量判断
if len(img) != row * col:
    raise ValueError("合成图片的参数和要求的数量不能匹配!")

image_compose(path,save_path)  # 调用函数

猜你喜欢

转载自blog.csdn.net/gm_Ergou/article/details/93767033
今日推荐