Python实现BMP图片与XML文件的统一重命名
做深度学习的朋友可能经常遇到,在用LabelImg(或其它标注软件)标注了所有的数据之后,为方便训练,需要重命名。为什么?主要原因在于:
- 在直接选中文件复制的时候,可能遇到命名重复的情况,如果选择两者保留(例如1.bmp与1(2).bmp),可能出现图片与xml对应不上的情况;
- 为了统计,直观查看;
- 可能跟文件夹存在不同深度的子文件夹,甚至文件夹出现重名。
目标1:将桌面上images文件夹中的子文件夹中的所有bmp文件与xml文件,重命名后保存到桌面data文件夹中(剪切功能)。
效果如下:
重命名前
重命名后
Python代码如下:
#!usr/bin/python
# -*- coding:utf-8 -*-
import os
import xml.etree.ElementTree as ET
import xml.dom.minidom
# 获取文件夹中bmp图片的数量
def getDirImageNum(path):
bmpDirImagesNum = 0
for bmpfile in os.listdir(path):
if os.path.splitext(bmpfile)[1] == '.bmp':
bmpDirImagesNum += 1
return bmpDirImagesNum
# 获取文件夹中xml文件的数量
def getDirXmlNum(path):
xmlDirXmlNum = 0
for xmlfile in os.listdir(path):
if os.path.splitext(xmlfile)[1] == '.xml':
xmlDirXmlNum += 1
return xmlDirXmlNum
def rename(inputpath,outpath):
filelist = os.listdir(inputpath) # 获取文件路径
i = getDirImageNum(outpath) # 表示bmp文件的命名是从当前输出文件夹中的bmp文件数目开始的
j = getDirXmlNum(outpath) # 表示xml文件的命名是从当前输出文件夹中的xml文件数目开始的
for item in filelist:
if item.endswith('.bmp'): # 初始的图片的格式为bmp格式的(或者源文件是png格式及其他格式,后面的转换格式就可以调整为自己需要的格式即可)
src = os.path.join(os.path.abspath(inputpath), item) #
dst = os.path.join(os.path.abspath(outpath), '0' + format(str(i), '0>3s') + '.bmp') # 这种情况下的命名格式为0000.bmp形式,可以自主定义想要的格式
try:
os.rename(src, dst)
print ('converting %s to %s ...' % (src, dst))
i = i + 1
except:
continue
if item.endswith('.xml'): #初始的图片的格式为xml格式的
src2 = os.path.join(os.path.abspath(inputpath), item)
dst2 = os.path.join(os.path.abspath(outpath), '0' + format(str(j), '0>3s') + '.xml') # 这种情况下的命名格式为0000.xml形式,可以自主定义想要的格式
try:
# 读取xml文件
dom = xml.dom.minidom.parse(src2)
root = dom.documentElement
# 获取标签对path之间的值并赋予新值j
root.getElementsByTagName('path')[0].firstChild.data = dst2
# 获取标签对filename之间的值并赋予新值j
root.getElementsByTagName('filename')[0].firstChild.data = '0' + format(str(j), '0>3s') + '.xml'
# 将修改后的xml文件保存,xml文件修改前后的路径
# 打开并写入
with open(src2, 'w') as fh:
dom.writexml(fh)
os.rename(src2, dst2)
print ('converting %s to %s ...' % (src2, dst2))
j = j + 1
except:
continue
if __name__ == '__main__':
inputPath = 'C:\\Users\\Zhangwei\\Desktop\\images' # 表示需要命名处理的文件夹
outPath = 'C:\\Users\\Zhangwei\\Desktop\\data' # 表示重命名后输出的文件夹
for root, dirs, files in os.walk(inputPath):
for file in files:
rename(root,outPath)
目标2:如果是自己手动进行标注的轮廓图,将mask与原图进行匹配重命名,期间可能出现部分原图没有mask的现象。
重命名前:
重命名后:
Python代码如下:
#!usr/bin/python
# -*- coding:utf-8 -*-
import os
import xml.etree.ElementTree as ET
import xml.dom.minidom
# 获取文件夹中mask图片的数量
def getmaskDirImagesNum(path):
maskDirImagesNum = 0
for maskfile in os.listdir(path):
if 'mask' in os.path.splitext(maskfile)[0]:
maskDirImagesNum += 1
return maskDirImagesNum
def rename(inputpath,outpath):
filelist = os.listdir(inputpath) # 获取文件路径
i = getmaskDirImagesNum(outpath) # 表示mask文件的命名是从当前输出文件夹中的mask文件数目开始的
# j = getDirXmlNum(outpath) # 表示xml文件的命名是从当前输出文件夹中的xml文件数目开始的
for item in filelist:
if 'mask' in os.path.splitext(item)[0]:
# 初始的图片的格式为bmp格式的(或者源文件是png格式及其他格式,后面的转换格式就可以调整为自己需要的格式即可)
src = os.path.join(os.path.abspath(inputpath), item)
# 这种情况下的命名格式为0000.bmp形式,可以自主定义想要的格式
dst = os.path.join(os.path.abspath(outpath), '0' + format(str(i), '0>3s') + '_mask.bmp')
newStr = os.path.splitext(item)[0][:-5] # 去除'_mask'
newStr2 = newStr + '.bmp'
src2 = os.path.join(os.path.abspath(inputpath), newStr2)
dst2 = os.path.join(os.path.abspath(outpath), '0' + format(str(i), '0>3s') + '.bmp')
try:
os.rename(src, dst)
os.rename(src2, dst2)
print ('converting %s to %s ...' % (src, dst))
i = i + 1
except:
continue
if __name__ == '__main__':
inputPath = r'F:\3_Projects\cerebral_hemorrhage\0_data\Images' # 表示需要命名处理的文件夹
outPath = r'F:\3_Projects\cerebral_hemorrhage\0_data\data2' # 表示重命名后输出的文件夹
for root, dirs, files in os.walk(inputPath):
for file in files:
rename(root,outPath)
当中结合matlab的部分代码如下:
clc;clear all;close all;
%% 将mask的图片转为二值图
inputDir = 'data2';
maskFileLists = dir(strcat(inputDir,'\*','_mask','.bmp'));
maskFileNum = length(maskFileLists);
for i = 3:maskFileNum
imgname = maskFileLists(i).name;
img = imread(strcat(inputDir,'\',imgname));
[m, n] = size(img);
mask = zeros(m, n);
for ii = 1:m
for jj=1:n
if img(ii,jj)==85
mask(ii,jj) = 1;
end
end
end
mask = medfilt2(mask,[3,3]);
imwrite(mask,strcat(inputDir,'\',imgname));
end
参考博客: