【数据处理】Python解析多类别分割标签的json文件

  之前数据处理也解析过json文件,不过那会是一张图只有一个mask,一个标签,近期接触多类别分割标签的json文件,进一步理解了以前写的解析代码,考虑了多类别标签的各种情况,特此记录。

  单标签的json解析传送门:【数据处理】Python解析json文件(转mask)


1. 多类别分割标签

  假设用labelme软件勾了如下一个标签(示例标签无实际意义,仅供代码测试),标签为0-4,标签之间存在包含情况,如标签0包含1-4;每一个类可能有多个区域,如标签4有两个区域的勾画。在医学实际应用中,此类标注可见于一个大病灶中,不同级别病灶的区分。
  
在这里插入图片描述

2. python解析

python代码及注释:

import json
import numpy as np
from collections import defaultdict
from labelme import utils
from skimage import img_as_ubyte
import matplotlib.pyplot as plt
from PIL import Imagepath = './1.json'
data = json.load(open(path))
imageData = data.get('imageData')
img = utils.img_b64_to_arr(imageData)  # 解析json文件获得原图shape = data['shapes']  # shape中存储了各标签的标记点masks = defaultdict(list)  # 定义一个空字典# 对每一个标签进行解析
index = 0
for item in shape:temp_label = item['label']  # 获得勾画时给定的标签temp_points = item['points']  # 获得该标签的标记点# 将标记点转化为mask, 其中背景的标记为0, 标记标签的值需要加1与背景区分# 实际应用中根据勾画时给定的标签修改lbl, _ = utils.shapes_to_label(img.shape, [item], {'_background_': 0, temp_label:int(temp_label)+1})temp_mask = img_as_ubyte(lbl)  # int32转为图像uint8masks[str(index)] = temp_mask  # 存入字典index = index + 1key_all = list(masks.keys())  # 获取字典中所有的键# 将字典masks转化为数组, 同时增加代码普适性适应于各种情况, 便于批量处理
if len(key_all) == 1:masks_all = masks[key_all[0]]  # 若json中只标记了一个标签
else:for i in range(len(key_all)-1):if i == 0:masks_all = np.stack((masks[key_all[i]], masks[key_all[i+1]]), axis=0)else:masks_all = np.concatenate((masks_all, np.expand_dims(masks[key_all[i+1]], axis=0)), axis=0)# 合并数组masks_all中的所有标签, 本例中masks_all.shape:(6, 3264, 5824)
if len(key_all) != 1:final_mask = np.max(masks_all, axis=0)
else:final_mask = masks_allw, h = final_mask.shape   # (3264, 5824)
zz = final_mask.reshape(w*h)
print(list(set(list(zz))))  # 输出mask中的数值为:[0, 1, 2, 3, 4, 5]# 画图--------------------------------------------------------------------------
plt.figure(dpi=300)
plt.subplot(2,1,1)
plt.imshow(img)   # 原图
plt.axis('off')
plt.subplot(2,1,2)
plt.imshow(final_mask)  # mask(伪彩)
plt.axis('off')
# 存图--------------------------------------------------------------------------
image_path = "./image.png"
mask_path = "./mask.png"
image_save = Image.fromarray(img)
mask_save = Image.fromarray(final_mask)
image_save.save(image_path)
mask_save.save(mask_path)
# ------------------------------------------------------------------------------

mask(伪彩显示)提取如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/317119.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

裂变新模式:分销市场的翘楚

在当今的商业世界,推荐机制已经成为一种重要的营销策略。通过用户推荐,企业不仅能够扩大品牌影响力,还能有效降低获客成本。然而,如何设计一个合理的推荐机制,使得用户有足够的动力去推荐新人,同时保持团队…

STM32入门教程-2023版【3-2】推挽输出和开漏输出驱动问题

关注 点赞 不错过精彩内容 大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 二、正式点亮一个LED灯 (4)推挽输出和开漏输出驱动问题 把LED的正负极对换&…

[Vulnhub靶机] DriftingBlues: 2

[Vulnhub靶机] DriftingBlues: 2靶机渗透思路及方法(个人分享) 靶机下载地址: https://download.vulnhub.com/driftingblues/driftingblues2.ova 靶机地址:192.168.67.21 攻击机地址:192.168.67.3 一、信息收集 1.…

深度学习MLP_实战演练使用感知机用于感情识别_keras

目录 (1)why deep learning is game changing?(2)it all started with a neuron(3)Perceptron(4)Perceptron for Binary Classification(5)put it all toget…

Nacos配置回滚

前言 很多时候,我们会配置错一些属性,或者需要回滚某些属性,这时候使用Nacos的回滚功能就很方便了 配置回滚 1、在控制台中,选择左侧导航栏的 “配置管理”,进入历史版本,选择Group和data id&#xff0c…

了解长短期记忆 (LSTM) 网络:穿越时间和记忆的旅程

一、说明 在人工智能和机器学习的迷人世界中,长短期记忆 (LSTM) 网络作为一项突破性创新脱颖而出。LSTM 旨在解决传统循环神经网络 (RNN) 的局限性,尤其是在学习长期依赖性方面的局限性,彻底改变了我们在各个领域建模和预测序列的能力。本文深…

利用Embedding优化搜索功能

我们继续用Gemini学习LLM编程之旅。 Embedding是一种自然语言处理 (NLP) 技术,可将文本转换为数值向量。Embedding捕获语义含义和上下文,从而导致具有相似含义的文本具有更接近的Embedding。例如,句子“我带我的狗去看兽医”和“我带我的猫去…

2023.12.27 关于 Redis 数据类型 List 常用命令

目录 List 类型基本概念 List 类型特点 List 操作命令 LPUSH LPUSHX RPUSH RPUSHX LRANGE LPOP RPOP LINDEX LINSERT LREM LTRIM LSET 阻塞版本的命令 阻塞版本 和 非阻塞版本的区别 BLPOP & BRPOP List 类型基本概念 Redis 中的列表(list&am…

LobeChat:搭建你的私人 GPT!

前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello,大家好,我是 Sunday。 之前有同学问我:“老师,我想要搭建一个个人的 …

老师的职业特点是什么

老师,这个职业看似平凡,却承载着塑造下一代的重任。不仅传授知识,更是引导学生成为自己期望的人。 具备扎实的专业知识。这不仅是教好课的基础,也是赢得学生尊敬的关键。时刻保持对所教专业的热爱和关注,通过自己的经验…

Android 串口协议

前言 本协议是 Android 应用端与主控板之间的通信协议,是串行通信协议。 协议要求同一时间只能有两个通讯端点在相互通讯,采用小端传输数据。 硬件层基于RS485协议,采取半双工,一主多从的通讯模式。Android定义为主机&#xff0c…

声明式管理方(yaml)文件

声明式管理方(yaml)文件: 1、适合对资源的修改操作 2、声明式管理依赖于yaml文件,所有的内容都在yaml文件当中。 3、编辑好的yaml文件需要依靠陈述是还是要依靠陈述式的命令发布到k8s集群当中 create只能创建,不能更新。从指定yaml文件中读取配置&#…