python实现代码,有三个文件夹,两个文件夹中分别存放了一些缺陷图像和图像对应的voc格式的xml标签文件,另外一个文件夹 存放了一些正常图像,代码实现提取缺陷图像中的目标框,并随机选取一张正常图像粘贴在随机位置中。
时间: 2024-12-08 09:18:36 浏览: 17
在Python中,要实现这个功能,你可以使用`os`库来遍历文件夹,`opencv-python`库来进行图像处理和目标检测,以及`random`库来生成随机位置。这里是一个简化的例子,假设你已经安装了必要的库:
```python
import os
import cv2
import random
from xml.etree.ElementTree import ElementTree
# 定义目标检测函数,这里假设使用的是VOC格式的XML文件中的bounding box信息
def parse_voc_xml(xml_file):
tree = ElementTree(file=xml_file)
root = tree.getroot()
boxes = []
for obj in root.iter('object'):
x, y, w, h = int(obj.find('bndbox/xmin').text), \
int(obj.find('bndbox/ymin').text), \
int(obj.find('bndbox/xmax').text) - int(obj.find('bndbox/xmin').text), \
int(obj.find('bndbox/ymax').text) - int(obj.find('bndbox/ymin').text)
boxes.append((x, y, w, h))
return boxes
# 提取缺陷图像及其对应的目标框
def extract_defect_boxes(defect_folder):
defect_boxes = {}
for filename in os.listdir(defect_folder):
if filename.endswith(".jpg") or filename.endswith(".png"): # 检查是否为图片文件
img_path = os.path.join(defect_folder, filename)
xml_path = img_path.replace('.jpg', '.xml') or img_path.replace('.png', '.xml')
boxes = parse_voc_xml(xml_path)
defect_boxes[filename] = boxes
return defect_boxes
# 随机选择并粘贴正常图像
def paste_normal_image(normal_folder, defect_boxes):
normal_img_path = random.choice([img for img in os.listdir(normal_folder) if img.endswith(('.jpg', '.png'))])
normal_img = cv2.imread(os.path.join(normal_folder, normal_img_path))
# 确定一个随机的位置(这里只是示例,可以根据需要调整)
x, y = random.randint(0, normal_img.shape[1]), random.randint(0, normal_img.shape[0])
for img_name, boxes in defect_boxes.items():
for box in boxes:
# 使用box裁剪出缺陷部分,然后将其粘贴到正常图片上
defect_patch = normal_img[y:y+box[2], x:x+box[3]]
normal_img[y:y+box[2], x:x+box[3]] = defect_patch
return normal_img_path, normal_img
# 主程序入口
def main():
defect_folder = "path/to/defect/folder"
normal_folder = "path/to/normal/folder"
defect_boxes = extract_defect_boxes(defect_folder)
chosen_normal, pasted_img = paste_normal_image(normal_folder, defect_boxes)
# 可能的操作:保存图片,显示结果等
print(f"已将正常图片 {chosen_normal} 添加到缺陷图片中并保存。")
if __name__ == "__main__":
main()
```
阅读全文