如何将多个 DICOM 文件转换为单个 JSON 序列

如何将多个 DICOM 文件转换为单个 JSON 序列

此教程展示了如何将多个 DICOM 文件转换为一个单一的 JSON 序列,使用 C#. 这种方法是理想的数据工程师谁需要出口 Dicom 金属数据分析工具,数据库,或数据管道。

JSON Array 出口的好处

  • 数据处理(Bulk Data Processing):- 在单一操作中将多个DICOM记录导入数据库。

  • 分析师准备好:- JSON 序列可以直接上传到 Python、Spark 或数据库。

    • 合成输出*:- 包含所有数据的单一文件简化了数据管理。

原标题:准备环境

  • 设置 Visual Studio 或任何兼容的 .NET IDE.
  • 创建一个新的 .NET 8 控制台应用程序项目。
  • 在 NuGet Package Manager 中安装 Aspose.Medical。
  • 准备包含多个 DICOM 文件的文件夹。

步骤指南将多个 DICOM 文件转换为 JSON Array

步骤1:安装 Aspose.Medical

使用 NuGet 将 Aspose.Medical 图书馆添加到您的项目中。

Install-Package Aspose.Medical

步骤2:包含必要的名称空间

在您的代码中添加所需的名称空间的参考.

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;

步骤3:加载多DICOM文件

将 DICOM 文件从文件夹上传到集合。

string inputFolder = @"C:\DicomStudies";
string[] dicomPaths = Directory.GetFiles(inputFolder, "*.dcm");

List<DicomFile> dicomFiles = new();
foreach (string path in dicomPaths)
{
    dicomFiles.Add(DicomFile.Open(path));
}

步骤4:提取数据集

从上传的文件中创建一系列数据集对象。

Dataset[] datasets = dicomFiles
    .Select(dcm => dcm.Dataset)
    .ToArray();

步骤5:重定向到JSON Array

使用 DicomJsonSerializer.Serialize 与Dataset Array。

string jsonArray = DicomJsonSerializer.Serialize(datasets, writeIndented: true);

步骤6:保存 JSON Array

将 JSON 序列保存到文件中。

File.WriteAllText("dicom_studies.json", jsonArray);
Console.WriteLine($"Exported {datasets.Length} DICOM datasets to JSON array.");

完整代码示例

下面是一个完整的例子,展示如何将多个 DICOM 文件转换为 JSON 序列:

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;

string inputFolder = @"C:\DicomStudies";
string outputFile = "dicom_studies.json";

// Get all DICOM files
string[] dicomPaths = Directory.GetFiles(inputFolder, "*.dcm");
Console.WriteLine($"Found {dicomPaths.Length} DICOM files.");

// Load all files
List<DicomFile> dicomFiles = new();
foreach (string path in dicomPaths)
{
    try
    {
        dicomFiles.Add(DicomFile.Open(path));
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Skipping invalid file: {Path.GetFileName(path)}");
    }
}

// Build dataset array
Dataset[] datasets = dicomFiles
    .Select(dcm => dcm.Dataset)
    .ToArray();

// Serialize to JSON array
string jsonArray = DicomJsonSerializer.Serialize(datasets, writeIndented: true);

// Save to file
File.WriteAllText(outputFile, jsonArray);

Console.WriteLine($"Successfully exported {datasets.Length} datasets to {outputFile}");

示例 JSON Array 输出

输出 JSON 系列看起来如下:

[
  {
    "00080005": { "vr": "CS", "Value": ["ISO_IR 100"] },
    "00100010": { "vr": "PN", "Value": [{ "Alphabetic": "DOE^JOHN" }] },
    "00100020": { "vr": "LO", "Value": ["12345"] }
  },
  {
    "00080005": { "vr": "CS", "Value": ["ISO_IR 100"] },
    "00100010": { "vr": "PN", "Value": [{ "Alphabetic": "SMITH^JANE" }] },
    "00100020": { "vr": "LO", "Value": ["67890"] }
  }
]

使用LINQ处理大数据集

为了更好地管理大数据集的内存,请使用 LINQ 预测:

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;

string inputFolder = @"C:\LargeDicomArchive";
string outputFile = "large_export.json";

// Process files lazily to manage memory
Dataset[] datasets = Directory.GetFiles(inputFolder, "*.dcm")
    .Select(path => 
    {
        try
        {
            return DicomFile.Open(path).Dataset;
        }
        catch
        {
            return null;
        }
    })
    .Where(ds => ds != null)
    .ToArray()!;

string jsonArray = DicomJsonSerializer.Serialize(datasets, writeIndented: true);
File.WriteAllText(outputFile, jsonArray);

Console.WriteLine($"Exported {datasets.Length} datasets.");

添加进展报告

对于大型赛事,添加进展报告:

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;

string inputFolder = @"C:\DicomStudies";
string[] dicomPaths = Directory.GetFiles(inputFolder, "*.dcm");

List<Dataset> datasets = new();
int processed = 0;
int total = dicomPaths.Length;

foreach (string path in dicomPaths)
{
    try
    {
        DicomFile dcm = DicomFile.Open(path);
        datasets.Add(dcm.Dataset);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error: {Path.GetFileName(path)} - {ex.Message}");
    }
    
    processed++;
    if (processed % 100 == 0 || processed == total)
    {
        Console.WriteLine($"Progress: {processed}/{total} ({processed * 100 / total}%)");
    }
}

string jsonArray = DicomJsonSerializer.Serialize(datasets.ToArray(), writeIndented: true);
File.WriteAllText("export.json", jsonArray);

Console.WriteLine($"Export complete: {datasets.Count} datasets.");

将 JSON Array 引入分析工具

Python 例子

import json
import pandas as pd

# Load the exported JSON array
with open('dicom_studies.json', 'r') as f:
    dicom_data = json.load(f)

# Convert to DataFrame for analysis
df = pd.json_normalize(dicom_data)
print(df.head())

下载到MongoDB

// Using mongoimport
// mongoimport --db medical --collection studies --jsonArray --file dicom_studies.json

记忆考虑

当使用非常大的数据集时:

  • Batches的过程:将文件分成100至500个文件的组件。
  • Stream Output:使用基于流的序列化,用于非常大的轴承。
  • 配置文件:确保DicomFile物品在提取数据集后被删除。
// Batch processing example
int batchSize = 100;
string[] allFiles = Directory.GetFiles(inputFolder, "*.dcm");
int batchNumber = 0;

for (int i = 0; i < allFiles.Length; i += batchSize)
{
    string[] batch = allFiles.Skip(i).Take(batchSize).ToArray();
    Dataset[] datasets = batch
        .Select(path => DicomFile.Open(path).Dataset)
        .ToArray();
    
    string batchJson = DicomJsonSerializer.Serialize(datasets, writeIndented: true);
    File.WriteAllText($"batch_{batchNumber++}.json", batchJson);
}

更多信息

  • JSON 序列格式非常适合大量进口到 NoSQL 数据库。
  • 考虑为存储效率压缩大型 JSON 文件。
  • 对于流动场景,请考虑使用 NDJSON (新线无限 JSON) 格式。

结论

此教程向您展示了如何将多个 DICOM 文件转换为一个单一的 JSON 序列在 C# 使用 Aspose.Medical. 这种方法允许有效的大量数据出口分析,数据库进口和数据管道集成。

 中文