python实现代码,不使用imgaug库,有三个文件夹,其中两个文件夹中分别存放了一些缺陷图像和图像对应的voc格式的xml标签文件,另外一个文件夹存放了一些正常图像,代码实现提取缺陷图像中的某种name的标注框,随机选取一张正常图像粘贴在随机位置中,并形成新的xml标签文件。
时间: 2024-12-08 20:20:31 浏览: 19
首先,我们需要做的是处理VOC格式的XML标签文件,提取我们关心的标注框信息。然后遍历包含缺陷图像的文件夹,找到特定名称(例如"name")的标注框。对于正常图像,我们将选择并随机放置一个缺陷图像上的标注框。这里假设我们已经有了一个简单的XML解析器。
```python
import os
import xml.etree.ElementTree as ET
import numpy as np
from PIL import Image, ImageDraw
# 定义一个简单VOC XML解析器
def parse_voc_xml(xml_path):
tree = ET.parse(xml_path)
root = tree.getroot()
boxes = []
for obj in root.iter('object'):
name = obj.find('name').text
if name == 'name': # 我们只关注特定名称的标注
bndbox = obj.find('bndbox')
x1 = int(bndbox.find('xmin').text)
y1 = int(bndbox.find('ymin').text)
x2 = int(bndbox.find('xmax').text)
y2 = int(bndbox.find('ymax').text)
boxes.append((x1, y1, x2, y2))
return boxes
# 提取缺陷图像及其对应XML的路径
def get_defect_images(xml_folder):
defect_images = []
defect_xmls = [os.path.join(xml_folder, f) for f in os.listdir(xml_folder) if f.endswith('.xml')]
for xml_file in defect_xmls:
img_path = xml_file.replace('.xml', '.jpg') # 假设图片和XML在同一目录下
defect_images.append((img_path, parse_voc_xml(xml_file)))
return defect_images
# 随机从正常图像文件夹中选择并添加缺陷框
def paste_defect_box(normal_img_path, defect_boxes):
img = Image.open(normal_img_path)
draw = ImageDraw.Draw(img)
chosen_box = np.random.choice(defect_boxes) # 随机选择一个缺陷框
x1, y1, x2, y2 = chosen_box
draw.rectangle([(x1, y1), (x2, y2)], fill=None, outline='red') # 在图像上画出红色边框
new_img_path = 'new_' + normal_img_path # 新的图片文件名
img.save(new_img_path)
return new_img_path, chosen_box
# 主程序
def main():
defect_folder = 'path_to_defect_folder' # 缺陷图像文件夹路径
normal_folder = 'path_to_normal_folder' # 正常图像文件夹路径
defects = get_defect_images(defect_folder)
for img_path, defect_boxes in defects:
new_img_path = paste_defect_box(normal_folder + '/random_image.jpg', defect_boxes) # 选择一张正常图像
# 创建新XML标签文件,这里只是一个简化示例,实际生成需要更复杂的逻辑,比如复制原始XML的结构并更新坐标
with open(new_img_path.replace('.jpg', '.xml'), 'w') as xml_file:
pass # 根据实际情况填写创建新XML的内容
if __name__ == '__main__':
main()
```
请注意,这个示例假设了图像和对应的XML标签都在同一层级的子文件夹中,并且所有XML文件都是`<object>`标签内有一个名为`name`的子标签。实际应用中,根据VOC标准或具体需求,可能需要进行适当的调整。
阅读全文