python对修改图片尺寸后的labelimg2/rolabelimg生成的XML文件进行多级节点的读取/修改/保存
已经做了四张图片的标注,很复杂,但遇到两个问题:
labelimg2无法对边界处的目标进行标注,导致标注不完全;
后续的算法是基于正方形的图片进行训练的,虽然可以训练矩形,但要多一步,不如在标注前就处理好图片。
结合以上两个问题,下面分享解决思路与代码。
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>
节点结构如下:
<annotation verified="yes">一级节点;
<folder>、<filename>、<path>、...、<object>、<object>等为二级节点;
<object>下的<name>、<pose>、...、<robndbox>等为三级节点;
<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文件进行多级节点的读取/修改/保存相关推荐
- css修改图片尺寸后图片变模糊的问题
在富文本编辑器编辑文章发布到网站上时,因图片尺寸过大或导致页面混乱,并且需要兼容移动端.所以需要给图片限制max-width: 100%, 但是设置改属性后,若图片超过100%会导致图片模糊.关于这个 ...
- ps如何修改图片大小尺寸_如何查看图片尺寸,大小及如何修改图片尺寸—淘宝美工入门课03...
上一篇文章给大家分享了一下豆芽常用字体,也提供了下载链接,今天和大家聊聊有关图片尺寸和图片大小相关的问题,主要包含以下这3个方面. 一,如何查看图片的尺寸(像素px) 二,如何改变图片的尺寸 三,了解 ...
- 新发的日常小实验——使用python的PIL库批量修改图片尺寸,确保宽和高是4的倍数(Unity、PIL、Pillow、压缩)
文章目录 一.问题:图片导入Unity被调整成2的N次方 二.设置不转换成2的N次方 三.使用ETC压缩格式,图片宽高必须是4的倍数 四.使用python的PIL库批量修改图片尺寸,确保宽和高是4的倍 ...
- python怎样批量修改文件大小_python:批量修改文件名批量修改图片尺寸
功能:批量修改图片尺寸 图像的几何变换,如缩放.旋转和翻转等,在图像处理中扮演着重要的角色,python中的Image类分别提供了这些操作的接口函数,下面进行逐一介绍. 1.图像的缩放 图像的缩放使用 ...
- python 修改图片尺寸_Python实现更改图片尺寸大小的方法(基于Pillow包)
本文实例讲述了Python实现更改图片尺寸大小的方法.分享给大家供大家参考,具体如下: 1.PIL包推荐Pillow. 2.源码: #encoding=utf-8 #author: walker #d ...
- background-image属性设置图片尺寸_Matlab | 批量修改图片尺寸及图片灰度化
介绍: 在情绪认知的心理学实验中,我们从不同的人脸图片库获取实验所需的实验材料.在正式使用之前往往需要对人脸进行预处理,以控制无关变量对实验结果的影响.常见的预处理有将图片修改为统一尺寸.灰度化.本文 ...
- 批量去除图片的黑色背景,并且统一修改图片尺寸
批量去除图片的黑色背景,并且统一修改图片尺寸 将图片批量去除黑色背景后resize为256x160大小 import os from PIL import Image project_dir = os ...
- ios快捷指令:修改图片尺寸、拼接长图
软件版本要求:ios13及以上 演示机型:iPhone 12 mini 演示系统版本:ios14.6 文章目录 导言 核心步骤:修改单个图片尺寸 完善细节:提供宽度默认值 进阶功能:修改多个图片尺寸 ...
- 手机上照片大小怎么改?如何用手机修改图片尺寸?
现在有时候在处理图片的时候,我们都习惯用手机,比较方便而且随时随地可以操作,但是还有许多小伙伴不知道手机上照片大小怎么改.今天小编就来分享一下在手机上修改图片大小的方法,利用图片改大小(在线修改图片尺 ...
最新文章
- ubuntu18.04虚拟机突然不能上网问题解决办法
- 集合php,PHP问题集合
- 最大流的算法——Edmonds-Karp算法(最短路径增广算法)
- linux驱动编写(usb host驱动入门)
- 风控趋势|隐私计算几大落地场景与三方数据市场
- Communix操作系统的前生今世
- JavaWeb笔记 黑马程序员课程
- 常用加密算法--对称加密算法
- 冯诺依曼计算机的弱点,冯。诺依曼型计算机的缺点及改进方法.doc
- JAVA 实现 名单按姓氏笔画为序排列
- 【教程】如何利用patchrom来编译你自己的MIUI
- 以太坊MEV黑暗森林发展史:从Gas战争到PBS
- 自己的微信竟然延迟接收消息了,这是什么情况?
- 台灣人如何在大陸工作
- 启动项中删除微PE工具箱
- 企业微信消息多久可以撤回?企业微信怎么查看撤回的消息?
- python自动化赚钱-薅羊毛 | Python 自动化带你轻松赚钱(完结版)
- Localizing oscillatory sources using beamformer techniques:part 1
- 基于GEE(Google earth engine)的 GIMMS NDVI月合成
- 名词解释---权益类资产
热门文章
- STM32的CRH、CRL、ODR和IDR寄存器的使用总结
- MySQL数据库设计常用技巧和设计规范(一):E-R图
- Swift之深入解析不透明类型
- android proc目录,Android系统/proc目录详解
- 上交所跨市场ETF申购赎回实时回报
- embed标签设置pdf默认全屏显示
- VISTA/win7添加网络中xp系统共享打印机错误的解决方法
- 求解圆周率PI的近似值
- ALERT! UUID=xxxxxxxxx does not exist. Dropping to a shell!
- 基于JAVA软件测试过程管理计算机毕业设计源码+数据库+lw文档+系统+部署