Python将相同尺寸的图片和xml标签按比例缩放

运行环境:python3.5+
需要安装一下opencv,如果有anaconda,执行conda install opencv-python
这个脚本适用于原来都是同一尺寸的图片,如果不一致,请参考本人另一篇博客。

# *_* coding : UTF-8 *_*
# 开发人员: csu·pan-_-||
# 开发时间: 2020/11/24 19:42
# 文件名称: resize_img_xml.py
# 开发工具: PyCharm
# 功能描述: 按比例缩放图像,同时修改xml文件
#           适用于原来就都是相同尺寸的图片
#           如果原来尺寸不统一,请参考本人的另一篇博客

import os
import cv2
import xml.etree.ElementTree as ET

path = r'E:\Projects\640x640'         # 原文件夹路径
newpath = r'E:\Projects\1280x1280'    # 新文件夹路径
ratio = 2

def edit_xml(xml_file,ratio,i):
    """
    修改xml文件
    :param xml_file:xml文件的路径
    :return:
    """
    all_xml_file = os.path.join(path, xml_file)
    tree = ET.parse(all_xml_file)
    # 修改xml里的图像宽高:
    obj_size = tree.find('size')
    obj_width = obj_size.find('width')
    obj_hight = obj_size.find('height')
    width = int(obj_width.text)
    hight = int(obj_hight.text)
    obj_width.text = str(round(width * ratio))
    obj_hight.text = str(round(hight * ratio))
    # 修改xml里的目标位置:
    objs = tree.findall('object')
    for ix, obj in enumerate(objs):
        obj_bnd = obj.find('bndbox')
        obj_xmin = obj_bnd.find('xmin')
        obj_ymin = obj_bnd.find('ymin')
        obj_xmax = obj_bnd.find('xmax')
        obj_ymax = obj_bnd.find('ymax')
        xmin = float(obj_xmin.text)
        ymin = float(obj_ymin.text)
        xmax = float(obj_xmax.text)
        ymax = float(obj_ymax.text)
        obj_xmin.text = str(round(xmin * ratio))
        obj_ymin.text = str(round(ymin * ratio))
        obj_xmax.text = str(round(xmax * ratio))
        obj_ymax.text = str(round(ymax * ratio))

    newfile = os.path.join(newpath, '%05d'% (0 + (i+1)/2)+'.xml')
    tree.write(newfile, method='xml', encoding='utf-8')  # 更新xml文件

if __name__ == '__main__':
    files = os.listdir(path)              # 获取文件名列表
    for i, file in enumerate(files):
        if file.endswith('.jpg'):
            imgName = os.path.join(path, file)         # 获取文件完整路径
            xml_file = file.replace('.jpg','.xml')
            img = cv2.imread(imgName)                  # 读图
            # 按比例缩放图像:
            # 当参数dsize不为0时,dst的大小为size;否则,它的大小需要根据src的大小、参数fx和fy决定
            imgcrop = cv2.resize(img, (0, 0), fx=ratio, fy=ratio)
            # 修改xml文件
            edit_xml(xml_file, ratio, i)
            # 设置新的文件名并存储图像:
            newName = os.path.join(newpath, '%05d' % (0 + (i+1)/2) + '.jpg')
            print(newName)
            cv2.imwrite(newName, imgcrop)  # 存储按新文件名命令的图片
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值