import os
import numpy as np
from PIL import Image
from PIL import ImageEnhance
import random
import cv2
def parseLines(line):
if len(line) == 0:
return
words = line.split(' ')
inputimage = words[0]
points = np.zeros((10,))
points[0]=float(words[1]) #x0
points[1]=float(words[2]) #x1
points[2]=float(words[3]) #x2
points[3]=float(words[4]) #x3
points[4]=float(words[5]) #x4
points[5]=float(words[6]) #y0
points[6]=float(words[7]) #y1
points[7]=float(words[8]) #y2
points[8]=float(words[9]) #y3
points[9]=float(words[10]) #y4
return inputimage, points
def Gaussblur(imgpath, imgname, points, labelfile, gaussNum):
#高斯模糊,高斯核越大,图像越模糊
fid = open(labelfile, 'a') #追加
nickname = imgname.split('.')[0] #去除后缀的图像名
fullpath = imgpath + imgname
img = cv2.imread(fullpath)
for i in range(gaussNum):
scale = random.randrange(3, 7, 2) #高斯核必须是奇数 3 5 7
img_ = cv2.GaussianBlur(img, ksize=(scale, scale), sigmaX=0, sigmaY=0)
fullpath = '{}{}{}{}{}'.format(imgpath, nickname, '_gauss', str(i), '.jpg')
cv2.imwrite(fullpath, img_)
rename = '{}{}{}{}'.format(nickname, '_gauss', str(i), '.jpg')
fid.write(rename + ' ')
for ii in range(10):
fid.write(str(points[ii]) + ' ')
fid.write('\n')
def BrightEnhance(imgpath, imgname, points, labelfile, briNum):
#imgpath:训练图像保存路径
#imgname:训练图像名称,如0.jpg
#points:训练图像关键点,共10个
#labelfile: 标签文件路径
#transNum:亮度变换次数,一般为偶数,变暗transNum/2次,变亮transNum/2次
fid = open(labelfile, 'a') #追加
fullpath = imgpath + imgname
img = Image.open(fullpath)
enh_bri = ImageEnhance.Brightness(img)
count = 0 #用于计数扩充的图片
augNum = int(briNum / 2) #变暗或变亮的图像数量
nickname = imgname.split('.')[0] #去除后缀的图像名
for i in range(augNum):
scale1 = random.uniform(0.3, 0.6)
img_bri = enh_bri.enhance(scale1)
fullpath = '{}{}{}{}{}'.format(imgpath, nickname, '_bright', str(count), '.jpg')
rename = '{}{}{}{}'.format(nickname, '_bright', str(count), '.jpg')
#io.imsave(fullpath, img_bri)
img_bri.save(fullpath)
fid.write(rename + ' ')
for ii in range(10):
fid.write(str(points[ii]) + ' ')
fid.write('\n')
count = count + 1
scale2 = random.uniform(1.5, 1.8)
img_bri = enh_bri.enhance(scale2)
fullpath = '{}{}{}{}{}'.format(imgpath, nickname, '_bright', str(count), '.jpg')
rename = '{}{}{}{}'.format(nickname, '_bright', str(count), '.jpg')
#io.imsave(fullpath, img_bri)
img_bri.save(fullpath)
fid.write(rename + ' ')
for ii in range(10):
fid.write(str(points[ii]) + ' ')
fid.write('\n')
count = count + 1
fid.close()
if __name__ == '__main__':
source_path = 'G:/FacePoints/Transformed_image_rotate/' #训练图片保存路径
filelist = 'G:/FacePoints/Transformed_image_rotate/train_trans.txt' #训练标签路径
newlist = 'G:/FacePoints/Transformed_image_rotate/newlabel.txt' #新生成的图像标签路径
brightNum = 2 # 明暗变换次数。要求为偶数,若2,则变暗一张,变亮一张
gaussNum = 2 # 高斯模糊次数
fs = open(filelist)
lines = fs.readlines()
fs.close()
count = 0
for line in lines:
print('%dth\n', count)
imgname, pts = parseLines(line)
if len(imgname) == 0:
continue
#明暗
BrightEnhance(source_path, imgname, pts, newlist, brightNum)
#模糊
Gaussblur(source_path, imgname, pts, newlist, gaussNum)
count += 1
人脸关键点图像模糊与明暗变化程序。我用的人脸图像大小为40*40,一共检测5个关键点。