python图片批量重命名、格式转换、打标签、名字前缀分割
通常拍摄的一组数据集,图片命名会比较长,不方便人眼查看;可以按照制定规则重命名,比如统一以8位长度的数字命名。
通常拍摄的一组数据集,图片命名会比较长,不方便人眼查看;
可以按照制定规则重命名,比如统一以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 源码下载
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)