【代码】提取YOLO格式的txt标注文件中的目标区域

文章目录

提取方式一:背景为黑色

将 YOLO 语义分割的 txt 标注文件还原到原图中,并将目标区域填充为纯白色,背景区域填充为纯黑色

注意:该标注文件为txt格式,且是图像分割的标注文件(标准格式),不是目标识别的矩形框

python 复制代码
import cv2
import numpy as np
'''
将txt标注文件中的目标区域还原为白色,背景区域为纯黑色
'''
def read_txt_labels(txt_file):
    """
    从 txt 标注文件中读取标签
    :param txt_file: txt 标注文件路径
    :return: 标签列表
    """
    with open(txt_file, "r") as f:
        labels = []
        for line in f.readlines():
            label_data = line.strip().split(" ")
            class_id = int(label_data[0])
            # 解析边界框坐标
            coordinates = [float(x) for x in label_data[1:]]
            labels.append([class_id, coordinates])
    return labels

def draw_labels(image, labels):
    """
    在图像上绘制分割区域
    :param image: 图像
    :param labels: 标签列表
    """
    for label in labels:
        class_id, coordinates = label
        # 将坐标转换为整数并重新塑形为多边形
        points = [(int(x * image.shape[1]), int(y * image.shape[0])) for x, y in zip(coordinates[::2], coordinates[1::2])]
        # 使用多边形填充纯白色
        cv2.fillPoly(image, [np.array(points)], (255, 255, 255))

def main():
    """
    将 YOLO 语义分割的 txt 标注文件还原到原图中,并将目标区域填充为纯白色,背景区域填充为纯黑色
    """
    # 读取图像
    image = cv2.imread("D:\Desktop\gasdata\\02images_remove_color\\0002.jpg")
    # 初始化图像为纯黑色背景
    image[:] = (0, 0, 0)
    # 读取 txt 标注文件
    txt_file = "D:\Desktop\gasdata\\04txt\\0002.txt"
    labels = read_txt_labels(txt_file)
    # 绘制分割区域
    draw_labels(image, labels)
    # 保存图片
    cv2.imwrite('D:\\Desktop\\0002.jpg', image)
    # 显示图片
    cv2.imshow("Image", image)
    cv2.waitKey(0)

if __name__ == "__main__":
    main()

示例:

提取结果:

提取方式二:背景为指定图片

注意:该方式要求指定的背景图片要和原图大小一样

python 复制代码
'''
提取出txt目标区域,放到background.jpg画布上,然后保存
'''
import cv2
import numpy as np

def read_txt_labels(txt_file):
    """
    从 txt 标注文件中读取标签
    :param txt_file: txt 标注文件路径
    :return: 标签列表
    """
    with open(txt_file, "r") as f:
        labels = []
        for line in f.readlines():
            label_data = line.strip().split(" ")
            class_id = int(label_data[0])
            # 解析边界框坐标
            coordinates = [float(x) for x in label_data[1:]]
            labels.append([class_id, coordinates])
    return labels

def draw_labels_on_background(image, labels, background):
    """
    在背景图像上绘制分割区域
    :param image: 源图像
    :param labels: 标签列表
    :param background: 背景图像
    """
    mask = np.zeros_like(image, dtype=np.uint8)  # 创建一个与源图像相同大小的遮罩
    for label in labels:
        class_id, coordinates = label
        # 将坐标转换为整数并重新塑形为多边形
        points = [(int(x * image.shape[1]), int(y * image.shape[0])) for x, y in
                  zip(coordinates[::2], coordinates[1::2])]
        # 在遮罩上使用多边形填充纯白色
        cv2.fillPoly(mask, [np.array(points)], (255, 255, 255))
    # 将遮罩应用到背景上
    fg = cv2.bitwise_and(image, mask)
    bg = cv2.bitwise_and(background, cv2.bitwise_not(mask))
    result = cv2.add(fg, bg)
    return result


def main():
    """
    将 YOLO 语义分割的 txt 标注文件还原到原图中,并将目标区域保存到background.jpg文件作为画布上
    """
    # 读取源图像
    image = cv2.imread("D:\\Desktop\\gasdata\\02images_remove_color\\0002.jpg")
    # 读取背景图像
    background = cv2.imread("D:\Desktop\yolov8\yolov8-main-low-color\\background.jpg")
    # 读取 txt 标注文件
    txt_file = "D:\\Desktop\\gasdata\\04txt\\0002.txt"
    labels = read_txt_labels(txt_file)
    # 在背景上绘制分割区域
    result_image = draw_labels_on_background(image, labels, background)
    # 保存图片
    cv2.imwrite('D:\\Desktop\\0002_on_background.jpg', result_image)
    # 显示图片
    cv2.imshow("Image with Background", result_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()  # 添加这行代码以确保所有窗口都会关闭

if __name__ == "__main__":
    main()

提取方式三:背景为指定图片,对文件夹中所有图片进行提取

python 复制代码
import cv2
import numpy as np
import os

def read_txt_labels(txt_file):
    """
    从 txt 标注文件中读取标签
    :param txt_file: txt 标注文件路径
    :return: 标签列表
    """
    with open(txt_file, "r") as f:
        labels = []
        for line in f.readlines():
            label_data = line.strip().split(" ")
            class_id = int(label_data[0])
            # 解析边界框坐标
            coordinates = [float(x) for x in label_data[1:]]
            labels.append([class_id, coordinates])
    return labels

def draw_labels_on_background(image, labels, background):
    """
    在背景图像上绘制分割区域
    :param image: 源图像
    :param labels: 标签列表
    :param background: 背景图像
    """
    mask = np.zeros_like(image, dtype=np.uint8)  # 创建一个与源图像相同大小的遮罩
    for label in labels:
        class_id, coordinates = label
        # 将坐标转换为整数并重新塑形为多边形
        points = [(int(x * image.shape[1]), int(y * image.shape[0])) for x, y in
                  zip(coordinates[::2], coordinates[1::2])]
        # 在遮罩上使用多边形填充纯白色
        cv2.fillPoly(mask, [np.array(points)], (255, 255, 255))
    # 将遮罩应用到背景上
    fg = cv2.bitwise_and(image, mask)
    bg = cv2.bitwise_and(background, cv2.bitwise_not(mask))
    result = cv2.add(fg, bg)
    return result

def process_image(image_path, txt_path, background_path, save_path):
    # 读取源图像
    image = cv2.imread(image_path)
    # 读取背景图像
    background = cv2.imread(background_path)
    # 确保背景图片与源图片大小相同
    background = cv2.resize(background, (image.shape[1], image.shape[0]))
    # 读取 txt 标注文件
    labels = read_txt_labels(txt_path)
    # 在背景上绘制分割区域
    result_image = draw_labels_on_background(image, labels, background)
    # 保存图片
    cv2.imwrite(save_path, result_image)

def main():
    # 源图像文件夹路径
    images_folder = "D:\Desktop\\test0316_30pics\\"
    # 标签文件夹路径
    labels_folder = "D:\\Desktop\\gasdata\\04txt\\"
    # 背景图像路径
    background_path = "D:\\Desktop\\yolov8\\yolov8-main-low-color\\background.jpg"
    # 保存结果图像的文件夹路径
    save_folder = "D:\\Desktop\\processed_images\\"
    # 确保保存文件夹存在
    if not os.path.exists(save_folder):
        os.makedirs(save_folder)
    # 获取源图像文件夹中的所有文件名
    images = os.listdir(images_folder)
    for image_name in images:
        if image_name.lower().endswith(('.png', '.jpg', '.jpeg')):
            # 构造完整的文件路径
            image_path = os.path.join(images_folder, image_name)
            txt_path = os.path.join(labels_folder, os.path.splitext(image_name)[0] + '.txt')
            save_path = os.path.join(save_folder, 'processed_' + image_name)
            # 处理图像
            process_image(image_path, txt_path, background_path, save_path)
            print(f"Processed {image_name}")

if __name__ == "__main__":
    main()
相关推荐
Songgp10245 分钟前
yolo26+qwen3.5大小模型协同AI分析系统
图像处理·人工智能·python
reset20212 小时前
YOLOv8 图像分类过拟合解决方案
人工智能·yolo
code_pgf6 小时前
yolo系列综述
yolo
羊羊小栈7 小时前
基于「YOLO目标检测 + 多模态AI分析」的桥梁缺陷智能分析监测预警系统
人工智能·yolo·目标检测·计算机视觉·毕业设计·大作业
咏&志7 小时前
目标检测之YOLOV2论文简读
人工智能·yolo·目标检测
weixin_408099678 小时前
文字识别通用OCR接口调用与功能说明
图像处理·人工智能·后端·python·ocr·api·文字识别
深度学习lover8 小时前
<数据集>yolo骑行者识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉
reset20211 天前
安防监控中目标检测方案探讨
人工智能·yolo·目标检测·目标跟踪
Hong_Youth1 天前
OpenCV + YOLOv5 落地工程:视频实时计数、追踪、画线统计
opencv·yolo·音视频
sali-tec1 天前
C# 基于OpenCv的视觉工作流-章45-圆卡尺
图像处理·人工智能·opencv·算法·计算机视觉