用3dslicer勾画的nrrd标签文件如何转换为json文件

  • 训练maskRCNN分割肿瘤,要用labelme勾画得到json格式mask文件,但为了勾画方便,我想用3dslicer勾画,然后将nrrd格式的mask转换为json格式。

  • 试过了将nrrd(只用了一层CT)直接格式转换为json(代码如下),但是发现转格式的json文件用labelme程序打不开,报错提示json文件无效。

有没有人能够解决这个,粗暴转格式貌似不行。(小白菜🥬的疑问)

import numpy as np
import json
import nrrd
 
# 加载NRRD文件
data, header = nrrd.read('input.nrrd')
 
# 创建用于存储标签的字典
labels_dict = {}
 
# 遍历所有唯一的标签值
unique_labels = np.unique(data)
for label in unique_labels:
    # 获取标签的坐标
    coordinates = np.argwhere(data == label).tolist()
 
    # 将坐标添加到标签字典中
    labels_dict[str(label)] = coordinates
 
# 将标签字典转换为JSON并保存到文件
with open('output.json', 'w') as f:
    json.dump(labels_dict, f)

如果你知道你要封装的JSON格式,可以采取这种操作

d = {
    "name": "Jack",
    "children": [{
        'name': key,
        "size": value
        } for key, value in sample.items()]
    }
j = json.dumps(d, indent=4)
with open('sample.json', 'w') as f:
    print >> f, j

能不能看一下labelme能识别的json格式


import nrrd
import json

# 读取NRRD文件
nrrd_data, nrrd_header = nrrd.read('path/to/your/nrrd/file.nrrd')

# 创建一个空的JSON数据结构
json_data = {}

# 解析NRRD标签数据并转换为JSON格式
for label_value, label_name in nrrd_header['labels'].items():
    json_data[label_name] = label_value

# 将JSON数据写入文件
with open('output.json', 'w') as json_file:
    json.dump(json_data, json_file, indent=4)

print("Conversion completed.")

参考gpt:
结合自己分析给你如下建议:
一种方法是使用Python的nrrd和json模块,读取nrrd文件中的数据和元数据,然后将其转换为json格式,并写入json文件。
另一种方法是使用3D Slicer软件,它可以支持多种数据格式的加载和保存,包括nrrd和json。您可以在3D Slicer中打开nrrd文件,然后在Data模块中右键点击该文件,选择Export to file…,并在弹出的对话框中选择json格式。
还有一种方法是使用在线的文件转换服务,例如AnyConv3,它可以支持从和到json格式的多种文件类型的转换。您只需要上传您的nrrd文件,选择目标格式为json,然后点击Convert按钮,就可以下载转换后的json文件。


import numpy as np
import json
import nrrd
# 加载NRRD文件
data, header = nrrd.read('input.nrrd')
# 创建LabelMe所需的JSON结构
labelme_json = {
    "version": "4.5.6",
    "flags": {},
    "shapes": [],
    "imagePath": "input.nrrd",  # 这里根据你的实际情况填写图像路径
    "imageData": None,
    "imageHeight": header['sizes'][0],  # 图像高度
    "imageWidth": header['sizes'][1]  # 图像宽度
}
# 遍历所有唯一的标签值
unique_labels = np.unique(data)
for label in unique_labels:
    # 获取标签的坐标
    coordinates = np.argwhere(data == label).tolist()
    # 创建LabelMe中的形状对象
    shape = {
        "label": str(label),
        "points": coordinates,
        "group_id": None,
        "shape_type": "polygon",
        "flags": {}
    }
    # 将形状对象添加到LabelMe JSON中
    labelme_json["shapes"].append(shape)
# 将LabelMe JSON保存到文件
with open('output.json', 'w') as f:
    json.dump(labelme_json, f, indent=4)


What is the LabelMe JSON Annotation Format? The native format of LabelMe, an open source graphical image annotation tool written in Python and available for Windows, Mac, and Linux. https://roboflow.com/formats/labelme-json

ChatGPT: 您的代码基本上是正确的,但是由于 3D Slicer 和 labelme 使用的标注格式可能有一些差异,导致直接转换可能无法成功。为了将 3D Slicer 中的 NRRD 格式标签转换为 labelme 可以识别的 JSON 格式,您需要根据两者之间的差异进行适当的处理。

以下是一个可能的解决方案,该方案将 NRRD 文件中的标签数据转换为 labelme 可识别的格式,但需要您在合适的地方进行适当的修改和调整:

import numpy as np
import json
import nrrd

def nrrd_to_labelme(nrrd_file, output_json):
    # Load NRRD file
    data, header = nrrd.read(nrrd_file)

    # Create labelme format
    labelme_data = {
        "version": "4.5.6",
        "flags": {},
        "shapes": [],
        "imagePath": nrrd_file,  # You may need to provide the image path
        "imageData": None,       # You may need to provide the image data
        "imageHeight": header["sizes"][0],
        "imageWidth": header["sizes"][1]
    }

    # Process unique labels
    unique_labels = np.unique(data)
    for label in unique_labels:
        coordinates = np.argwhere(data == label)
        shape = {
            "label": str(label),
            "points": coordinates.tolist(),
            "group_id": None,
            "shape_type": "polygon",
            "flags": {}
        }
        labelme_data["shapes"].append(shape)

    # Save labelme format as JSON
    with open(output_json, 'w') as f:
        json.dump(labelme_data, f)

nrrd_to_labelme('input.nrrd', 'output.json')

请注意,上述代码需要您提供正确的图片路径和图片数据,以及根据 labelme 的标注格式进行适当的调整。此外,如果 labelme 对标签的描述有更多字段要求,您可能需要进一步扩展 JSON 数据的内容。最终的 JSON 格式应与 labelme 的标注格式保持一致才能被 labelme 正确识别。

【以下回答由 GPT 生成】

对于将nrrd标签文件转换为json文件以进行深度学习训练的问题,可以按照以下步骤进行:

  1. 安装相关依赖:确保已经正确安装了3D Slicer、numpy、json、nrrd这些库。可以使用pip命令安装它们。

  2. 导入必要的库:在Python脚本中导入所需的库。

python import numpy as np import json import nrrd

  1. 加载NRRD文件:使用nrrd库加载nrrd文件。

python data, header = nrrd.read('input.nrrd')

  1. 创建用于存储标签的字典:创建一个空的字典用于存储标签数据。

python labels_dict = {}

  1. 遍历标签数据:遍历所有唯一的标签值,并获取每个标签的坐标。

python unique_labels = np.unique(data) for label in unique_labels: coordinates = np.argwhere(data == label).tolist() labels_dict[str(label)] = coordinates

  1. 将字典转换为JSON并保存到文件:将标签字典转换为JSON格式,并保存到文件中。

python with open('output.json', 'w') as f: json.dump(labels_dict, f)

请注意,这种方法转换的JSON文件可能会很大,因为它包含了所有标签的坐标信息。如果你的标签数据较大,这可能导致文件过大。在使用JSON文件进行训练之前,你可能需要对其进行压缩或优化。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

python识别文件并转成json 将python数据转化为json 转载
可以参考下


python转化为json格式_python转json_嗷呜大嘴狼的博客-CSDN博客 在Python中将数据转化为JSON格式和将JSON格式数据转化为Python字典都非常简单,只需要使用json模块中的dumps和loads函数即可。在Python中将数据转化为JSON格式是一个非常常见的需求,Python中自带的json模块可以非常方便地实现这个需求。这样,我们就将Python字典数据转化为了JSON格式的字符串数据,该字符串数据可以方便地在前端与后端之间传输和处理。这样,我们就将JSON格式数据转化为了Python字典数据,可以方便地在Python中进行处理和使用。_python转json https://blog.csdn.net/qq_42151074/article/details/130691588

引用gpt作答:
要将使用3D Slicer勾画的NRRD标签文件转换为JSON文件,可以按照以下步骤进行操作:

  1. 首先,确保你的NRRD文件中包含正确的标签信息,例如肿瘤区域。
  2. 使用Python编程语言和相关库进行转换。你可以使用以下代码作为参考:
import numpy as np
import json
import nrrd

# 加载NRRD文件
data, header = nrrd.read('input.nrrd')

# 创建用于存储标签的字典
labels_dict = {}

# 遍历所有唯一的标签值
unique_labels = np.unique(data)
for label in unique_labels:
    # 获取标签的坐标
    coordinates = np.argwhere(data == label).tolist()

    # 将坐标添加到标签字典中
    labels_dict[str(label)] = coordinates

# 将标签字典转换为JSON并保存到文件
with open('output.json', 'w') as f:
    json.dump(labels_dict, f)

将上述代码中的input.nrrd替换为你的NRRD文件路径,并将生成的JSON文件保存为output.json

这段代码会读取NRRD文件中的标签信息,并将其转换为相应的JSON格式。请确保你的NRRD文件中存在标签,并且标签信息可以正确提取。