通常拍摄的一组数据集,图片命名会比较长,不方便人眼查看;
可以按照制定规则重命名,比如统一以8位长度的数字命名
在这里插入图片描述

1 图片批量重命名、格式转换

batch_rename.py

import os
import cv2
import shutil

# convert_format # 图片格式转换标志,默认为jpg不转换;如果转换其他格式,这里设为True
def renane(path_in,path_out,convert_format = False):
    file_in = os.listdir(path_in)      #返回文件夹包含的所有文件名
    num_file_in = len(file_in)          #获取文件数目

    for i in range(num_file_in):
    	#重命名并转换格式
        if convert_format: 
            # 方法一:原文件直接改后缀 (快,简单粗暴,图片只改了后缀,并未转换格式,有时可能会出错)
            #new_name = os.rename(path_in+"/"+file_in[i],path_in+"/"+'%08d.' % i + format)
            #方法二:读取图片后,以新的格式重新保存 (慢,稳妥)
            img = cv2.imread(os.path.join(path_in, file_in[i]))
            cv2.imwrite(os.path.join(path_out, '%08d.' % i + format), img) # 统一命名为8位数字格式 ,设置对应的图片后缀名
		
		#件重命名
        else:
            #原文件重命名
            new_name = os.rename(path_in+"/"+file_in[i],path_in+"/"+'%08d.jpg' % i)
            #复制到新路径下,并重命名
            #shutil.copyfile(os.path.join(path_in, file_in[i]), os.path.join(path_out, '%08d.jpg' % i))    

if __name__ == '__main__':
    #待批量重命名的文件夹
    path_in = "D:\Code\image2"    
    path_out = "D:\Code\image3"
    format = "png"     #重命名后的文件名后缀
    renane(path_in,path_out,convert_format = True)

在这里插入图片描述

2 注意事项

1 图片格式换换(换后缀)

方法一:原文件直接改后缀 (快,简单粗暴,图片只改了后缀,并未转换格式,有时可能会出错)

new_name = os.rename(path_in+"/"+file_in[i],path_in+"/"+'%08d.' % i + format)

方法二:读取图片后,以新的格式重新保存 (慢,稳妥)

img = cv2.imread(os.path.join(path_in, file_in[i]))
cv2.imwrite(os.path.join(path_out, '%08d.' % i + format), img) # 统一命名为8位数字格式 ,设置对应的图片后缀名

2 重命名

重命名有以下两种方法,但不建议使用 cv2.imwrite(读取图片后,重新保存),这种就算你图片后缀名没变,重新写入后,图片的字节数大小会变。

原文件重命名

   new_name = os.rename(path_in+"/"+file_in[i],path_in+"/"+'%08d.jpg' % i)  

复制到新路径下,并重命名

 shutil.copyfile(os.path.join(path_in, file_in[i]), os.path.join(path_out, '%08d.jpg' % i))  

3 bash 参数接口

在一个项目里面,有时更改参数会比较麻烦,需要借助argparse函数设置参数接口

batch_rename_2.py

import os
import argparse
import cv2
import shutil
import sys
from typing import Any

# 打印参数列表
def print_args(args: Any) -> None:
    """Utilities to print arguments

    Arsg:
        args: arguments to pring out
    """
    print("################################  args  ################################")
    for k, v in args.__dict__.items():
        print("{0: <10}\t{1: <30}\t{2: <20}".format(k, str(v), str(type(v))))
    print("########################################################################")

# 设置参数
parser = argparse.ArgumentParser(description='Image batch rename or format conversion')
parser.add_argument('--path_in', default='D:\Code\image2') 
parser.add_argument('--path_out', default='D:\Code\image3') 
parser.add_argument('--convert_format',  default=False, help='If set, convert image to jpg format.') # 如果图像输入不是jpg格式,设为TRUE,转换为jpg格式
parser.add_argument('--format',default='jpg') # 设置要转换的格式,默认转换为jpg格式

# parser arguments and check 打印参数
args = parser.parse_args()
print("argv:",sys.argv[1:])
print_args(args)

# convert_format # 图片格式转换标志,默认为jpg不转换;如果转换其他格式,这里设为True
def renane():
    file_in = os.listdir(args.path_in)      #返回文件夹包含的所有文件名
    num_file_in = len(file_in)          #获取文件数目

    for i in range(num_file_in):
        if args.convert_format: #重命名并转换格式
            # 方法一:原文件直接改后缀 (快,简单粗暴,图片只改了后缀,并未转换格式,有时可能会出错)
            #new_name = os.rename(args.path_in+"/"+file_in[i],args.path_in+"/"+'%08d.' % i + args.format)
            #方法二:读取图片后,以新的格式重新保存 (慢,稳妥)
            img = cv2.imread(os.path.join(args.path_in, file_in[i]))
            cv2.imwrite(os.path.join(args.path_out, '%08d.' % i + args.format), img) # 统一命名为8位数字格式 ,设置对应的图片后缀名
        else:
            #原文件重命名
            new_name = os.rename(args.path_in+"/"+file_in[i],args.path_in+"/"+'%08d.jpg' % i)
            #复制到新路径下,并重命名
            #shutil.copyfile(os.path.join(args.path_in, file_in[i]), os.path.join(args.path_out, '%08d.jpg' % i))    

# 运行当前文件,会执行'__main__',如果在其他文件调用,则不会执行'__main__'
if __name__ == '__main__':
    renane()
    print("it's OK")

run.sh
设置运行时的输入参数

# Image batch rename or format conversion
python batch_rename_2.py\
--path_in='D:/Code/image2'\
--path_out='D:/Code/image3'\
--convert_format=False\
--format='jpg'

此程序,如果运行batch_rename_2.py文件,会执行’main’,此时使用默认参数,或者__main__中提供的参数。

如果,在run.sh文件中调用,则不会执行’main’,输入参数也是使用run.sh中设置的参数。

4 去掉图片名称汉字前缀

在这里插入图片描述
split_str.py

import os
import string

if __name__ == '__main__':
  
    path_in = "D:\Code\image2"    
    path_out = "D:\Code\image3"

    file_in = os.listdir(path_in)       #返回文件夹包含的所有文件名
    num_file_in = len(file_in)          #获取文件数目
    
    #去掉图片名称汉字前缀,(图片原名有汉字前缀,下面img.shape会报错)
    for j in file_in:
        new_name = j.split("_")[1]
        #原文件重命名,输入输出路径都用path_in
        #重命名后保存到path_out路径(此时,path_in中的文件没了,相当于被剪切到新路径)
        reName = os.rename(path_in+"/"+j,path_out+"/"+new_name) 

在这里插入图片描述

5 批量打标签

在这里插入图片描述
batch_label.py

import os
import cv2
import numpy as np
import shutil

if __name__ == '__main__':
  
    path_in = "D:\Code\image2"    
    path_out = "D:\Code\image3"

    file_in = os.listdir(path_in)       #返回文件夹包含的所有文件名
    num_file_in = len(file_in)          #获取文件数目
    
    #如果,图片名称中有汉字前缀,要先去掉,否则下面img.shape会报错
    #批量图片上写序号
    for i in range(num_file_in):
        
        text = "{}".format(i)
        name = "{}".format(file_in[i])
        img = cv2.imread(os.path.join(path_in, file_in[i]))
    
        #print(img.shape[:2])
        cv2.putText(img,text,(100,img.shape[0]-100),fontFace=cv2.FONT_HERSHEY_TRIPLEX, fontScale=100,color=(0,0,255),thickness=30)
        cv2.imwrite(os.path.join(path_out,name), img) 

在这里插入图片描述

6 验证每次操作图片处理的顺序是否一致

文件夹下的图片,已经都打上了序号标签;
现在将图片重命名,比如统一以8位长度的数字命名;
看重命名的顺序和序号标签的额顺序是否一致;
在这里插入图片描述
batch_rename.py

import os
import cv2
import shutil

# convert_format # 图片格式转换标志,默认为jpg不转换;如果转换其他格式,这里设为True
def reNane(path_in,path_out,convert_format = False):
    file_in = os.listdir(path_in)      #返回文件夹包含的所有文件名
    num_file_in = len(file_in)          #获取文件数目

    for i in range(num_file_in):
        if convert_format: #重命名并转换格式
            # 方法一:原文件直接改后缀 (快,简单粗暴,图片只改了后缀,并未转换格式,有时可能会出错)
            #new_name = os.rename(path_in+"/"+file_in[i],path_in+"/"+'%08d.' % i + format)
            #方法二:读取图片后,以新的格式重新保存 (慢,稳妥)
            img = cv2.imread(os.path.join(path_in, file_in[i]))
            cv2.imwrite(os.path.join(path_out, '%08d.' % i + format), img) # 统一命名为8位数字格式 ,设置对应的图片后缀名
        else:
            #原文件重命名
            new_name = os.rename(path_in+"/"+file_in[i],path_in+"/"+'%08d.jpg' % i)
            #复制到新路径下,并重命名
            #shutil.copyfile(os.path.join(path_in, file_in[i]), os.path.join(path_out, '%08d.jpg' % i))    

if __name__ == '__main__':
    #待批量重命名的文件夹
    path_in = "D:\Code\image3"    
    path_out = "D:\Code\image3"
    format = "png"  #重命名后的文件名后缀
    reNane(path_in,path_out,convert_format = False)

完全一致
在这里插入图片描述

7 源码下载

python图片批量重命名、格式转换、打标签、名字前缀分割 源码

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐