如何从原始心电图数据写入 DICOM 文件

mar*_*icz 7 .net c# dicom

我有 csv 格式的原始心电图电压样本,例如:

time    voltage (mV)
0.000   9.169110459
0.001   9.144672532
0.002   9.144672532
0.003   9.169110459
0.004   9.169110459
0.005   9.169110459
0.006   9.169110459
0.007   9.144672532
0.008   9.217986315
0.009   9.169110459
0.01    9.169110459
0.011   9.169110459
0.012   9.169110459
0.013   9.144672532
0.014   9.144672532
0.015   9.169110459
0.016   9.169110459
0.017   9.169110459
0.018   9.169110459
0.019   9.169110459
0.02    9.169110459
0.021   9.169110459
0.022   9.144672532
0.023   9.169110459
Run Code Online (Sandbox Code Playgroud)

并希望将其转换为 DICOM 文件,以便我可以在心电图查看器中查看它,例如 C# 的 ECG 工具包: https: //sourceforge.net/projects/ecgtoolkit-cs/

我将如何进行此转换?我已经进行了一些谷歌搜索,但没有找到能够从原始数据写入 dicom 文件的工具。

编辑:

我最终选择了 SCP 文件,因为这更容易。我最终使用上面的库创建了一个 scp 文件。代码如下:

using System;
using System.Linq;
using ECGConversion;
using ECGConversion.ECGDemographics;
using ECGConversion.ECGSignals;

namespace SCPWriter
{
    public static class CreateScpEcg
    {
        public static void CreateScpEcgFile(double[] voltages, int sampleRate, string directory, string patientId)
        {
            var rhythm = voltages;

            var filePath = directory + patientId;

            // get an empty ECG format file
            IECGFormat format = ECGConverter.Instance.getFormat("SCP-ECG");
            if (format != null)
            {
                // five required actions for the demographic info.
                format.Demographics.Init();
                format.Demographics.PatientID = patientId;
                format.Demographics.LastName = "";
                format.Demographics.TimeAcquisition = DateTime.Now;
                // make an AcquiringDeviceID object
                AcquiringDeviceID acqID = new AcquiringDeviceID(true);

                // can also specify your own acquiring device info
                Communication.IO.Tools.BytesTool.writeString("MYDEVI", acqID.ModelDescription, 0, acqID.ModelDescription.Length);
                // set the Acquiring Device ID (required)
                format.Demographics.AcqMachineID = acqID;
                // declare the signal part.
                var leadType = new LeadType[] { LeadType.I };
                var rhythmAVM = 1;
                var rhythmSPS = sampleRate;
                Signals sigs = new Signals((byte)leadType.Length);
                sigs.RhythmAVM = rhythmAVM;
                sigs.RhythmSamplesPerSecond = rhythmSPS;

                for (int i = 0; i < sigs.NrLeads; i++)
                {
                    // very important to assign signal.

                    sigs[i] = new Signal();
                    sigs[i].Type = leadType[i];
                    sigs[i].Rhythm = rhythm.Select(Convert.ToInt16).ToArray();
                    sigs[i].RhythmStart = 0;
                    sigs[i].RhythmEnd = rhythm.Length - 1;
                }
                // store signal to the format.
                if (format.Signals.setSignals(sigs) != 0)
                {
                    Console.Error.WriteLine("setSignals failed!");
                    return;
                }
                // write the file
                var outputFile = filePath + ".scp";


                ECGWriter.Write(format, outputFile, true);
                if (ECGWriter.getLastError() != 0)
                {
                    Console.Error.WriteLine("Writing failed: {0}!", ECGWriter.getLastErrorMessage());
                    return;
                }
            }
        }


    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我只对“线索 I”感兴趣,但您可以在这一行中添加更多线索: var LeadType = new LeadType[] { LeadType.I }

注意:这不是我的代码,这是来自上面 sourceforge 链接中的讨论之一。

kri*_*_sw 6

我的建议:

  1. 选择 DICOM 工具包 自行实现 DICOM 数据的二进制编码没有任何意义。
  2. 查看ECG 波形的 DICOM 信息对象定义 上面的链接定义了 12 导联波形对象。如果您的数据不是 12 导联,请选择此项。我提供的链接指向模块表,通过链接您可以看到此类对象强制/允许的属性。
  3. 您不可避免地必须了解一些有关 DICOM 术语的基础知识以及在标准中查找信息的位置。我强烈推荐将此文档作为起点。对于此任务,请确保了解信息对象定义 (IOD)、模块、属性类型(类型 1、2、3)和值表示 (VR)

然后就非常简单了。浏览您选择的 IOD(我提到的两个之一)的强制属性,并使用您选择的工具包填充它们。然后使用工具包将文件写入磁盘就完成了。确保将数据写入带有元标头的 DICOM 文件。一个好的工具包在将数据集写入磁盘时提供了该选项。

请注意,简单地将 DICOM 文件写入磁盘并不是“官方 DICOM 接口”。要在不同 DICOM 应用程序之间交换数据,您必须使用网络协议(在您的情况下为存储服务类)或创建 DICOM 一致媒体(这对使用的媒体、文件格式、文件名施加了一些限制,并且需要包含 DICOM 目录文件列出媒体内容)。

当您需要一个工具时,您可能需要查看DCMTK。有不同的方法可以完成任务。dcmdump 或 dcmodify 将是需要仔细研究的工具。然而,这样做很麻烦,您可能必须将 ECG 数据转换为 dcmtk 可以用来填充波形序列的格式。我并不是建议您这样做,但这可能是避免编写大量代码的一种方法。

  • 好答案!由于这是一个 C# 问题,因此最好注意有一些可用的开源 C# DICOM 工具包,例如 [fo-dicom](https://github.com/fo-dicom/fo-dicom)、[邪恶的 DICOM](https://github.com/rexcardan/Evil-DICOM) 和 [ClearCanvas](https://github.com/ClearCanvas/ClearCanvas)。 (2认同)