实习中遇到的问题,对收集到的人脸图片文件进行一些处理方便后续使用。
有2万多个文件夹,每个文件夹有若干张图片,含近红外和RGB图片。
需要做的步骤是:
- 将所有文件夹内的图片放到一个文件夹里
- 把所有近红外IR图像挑选出来放到一个新文件夹里
- 将IR图像的 png 转换成 jpg
- 根据IR图片数量,按照001,002,003…重新命名图片名称
【note】:在区分 IR 图像和 RGB 图像时,可以先看看IR图像的 shape,看看它是几通道的,若是1个通道,可以直接用通道数来区分 IR 和 RGB;若是3通道,则 IR 每个通道对应像素的值都是一样的,就可以拆分图像通道,根据通道值是否相同来区分 IR 和 RGB。
下面是上述4个步骤的程序
import os
import shutil
import cv2
#将多个文件夹下图片拷贝到一个文件夹中
def CopyFile(raw_path, save_path):
root, dirs, files = next(os.walk(raw_path))
for dir in dirs:
apath = os.path.join(root, dir)
files = os.listdir(apath)
for file in files:
apath1 = os.path.join(apath, file)
shutil.copy(apath1, save_path)
print('Copy Succeeded')
#将文件夹中的图片进行筛选,把ir图片放到其他文件夹里
def DifferPic(path, path1):
# 获取一个文件夹下每张图片的路径,存到list中
list = []
root, _, files = next(os.walk(path))
for i in range(len(files)):
line = path + '/' + str(files[i])
list.append(line)
# 读取图片,拆分通道,判断是否是近红外
for i in range(len(list)):
image = cv2.imread(list[i])
b, g, r = cv2.split(image)
same1 = (b == g).all()
same2 = (g == r).all()
if same1 == True and same2 == True:
with open('./ir.txt', 'a') as f:
f.write(str(list[i]) + '\n')
shutil.copy(list[i], path1)
print('Near infrared images have been selected')
#png转换成jpg,并和原jpg图片一起保存到另一个文件夹里
def PngToJpg(png_path, jpg_path):
for filename in os.listdir(png_path):
if os.path.splitext(filename)[1] == '.png':
img = cv2.imread(png_path + '/' + filename)
newfilename = filename.replace('.png', '.jpg')
# cv2.imshow("Image",img)
# cv2.waitKey(0)
cv2.imwrite(png_path + '/' + newfilename, img)
shutil.copy(png_path + '/' + newfilename, jpg_path)
else:
shutil.copy(png_path + '/' + filename, jpg_path)
print('Format Conversion Successful')
#修改图片名称
def NewName(path):
index = 1
for img in os.listdir(path):
if img != '.DS_Store': # 这一句hin重要,是个隐藏文件.......
name = os.path.splitext(img) # os.path.splitext将文件名拆分为名字和后缀名,可以打印出来看一下
destfile = path + '/' + "%03d" % (index) + name[1] # 根据目录下具体的文件数修改%号后的值,"%04d"最多支持9999
srcfile = os.path.join(path, img)
os.rename(srcfile, destfile)
index += 1
print('Name change completed')
def main():
raw_pic = '/home/me/test'
save_pic = '/home/me/test_save'
ir_path = '/home/me/test_ir'
irjpg_path = '/home/me/test_irjpg'
CopyFile(raw_pic, save_pic)
DifferPic(save_pic, ir_path)
PngToJpg(ir_path, irjpg_path)
NewName(irjpg_path)
if __name__ == '__main__':
main()
展示一个小例子,程序效果就是下面这个样子的啦