已经做了四张图片的标注,很复杂,但遇到两个问题:

  1. labelimg2无法对边界处的目标进行标注,导致标注不完全;

  1. 后续的算法是基于正方形的图片进行训练的,虽然可以训练矩形,但要多一步,不如在标注前就处理好图片。

结合以上两个问题,下面分享解决思路与代码。

1. 图片遍历/读取/裁剪/填充/无损保存:

都是opencv的基础操作,不展开介绍。代码如下:

import os
import os.path
import cv2def cv_show(name, img, pause = False):cv2.imshow(name, img) key = cv2.waitKey(0 if pause == True else 1) & 0xFF if key == 27:       # keycode 27 = Escapecv2.destroyAllWindows()else:cv2.destroyAllWindows()return 1if __name__ == "__main__":path_origin = 'image_1280-800'      # 输入原文件夹地址path_crop = 'image'                 # 输入原文件夹地址files = os.listdir(path_origin)     # 读入文件夹num_bub = len(files)                # 统计文件夹中的文件个数# 检查path_crop文件夹是否存在,不存在则创建if not os.path.exists(path_crop):os.makedirs(path_crop)# 1. 图片遍历for file in files:# 2. 读取图像img = cv2.imread(path_origin + '\\' + file)flow_img = img.copy()# 显示读取到的图像# if cv_show(file, flow_img, True) is None:#     break#3. 切割图片#截取的左上坐标left_top = (128, 0)       #截取的右下坐标right_bottom = (1152, 800)# 裁剪坐标为[y0:y1, x0:x1]flow_img_cut = flow_img[left_top[1]:right_bottom[1],left_top[0]:right_bottom[0]]# 4. 常数值填充, 需要设置一个value值flow_img_bord = cv2.copyMakeBorder(flow_img_cut, 112, 112, 0, 0, cv2.BORDER_CONSTANT, value = (255, 255, 255))# 5. 无损保存# 0代表图片保存时的压缩程度,有0-9这个范围的10个等级,数字越大表示压缩程度越高。cv2.imwrite(path_crop + '\\' + file, flow_img_bord, [cv2.IMWRITE_PNG_COMPRESSION, 0])# 显示处理后的图像# if cv_show('flow_img_bord', flow_img_bord, True) is None:#     break

2. XML文件读取/修改/保存

图片经过裁剪填充后,由(1280*800)变为(1024*1024),但之前标注过的xml文件中的目标框会偏移,要修正偏移有两步:1、计算偏移量;2、读取/修改/保存xml文件。

2.1. 计算偏移量

偏移量的计算比较简单,opencv的坐标原点在左上角,如图所示,横坐标需要减去,纵坐标需要加上,体现在2.2.代码中。

2.2. 读取/修改/保存xml文件

节点的查找有两种方法,一是逐级节点查找,二是全部节点查找。

节点结构如下:

<annotation verified="yes"><folder>image</folder><filename>images1_0000.png</filename><path>C:\Users\glanc\Desktop\flow_dataset\image\images1_0000.png</path><source><database>Unknown</database></source><size><width>1024</width><height>1024</height><depth>1</depth></size><segmented>0</segmented><object><name>single</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><robndbox><cx>250.5867</cx><cy>336.501</cy><w>72.8736</w><h>49.5941</h><angle>3.041593</angle></robndbox><extra/></object><object><name>single</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><robndbox><cx>330.6097</cx><cy>183.8053</cy><w>70.3055</w><h>41.3395</h><angle>0.17</angle></robndbox><extra/></object>
</annotation>

节点结构如下:

  1. <annotation verified="yes">一级节点;

  1. <folder>、<filename>、<path>、...、<object>、<object>等为二级节点;

  1. <object>下的<name>、<pose>、...、<robndbox>等为三级节点;

  1. <robndbox>下的<cx>、<cy>、<w>、<h>、<angle>五项为四级节点,其中<cx>、<cy>是需要修改的数值。

步骤都在注释里,代码如下,需要注意的一点是cx.text得到的是str,需要转换为浮点数才可以计算,计算完成后转换为字符串才可以保存。

import os
import xml.etree.ElementTree as ETpath = 'label_1280-800'      # 输入原文件夹地址
sv_path = 'label'  # 修改后的xml文件存放路径
files = os.listdir(path)for xmlFile in files:tree = ET.parse(os.path.join(path, xmlFile))root = tree.getroot()  # 得到根节点# 方法一# https://blog.csdn.net/weixin_39580041/article/details/113581299# 查找二级节点objectnodes = root.findall('object')for node in nodes:# object节点没有属性值# print('节点名称:', node.tag)# print('节点属性:', node.attrib)# 继续往下找三级节点:robndboxrobndbox = node.find('robndbox')# 继续往下找四级节点:cx,cycx = robndbox.find('cx')cx_new = str(float(cx.text) - 256 / 2)cx.text = cx_newcy = robndbox.find('cy')cy_new = str(float(cy.text) + 224 / 2)cy.text = cy_new# print(cx, cy)tree.write(os.path.join(sv_path, xmlFile))# 方法二:直接定位节点位置# https://blog.csdn.net/u013996948/article/details/79157795# print(root.text)# #遍历文件所有的tag 为目标的值得标签# for elem in root.iter('cx'):#     cx_new = float(elem.text) - 256 / 2#     elem.text = str(cx_new)# for elem in root.iter('cy'):#     cy_new = float(elem.text) + 224 / 2#     elem.text = str(cy_new)# tree.write(os.path.join(sv_path, xmlFile))

参考文章:

https://blog.csdn.net/weixin_39580041/article/details/113581299

https://blog.csdn.net/u013996948/article/details/79157795

python对修改图片尺寸后的labelimg2/rolabelimg生成的XML文件进行多级节点的读取/修改/保存相关推荐

  1. css修改图片尺寸后图片变模糊的问题

    在富文本编辑器编辑文章发布到网站上时,因图片尺寸过大或导致页面混乱,并且需要兼容移动端.所以需要给图片限制max-width: 100%, 但是设置改属性后,若图片超过100%会导致图片模糊.关于这个 ...

  2. ps如何修改图片大小尺寸_如何查看图片尺寸,大小及如何修改图片尺寸—淘宝美工入门课03...

    上一篇文章给大家分享了一下豆芽常用字体,也提供了下载链接,今天和大家聊聊有关图片尺寸和图片大小相关的问题,主要包含以下这3个方面. 一,如何查看图片的尺寸(像素px) 二,如何改变图片的尺寸 三,了解 ...

  3. 新发的日常小实验——使用python的PIL库批量修改图片尺寸,确保宽和高是4的倍数(Unity、PIL、Pillow、压缩)

    文章目录 一.问题:图片导入Unity被调整成2的N次方 二.设置不转换成2的N次方 三.使用ETC压缩格式,图片宽高必须是4的倍数 四.使用python的PIL库批量修改图片尺寸,确保宽和高是4的倍 ...

  4. python怎样批量修改文件大小_python:批量修改文件名批量修改图片尺寸

    功能:批量修改图片尺寸 图像的几何变换,如缩放.旋转和翻转等,在图像处理中扮演着重要的角色,python中的Image类分别提供了这些操作的接口函数,下面进行逐一介绍. 1.图像的缩放 图像的缩放使用 ...

  5. python 修改图片尺寸_Python实现更改图片尺寸大小的方法(基于Pillow包)

    本文实例讲述了Python实现更改图片尺寸大小的方法.分享给大家供大家参考,具体如下: 1.PIL包推荐Pillow. 2.源码: #encoding=utf-8 #author: walker #d ...

  6. background-image属性设置图片尺寸_Matlab | 批量修改图片尺寸及图片灰度化

    介绍: 在情绪认知的心理学实验中,我们从不同的人脸图片库获取实验所需的实验材料.在正式使用之前往往需要对人脸进行预处理,以控制无关变量对实验结果的影响.常见的预处理有将图片修改为统一尺寸.灰度化.本文 ...

  7. 批量去除图片的黑色背景,并且统一修改图片尺寸

    批量去除图片的黑色背景,并且统一修改图片尺寸 将图片批量去除黑色背景后resize为256x160大小 import os from PIL import Image project_dir = os ...

  8. ios快捷指令:修改图片尺寸、拼接长图

    软件版本要求:ios13及以上 演示机型:iPhone 12 mini 演示系统版本:ios14.6 文章目录 导言 核心步骤:修改单个图片尺寸 完善细节:提供宽度默认值 进阶功能:修改多个图片尺寸 ...

  9. 手机上照片大小怎么改?如何用手机修改图片尺寸?

    现在有时候在处理图片的时候,我们都习惯用手机,比较方便而且随时随地可以操作,但是还有许多小伙伴不知道手机上照片大小怎么改.今天小编就来分享一下在手机上修改图片大小的方法,利用图片改大小(在线修改图片尺 ...

最新文章

  1. ubuntu18.04虚拟机突然不能上网问题解决办法
  2. 集合php,PHP问题集合
  3. 最大流的算法——Edmonds-Karp算法(最短路径增广算法)
  4. linux驱动编写(usb host驱动入门)
  5. 风控趋势|隐私计算几大落地场景与三方数据市场
  6. Communix操作系统的前生今世
  7. JavaWeb笔记 黑马程序员课程
  8. 常用加密算法--对称加密算法
  9. 冯诺依曼计算机的弱点,冯。诺依曼型计算机的缺点及改进方法.doc
  10. JAVA 实现 名单按姓氏笔画为序排列
  11. 【教程】如何利用patchrom来编译你自己的MIUI
  12. 以太坊MEV黑暗森林发展史:从Gas战争到PBS
  13. 自己的微信竟然延迟接收消息了,这是什么情况?
  14. 台灣人如何在大陸工作
  15. 启动项中删除微PE工具箱
  16. 企业微信消息多久可以撤回?企业微信怎么查看撤回的消息?
  17. python自动化赚钱-薅羊毛 | Python 自动化带你轻松赚钱(完结版)
  18. Localizing oscillatory sources using beamformer techniques:part 1
  19. 基于GEE(Google earth engine)的 GIMMS NDVI月合成
  20. 名词解释---权益类资产

热门文章

  1. STM32的CRH、CRL、ODR和IDR寄存器的使用总结
  2. MySQL数据库设计常用技巧和设计规范(一):E-R图
  3. Swift之深入解析不透明类型
  4. android proc目录,Android系统/proc目录详解
  5. 上交所跨市场ETF申购赎回实时回报
  6. embed标签设置pdf默认全屏显示
  7. VISTA/win7添加网络中xp系统共享打印机错误的解决方法
  8. 求解圆周率PI的近似值
  9. ALERT! UUID=xxxxxxxxx does not exist. Dropping to a shell!
  10. 基于JAVA软件测试过程管理计算机毕业设计源码+数据库+lw文档+系统+部署