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

news/2024/7/10 22:47:02 标签: YOLO, 图像处理

文章目录

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

提取方式一:背景为黑色

YOLO 语义分割的 txt 标注文件还原到原图中,并将目标区域填充为纯白色,背景区域填充为纯黑色
注意:该标注文件为txt格式,且是图像分割的标注文件(标准格式),不是目标识别的矩形框

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()

示例:

在这里插入图片描述

提取结果:

在这里插入图片描述

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

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

'''
提取出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()

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

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()

http://www.niftyadmin.cn/n/5434286.html

相关文章

暴力破解凯撒密码 python代码

暴力破解凯撒密码 暴力破解凯撒密码代码部分:结果展示 暴力破解凯撒密码 凯撒密码破解原理主要是通过对密文进行频率分析、统计分析和字母替换等方法来破解。 具体来说,破解者可以通过对密文中每个字母出现的频率进行统计和分析,找出出现频…

软考高级:软件工程单元测试(驱动模块、被测模块、桩模块)概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Bean的作用域、Bean的自动装配、注解自动装配 (Spring学习笔记五)

1、Bean 的作用域 官网上显示有六种 1、Bean的作用域默认的是singleton&#xff08;单例模式的实现&#xff09; 也可以显示的设置&#xff08;单例模式的实现&#xff09; <!--用scope可以设置Bean的作用域--><bean id"user2" class"com.li.pojo.Us…

JOSEF约瑟 TQ-100同期继电器 额定直流电压220V 交流电压100V±10V

TQ-100型同期继电器 TQ-100同期继电器 ​ l 应用 本继电器用于双端供电线路的自动重合闸和备用电源自投装置中&#xff0c;以检查线路电压与母线电压的 相位差和幅值差。 2 主要性能 2 1采用进口集成电路和元器件构成&#xff0c;具有原理先进、性能稳定、可靠性高、动作值精…

DeformableAttention的原理解读和源码实现

本专栏主要是深度学习/自动驾驶相关的源码实现,获取全套代码请参考 目录 原理第一步看看输入:第二步,准备工作:生成参考点的偏移量生成参考点的权重生成参考点 第三步,工作: 源码 原理 目前流行3D转2DBEV方案的都绕不开的transfomer变体-DeformableAttention. 传统transform…

全量知识系统 因子分析+在线处理+实时库+生存拓扑控制+跨语言 的设想及百度AI答问 之2

Q6.以上基本说清楚了 实时库 中的三张表和 三种因子分析结果的数据类型、值类型及关系。下面&#xff0c;我们可以考虑 它们和三种在线处理程序之间的关系和程序了。显然&#xff0c;三种在线处理&#xff08;OLEP 、OLTP 和OLAP&#xff09;处理的处理要求就是三种因子&#x…

Linux网络编程: IP协议详解

一、TCP/IP五层模型 物理层&#xff08;Physical Layer&#xff09;&#xff1a;物理层是最底层&#xff0c;负责传输比特流&#xff08;bitstream&#xff09;以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流&#xff0c;例如通过电缆、光纤或无线传输等。…

Vue前端项目安装及相关问题解决

目录 安装 以人人开源前端项目安装为例&#xff0c;安装部署及安装过程中的问题的解决思路。开源地址如下&#xff1a; 人人开源 下载代码到本地 安装visial studio code&#xff08;即VSCode&#xff09;作为前端开发工具&#xff0c;使用前端前必须安装node.js作为让js运行…