我有csv格式的原始ecg电压样本,例如:
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
并希望将其转换为DICOM文件,以便我可以在ecg查看器中查看它,例如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;
}
}
}
}
}
注意:我只对“引导我”感兴趣,但您可以在此行中添加更多潜在客户: var leadType = new LeadType [] {LeadType.I}
注意:这不是我的代码,这来自上面sourceforge链接中的一个讨论。
答案 0 :(得分:3)
我的建议:
然后它非常直接。浏览您选择的IOD的强制属性(我提到的两个中的一个),并使用您选择的工具包填充它们。然后使用工具包将文件写入磁盘,您就完成了。确保将数据写为带有元标题的DICOM文件。一个好的工具包在将数据集写入磁盘时提供了该选项。
请注意,简单地将DICOM文件写入磁盘不是“官方DICOM接口”。要在不同的DICOM应用程序之间交换数据,您必须使用网络协议(在您的情况下为Storage Service Class)或创建符合DICOM标准的媒体(这会对使用的媒体,文件格式,文件名提出一些限制,并要求包含DICOM目录文件列出媒体内容。)
当您要求使用工具时,您可能需要查看DCMTK。有不同的方法来完成任务。 dcmdump或dcmodify将成为深入了解的工具。但是,这样做很麻烦,您可能需要将ECG数据转换为dcmtk可用于填充波形序列的格式。我并不建议你这样做,但这可能是一种避免编写大量代码的方法。