同步缩放图像和xml标注文件(等比缩放无失真)

在进行目标检测应用任务中,有时会出现数据提供方提供的图像样本大小杂乱的现象(如下图所示),为了更好地训练,需要对这些图像样本和对应的xml文件进行缩放处理,将图片统一缩放到需要大小。图像尺寸分布
我们采用xml.dom.minidom解析xml标注文件,采用opencv对图像进行resize
具体代码如下:

# -*- coding: utf-8 -*-
# @File  : PreProcessing.py
# @Author: ddmm
# @Date  : 2020/5/25
# @Desc  : 同步缩放图片(等比例缩放无失真)和xml文件标注的anchor size

import glob
import xml.dom.minidom
import cv2


img = cv2.imread("./demo.jpg")
height, width = img.shape[:2]

# 定义缩放信息 以等比例缩放到416为例
scale=416/height
height=416
width=int(width*scale)

dom = xml.dom.minidom.parse("./demo.xml")
root = dom.documentElement

# 读取标注目标框
objects = root.getElementsByTagName("bndbox")

for object in objects:
    xmin=object.getElementsByTagName("xmin")
    xmin_data=int(float(xmin[0].firstChild.data))
    # xmin[0].firstChild.data =str(int(xmin1 * x))
    ymin =object.getElementsByTagName("ymin")
    ymin_data = int(float(ymin[0].firstChild.data))
    xmax=object.getElementsByTagName("xmax")
    xmax_data = int(float(xmax[0].firstChild.data))
    ymax=object.getElementsByTagName("ymax")
    ymax_data = int(float(ymax[0].firstChild.data))

    # 更新xml
    width_xml=root.getElementsByTagName("width")
    width_xml[0].firstChild.data=width
    height_xml = root.getElementsByTagName("height")
    height_xml[0].firstChild.data = height

    xmin[0].firstChild.data = int(xmin_data*scale)
    ymin[0].firstChild.data = int(ymin_data*scale)
    xmax[0].firstChild.data = int(xmax_data*scale)
    ymax[0].firstChild.data = int(ymax_data*scale)

    # 另存更新后的文件
    with open('demo2.xml', 'w') as f:
        dom.writexml(f, addindent='  ', encoding='utf-8')
    # 测试缩放效果
    img = cv2.resize(img, (width, height))
    # xmin, ymin, xmax, ymax分别为xml读取的坐标信息
    left_top = (int(xmin_data*scale), int(ymin_data*scale))
    right_down= (int(xmax_data*scale), int(ymax_data*scale))
    cv2.rectangle(img, left_top, right_down, (255, 0, 0), 1)

cv2.imwrite("result.jpg",img)
代码效果
原标注文件

在这里插入图片描述

修改后标注文件

在这里插入图片描述

可视化修改后的标注效果

在这里插入图片描述
博主常年在线,欢迎大家一起交流。

  • 13
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值