在训练时,有时候需要将jpg格式转换为png格式,顺便也要把jpg标注的xml文件转换为png的xml文件。例如,需要把xml文件中的图像后缀名“.jpg”批量去掉,这时候就需要批量修改Xml中的属性了。
比如:修改之前的文件:
修改后:
import os
import os.path
import xml.dom.minidom
path="E:\python_summary\image_ano\Ano"
files=os.listdir(path)#返回文件夹中的文件名列表
#print(files)
s=[]
count=0
for xmlFile in files:
if not os.path.isdir(xmlFile):#os.path.isdir()用于判断对象是否为一个目录
#如果不是目录,则直接打开
name1=xmlFile.split('.')[0]
print(name1)
dom=xml.dom.minidom.parse(path+'\\'+xmlFile)
#print(dom)
root=dom.documentElement
newfolder=root.getElementsByTagName('folder')
#print(newfolder)
newpath = root.getElementsByTagName('path')
newfilename = root.getElementsByTagName('filename')
newfilename[0].firstChild.data = name1
with open(os.path.join(path, xmlFile), 'w') as fh:
dom.writexml(fh)
#print('写入name/pose OK!')
count = count + 1
【图像jpg格式批量转换为png格式技巧】
(1)、首先在你放图片的文件夹里新建一个记事本文件,取名为“图片批量转化”。要注意的一点就是,里面的图片要统一为一种格式。
(2)、如果想将jpg格式批量转化为png格式,那么就在刚才新建的记事本文档里输入“ren *.jpg *.png”。举一反三可知,如果是将png格式转化为jpg,那么就该这样写“ren *.png *.jpg”。这里要强调的一点就是,“ren”与“png”之后要加有一个空格。记事本文档保存后,将后缀名修改为“bat”。
(3)、最后一步就是双击“bat”后缀的这个文件,它会自动弹出一个窗口,不用管它,等几秒后自动消失,然后就发现所有的图片格式都变成我们想要的png格式了。
【补充】
XML中的一些属性,比如bndbox中的xmin,ymin,xmax,ymax这四个值,在标记时,如果这些值为负数或者小数,要把他们转换为整数或者不能超越图像边界的值,这时候就需要批量修改。
修改时要注意每个Xml中的这四个值有多个对,也即是每幅图像可能有多个目标,从而对应的bndbox也有多个。
# coding=utf-8
import os
import os.path #批量修改Xml文件中的属性值
import xml.dom.minidom
#打开xml文档
path='E:\python_summary\Xml_Airpalne'
files=os.listdir(path)#得到文件夹下所有文件名称(存到列表)
#print(files)
for xmlFile in files:#遍历文件夹
if not os.path.isdir(xmlFile):#判断是否是文件夹,不是文件夹才打开
#将获取的xml文件名送入到dom解析
#print(xmlFile)
dom=xml.dom.minidom.parse(os.path.join(path,xmlFile))
root=dom.documentElement
#获取标签对
xmin=root.getElementsByTagName('xmin')
ymin=root.getElementsByTagName('ymin')
xmax=root.getElementsByTagName('xmax')
ymax=root.getElementsByTagName('ymax')
#修改属性值
#xmin
for j in range(len(xmin)):
xmin[j].firstChild.data=int(float(xmin[j].firstChild.data))
if (float(xmin[j].firstChild.data)< 0):
xmin[j].firstChild.data=0
print(xmin[j].firstChild.data)
#ymin
for u in range(len(ymin)):
ymin[u].firstChild.data=int(float(ymin[u].firstChild.data))
if (float(ymin[u].firstChild.data)< 0):
ymin[u].firstChild.data=0
print(ymin[u].firstChild.data)
#xmax
for v in range(len(xmax)):
xmax[v].firstChild.data=int(float(xmax[v].firstChild.data))
if (float(xmax[v].firstChild.data)< 0):
xmax[v].firstChild.data=0
print(xmax[v].firstChild.data)
#ymax
for s in range(len(ymax)):
ymax[s].firstChild.data=int(float(ymax[s].firstChild.data))
if (float( ymax[s].firstChild.data)< 0):
ymax[s].firstChild.data=0
print( ymax[s].firstChild.data)
#保存修改到xml文件中
with open(os.path.join(path,xmlFile),'w') as wn:
dom.writexml(wn)
print("修改完成!")