如何为DICOM文件生成SOPInstance UID?
我正在开发一个能够为PACS创建结构化报告的系统。如何为DICOM文件生成SOPInstance UID?
显然,为了创建一个DICOM实例(包含报表数据的文件),我需要三个用于Study,Series和Instance的UID。 StudyUID和SeriesUID必须与创建报告的学习和系列的相同。但对于SOPInstanceUID,我需要生成新的UID。
我在Pixelmed文档中看到了getNewSOPInstanceUID
方法,但我对Pixelmed源码不熟悉。我需要一个算法或Python源代码。
我真的建议你从自己实现它去离开。现在大多数语言都提供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个字符!
您在时间唯一性之前错过了空间条件,请参阅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);
}
虽然我喜欢这个答案的简单性,但应该注意,您是*限制*(可以这么说)你自己只有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支持更广泛的范围。
您需要的不仅仅是一种算法。 DICOM UID必须是全球唯一的,因此,您必须注册一个指定的权限以获取将用于您生成的所有UID的根干。 – Matt 2012-04-24 14:23:35