【代码】提取图像轮廓坐标并保存为YOLOv8所需的txt格式

news/2024/7/11 1:30:00 标签: YOLO, opencv, 人工智能, 图像处理

该段代码的应用场景为对图像标注过后,想要对图像进行裁切,但是标签不能裁切,所以将原图像按照标签进行二值化后,将二值化后的图像进行裁切,然后使用opencv对裁切后的图像进行处理,识别出白色区域轮廓,并保存坐标信息(YOLOv8图像分割标注格式)

import os
import cv2
import numpy as np
'''
该段代码读取文件夹中的二值图像,输出白色区域的标注信息
格式为YOLOv8图像分割的txt格式
'''
def process_images(input_folder, output_folder):
    # 如果输出文件夹不存在,则创建它
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    # 列出输入文件夹中的所有图像文件
    image_files = [f for f in os.listdir(input_folder) if f.endswith(('.png', '.jpg', '.jpeg', '.bmp'))]
    total_images = len(image_files)
    print(f"在文件夹'{input_folder}'中找到了 {total_images} 张图像。")
    # 处理每张图像
    for idx, filename in enumerate(image_files, 1):
        print(f"正在处理图像 {idx} / {total_images} : {filename}")
        # 加载图像
        image_path = os.path.join(input_folder, filename)
        image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
        # 检查图像是否正确加载
        if image is None:
            print(f"图像 {filename} 未能正确加载。")
            continue
        # 对图像进行阈值处理以获得二值图像
        _, binary_image = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY)
        # 寻找轮廓
        contours, _ = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        # 初始化一个列表来存储轮廓坐标
        contour_coordinates = []
        # 获取图像的尺寸以进行归一化
        height, width = image.shape
        # 遍历轮廓以提取归一化坐标
        for contour in contours:
            # 初始化一个列表来存储单个轮廓的坐标
            coords = ['0']  # 开头的数字0(没有小数点)
            for point in contour:
                # 归一化x和y坐标并添加到列表中
                x_normalized = point[0][0] / width
                y_normalized = point[0][1] / height
                coords.extend([f"{x_normalized:.6f}", f"{y_normalized:.6f}"])
            # 将单个轮廓的坐标添加到主列表中
            contour_coordinates.append(' '.join(coords))
        # 定义输出文本文件的路径
        output_file_path = os.path.join(output_folder, os.path.splitext(filename)[0] + '.txt')
        # 将坐标写入文本文件
        with open(output_file_path, 'w') as file:
            file.write('\n'.join(contour_coordinates))
# 输入和输出文件夹路径(请替换为实际路径)
input_folder_path = './test_label_pre'  # 替换为实际的输入文件夹路径
output_folder_path = './test_labels'  # 替换为实际的输出文件夹路径

# 调用函数以处理图像
process_images(input_folder_path, output_folder_path)

示例:
输入图像:
在这里插入图片描述
输出信息:
YOLOv8训练所需的txt标注信息:
在这里插入图片描述


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

相关文章

EPSON X1G005441020416 TG2016SMN高精度温补晶振

日本爱普生晶振是全球领先的晶振产品生产商,旗下的温补晶振(TXCO)是EPSON晶振公司产品中的重要产品线之一,其产品一直跟随产品需求变化,不断的更新,EPSON晶体晶振类产品主要包括32.768K时钟晶体MHz无源晶体,有源晶振,温补晶振等产品,且相对于业界同类厂家…

关于微服务跨数据库联合查询的一些解决思路

微服务架构的一个非常明显的特征就是一个服务所拥有的数据只能通过这个服务的API来访问。通过这种方式来解耦,这样就会带来查询问题。以前通过join就可以满足要求,现在如果需要跨多个服务集成查询就会非常麻烦。 解决思路 下面提供几个思路仅供参考 表…

2024蓝桥杯每日一题(递归)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一:有序分数 试题二:正则问题 试题三:带分数 试题四:约数之和 试题五:分形之城 试题一:有序分数 【题目描述】 【输入格…

版本控制系统 Git

当今最受欢迎的版本控制系统是 Git。它原本是为管理 Linux 源代码而生的,但此后整个编程世界都为之征服,甚至微软都在 2017 年采用 Git 来管理 Windows 的源代码。 xltrail 也是一个基于 Git 的版本控制系统,但它知道怎么处理 Excel 文件。x…

docker 安装minio,详细图解

废话不多说,直接上干货 docker 安装minio 拉取镜像 docker pull minio/minio创建数据目录、配置目录 mkdir /opt/minio/data mkdir /opt/minio/config启动容器 docker run -p 9000:9000 -p 9090:9090 \--name minio \-d --restartalways \-e "MINIO_ACCESS_KE…

openEular入门操作(仅供学习哦~)

如何登录Linux? shell简介 修改密码 Linux用户 bash shell快捷操作 进入openEular,输入账号密码。 命令ip addr 进入putty,输入查到的ip,使用ssh。即可远程登录 修改密码, 修改用户(passwd 用户名字&…

Spring集成hazelcast实现分布式缓存

1.Hazelcast介绍 Hazelcast是Hazelcast公司开源的一款分布式内存数据库产品,提供弹性可扩展、高性能的分布式内存计算。并通过提供诸如Map,Queue,ExecutorService,Lock和JCache等Java的许多开发人员友好的分布式实现。 Hazelcast优…

java高频面试题-高级篇

1,TCP可靠传输除了三次握手,还有其他方式保证可靠性吗? 序列号和确认应答:TCP通过序列号和确认应答机制来确保数据包的有序传输和可靠接收。数据校验和:TCP在每个数据包中都包含一个校验和字段,用于检测数…