Python-复制文件、图片格式转换、修改图片名称、区分近红外和RGB图像

实习中遇到的问题,对收集到的人脸图片文件进行一些处理方便后续使用。

有2万多个文件夹,每个文件夹有若干张图片,含近红外和RGB图片。
需要做的步骤是:

  1. 将所有文件夹内的图片放到一个文件夹里
  2. 把所有近红外IR图像挑选出来放到一个新文件夹里
  3. 将IR图像的 png 转换成 jpg
  4. 根据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()

展示一个小例子,程序效果就是下面这个样子的啦




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值