对原始图像,xml,label进行水平翻转,进行数据增强

import numpy as np
import cv2
import xml.etree.ElementTree as ET
from PIL import Image

name_classes = ['hqc']  # 类别名,可以更改为对应的voc类别名称即可

def flip_horizontal(jpg_file,new_jpg,png_file,new_png):
    img = Image.open(jpg_file)
    png =Image.open(png_file)
    # out = im.transpose(Image.ROTATE_180)
    out_img = img.transpose(Image.FLIP_LEFT_RIGHT)
    out_png = png.transpose(Image.FLIP_LEFT_RIGHT)

    out_img.save(new_jpg)
    out_png.save(new_png)


def flip_xml(xml_file,new_xml):
    tree = ET.parse(xml_file)
    objs = tree.findall('object')
    for ix, obj in enumerate(objs):
        name = obj.find('name').text
        if name == 'hqc':           # 因为本数据集只针对某一个更改的,你要改的有很多,此处要改为 if name in name_classes :
            print(xml_file)
            obj_new = obj.find('bndbox')
            xmin = str( 256 - int(obj_new.find('xmax').text))     # 因为进行水平翻转,这只改变x坐标值,y坐标值不变
            xmax = str( 256 - int(obj_new.find('xmin').text))     # 此处256是图片的宽和高,水平翻转,最大值变最小值,最小值变最大值
            obj_new.find('xmin').text = xmin
            obj_new.find('xmax').text = xmax
            tree.write(new_xml)


if __name__ == '__main__':
    # 原始的图片,xml,png数据集的路径
    xml_file='F:/数据集/hqc/annotation/2.xml'
    jpg_file=r'F:/数据集/hqc/image/2.jpg'
    png_file=r'F:/数据集/hqc/label/2.png'
    
    # 水平翻转后保存的路径
    new_jpg=r'F:/数据集/shiyan/2.jpg'
    new_xml = r'F:/数据集/shiyan/2.xml'
    new_png='F:/数据集/shiyan/2.png'
    flip_xml(xml_file, new_xml)
    flip_horizontal(jpg_file, new_jpg,png_file,new_png)

    image =Image.open(new_jpg)
    tree = ET.parse(new_xml)
    root = tree.getroot()

    for obj in root.iter('object'):
        difficult = 0
        if obj.find('difficult') != None:
            difficult = obj.find('difficult').text

        cls = obj.find('name').text
        if cls not in name_classes or int(difficult) == 1:
            continue
        cls_id = name_classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (int(xmlbox.find('xmin').text), int(xmlbox.find('ymin').text), int(xmlbox.find('xmax').text),
             int(xmlbox.find('ymax').text))
        print(b)

    image = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)
    cv_img = cv2.rectangle(image, (int(float(b[0])),
                                   int(float(b[1]))),
                           (int(float(b[2])),
                            int(float(b[3]))), (255, 0, 0), 2)

    image = Image.fromarray(cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB))
    image.show()

 实现的效果如下:

原始图像

 

水平翻转

 

水平翻转后的标签

 

水平反转后的框

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值