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) # 调用函数