如何为DICOM文件生成SOPInstance UID?

问题描述:

我正在开发一个能够为PACS创建结构化报告的系统。如何为DICOM文件生成SOPInstance UID?

显然,为了创建一个DICOM实例(包含报表数据的文件),我需要三个用于Study,Series和Instance的UID。 StudyUID和SeriesUID必须与创建报告的学习和系列的相同。但对于SOPInstanceUID,我需要生成新的UID。

我在Pixelmed文档中看到了getNewSOPInstanceUID方法,但我对Pixelmed源码不熟悉。我需要一个算法或Python源代码。

+4

您需要的不仅仅是一种算法。 DICOM UID必须是全球唯一的,因此,您必须注册一个指定的权限以获取将用于您生成的所有UID的根干。 – Matt 2012-04-24 14:23:35

我真的建议你从自己实现它去离开。现在大多数语言都提供UUID库,不要重新发明*。 ESP。如果你要编写代码来提取MAC地址,这可能是非常复杂的书写它在便携式 C.

UUID不完全符合DICOM定义,所以你需要注册自己的组织根UID,然后只需填充生成的UUID,即可带来空间和时间的唯一性条件。

YOUR_ORG_ROOT.CONVERTED_UUID 
你有64个字节

讲究(这是很多准备,请参阅here),用于存储在值表示UI:

  • 转换UUID的十六进制形式,以VR:UI定义([0-9.]+)
  • 修剪(在此操作中可能引入冗余)
  • 选择一个短片Org Root
  • Pa d与\0(0二进制)如果需要。

最后,因为您使用的是Python,请使用uuid lib python-uuid

根据DICOM standard(PS 3.5-2011第61页),您需要一个orgroot和一个后缀。例子可以在这里找到(PS 3.5-2011第83页)。

另外不要忘记,UI字段必须用'\ 0'字节填充(如果它们没有均匀长度),而不是空格。

我建议创建UID是这样的:

YOUR_ORGROOT.Year.Month.Day.Hour.Minute.Second.Milliseconds.StaticCounter

当心限制为64个字符!

+0

您在时间唯一性之前错过了空间条件,请参阅RFC 4122.应该更像:YOUR_ORGROOT.SPATIAL.TIME – malat 2013-01-07 12:03:24

DICOM有两种创建UID的方法。一个基于注册的UID根,另一个基于UUID。后面的方法用CP-1156添加到DICOM标准中。研究UID,系列UID,SOP实例UID的UID可以通过将UUID转换为DICOM UID来创建。

大多数编程语言都支持创建UUID。以下示例代码代码基于GUID值在C#中创建有效的DICOM UID。

private static string GuidToUidStringUsingStringAndParse(Guid value) 
{ 
    var guidBytes = string.Format("0{0:N}", value); 
    var bigInteger = BigInteger.Parse(guidBytes, NumberStyles.HexNumber); 
    return string.Format(CultureInfo.InvariantCulture, "2.25.{0}", bigInteger); 
} 
+1

虽然我喜欢这个答案的简单性,但应该注意,您是*限制*(可以这么说)你自己只有UUID的128位部分。虽然DICOM UID提供了更广泛的范围...... – malat 2016-09-12 13:41:49

有关DICOM UID的更多详细信息,请参阅this答案。

A]递增计数器[不推荐]

一个简单的逻辑是让你SeriesInstanceUID和1 增加呢?所以说,你SeriesInstanceUID为“1.1.1.1.1”,那么您的SOPInstanceUID可能是“1.1.1.1。”或“1.1.1.1.1。”。

  • 当实例被删除,下一个实例被创建,不应使用较早的计数器:

    问题。

  • 在多线程环境中,应该有足够的注意。
  • 不保证跨不同系统/应用程序的唯一性。

B]日期时间[不推荐]通常使用

其他技术是时间戳(蜱)追加到组织根。

问题:

  • 多线程环境中是一个问题。
  • 系统时钟可能会关闭。
  • 不同系统/应用程序之间的唯一性无法得到保证。

C]更复杂的[推荐]

1.2.840.xxxxx.30.152.99999.235.20.100.yyyyMMddHHmmss.zzzzzz 

其中:

1.2.840。XXXXX:组织根
30:应用程序ID
152:应用程序版本
99999:安装/位置ID
235:研究ID
20:系列编号
100:图片编号
yy年月日:日期时间
ZZZZZZ:线程安全的计数器/随机数

问题:

  • 算法可以在故障情况下系统时钟熄灭;这进一步受到线程安全计数器/随机数的保护。远程可能性;需要小心谨慎。

d] UUID衍生UID [推荐]

UID可从根中产生 “2.25”。后跟一个通用唯一标识符(UUID)的十进制表示。

问题:

  • 这可能是适当的动态创建的UID,如SOP实例UID的,但不适合于设计过程中所确定的UID,诸如私人SOP类或传送语法的UID,或实现类的UID。
  • UID仅限于28位。 DICOM UID支持更广泛的范围。