用python代码生成随机缺陷的图片
时间: 2024-01-26 12:49:10 浏览: 90
好的,以下是使用Python代码生成随机缺陷的图片的示例代码:
```python
import numpy as np
from PIL import Image
# 定义图片大小和随机缺陷数量
size = (512, 512)
num_defects = 50
# 生成随机缺陷位置和大小
defects = []
for i in range(num_defects):
x = np.random.randint(0, size[0])
y = np.random.randint(0, size[1])
w = np.random.randint(5, 50)
h = np.random.randint(5, 50)
defects.append((x, y, w, h))
# 生成随机缺陷图片
img = np.zeros(size)
for defect in defects:
x, y, w, h = defect
img[y:y+h, x:x+w] = np.random.randint(0, 256)
# 保存图片
im = Image.fromarray(img.astype(np.uint8))
im.save('random_defects.jpg')
```
运行完以上代码后,将会生成一张名为`random_defects.jpg`的随机缺陷图片。
相关问题
python实现代码,有三个文件夹,两个文件夹中分别存放了一些缺陷图像和图像对应的voc格式的xml标签文件,另外一个文件夹 存放了一些正常图像,代码实现提取缺陷图像中的目标框,并随机选取一张正常图像粘贴在随机位置中。
在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()
```
python实现代码,不使用imgaug库,有三个文件夹,其中两个文件夹中分别存放了一些缺陷图像和图像对应的voc格式的xml标签文件,另外一个文件夹存放了一些正常图像,代码实现提取缺陷图像中的某种name的标注框,随机选取一张正常图像粘贴在随机位置中,并形成新的xml标签文件。
首先,我们需要做的是处理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标准或具体需求,可能需要进行适当的调整。
阅读全文