import os
from PIL import Image
import platform
import xml.dom.minidom
class HandleXmlImage:
def get_file_path(self, dir_file):
self.system_version = platform.platform()
file_name_list = os.listdir(dir_file)
for file_name in file_name_list:
if 'Windows' in self.system_version:
file_path = dir_file + f'\\{file_name}'
else:
file_path = dir_file + f'/{file_name}'
yield file_path, file_name
def updage_Image(self, file_path, number_after_change_height, file_name, dir_file):
img = Image.open(file_path)
height, width = img.size
scale = number_after_change_height / height
height = number_after_change_height
width = int(width * scale)
new_img = img.resize((width, height), Image.ANTIALIAS)
new_path = dir_file + '_new'
if not os.path.exists(new_path):
os.makedirs(new_path)
if 'Windows' in self.system_version:
new_file = new_path + f'\\{file_name}'
else:
new_file = new_path + f'/{file_name}'
new_img.save(new_file, 'JPEG')
return scale, height, width
def updata_xml(self, file_path, scale, height, width, file_name, dir_file):
self.system_version = 'Window'
dom = xml.dom.minidom.parse(file_path)
root = dom.documentElement
size_object = root.getElementsByTagName("size")[0]
size_object.getElementsByTagName('height')[0].firstChild.data = height
size_object.getElementsByTagName('width')[0].firstChild.data = width
bndbox_object = root.getElementsByTagName("bndbox")[0]
bndbox_object.getElementsByTagName('xmin')[0].firstChild.data = float(
bndbox_object.getElementsByTagName('xmin')[0].firstChild.data) * scale
bndbox_object.getElementsByTagName('ymin')[0].firstChild.data = float(
bndbox_object.getElementsByTagName('ymin')[0].firstChild.data) * scale
bndbox_object.getElementsByTagName('xmax')[0].firstChild.data = float(
bndbox_object.getElementsByTagName('xmax')[0].firstChild.data) * scale
bndbox_object.getElementsByTagName('ymax')[0].firstChild.data = float(
bndbox_object.getElementsByTagName('ymax')[0].firstChild.data) * scale
new_path = dir_file + '_new'
if not os.path.exists(new_path):
os.makedirs(new_path)
if 'Windows' in self.system_version:
new_file = new_path + f'\\{file_name}'
else:
new_file = new_path + f'/{file_name}'
with open(new_file, 'w', encoding='utf8') as f:
dom.writexml(f, addindent=' ', encoding='utf8')
def run(self, xml_path, image_path, number_after_change_height):
xml_range = self.get_file_path(xml_path)
image_list = list(self.get_file_path(image_path))
for index, xml_data in enumerate(xml_range):
xml_file_path, xml_file_name = xml_data
image_file_path, image_file_name = image_list[index]
print(image_file_name, image_file_path)
scale, height, width = self.updage_Image(image_file_path, number_after_change_height, image_file_name,
image_path)
print(scale, height, width)
self.updata_xml(xml_file_path, scale, height, width, xml_file_name, xml_path)
if __name__ == '__main__':
xml_path = input('请输入xml文件夹路径>>>:')
image_path = input('请输入image文件夹路径>>>:')
number_after_change_height = int(input("请输入改变后高度>>>:"))
HandleXmlImage().run(xml_path, image_path, number_after_change_height)
目标检测VOC数据集:用PIL实现xml和图片的同步缩放
最新推荐文章于 2023-02-11 17:39:45 发布