我正在开发一个能够为PACS创建结构化报告的系统。
显然,为了创建一个DICOM实例(包含Report数据的文件),我需要三个UID用于Study,Series和Instance。 StudyUID和SeriesUID必须与为其创建的研究和系列相同。但对于SOPInstanceUID,我需要生成新的UID。
我在Pixelmed文档中看到过getNewSOPInstanceUID
方法,但我不熟悉Pixelmed来源。我需要一个算法或Python源。
答案 0 :(得分:9)
DICOM中有两种方法可以创建UID。一个基于已注册的UID根,另一个基于UUID。后一种方法在2012年通过CP-1156添加到DICOM标准中。可以通过将UUID转换为DICOM UID来创建诸如Study UID,Series UID,SOP Instance UID之类的UID。
大多数编程语言都支持创建UUID。下面的示例代码代码根据GUID值在C#中创建有效的DICOM UID。
public 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);
}
以下方法的效果相同,但速度提高了约5倍:
public static string ConvertGuidToUuidInteger(ref Guid value)
{
// ISO/IEC 9834-8, paragraph 6.3 (referenced by DICOM PS 3.5, B.2) defines how
// to convert a UUID to a single integer value that can be converted back into a UUID.
// The Guid.ToByteArray Method returns the array in a strange order (see .NET docs),
// BigInteger expects the input array in little endian order.
// The last byte controls the sign, add an additional zero to ensure
// the array is parsed as a positive number.
var octets = value.ToByteArray();
var littleEndianOrder = new byte[]
{ octets[15], octets[14], octets[13], octets[12], octets[11], octets[10], octets[9], octets[8],
octets[6], octets[7], octets[4], octets[5], octets[0], octets[1], octets[2], octets[3], 0 };
return "2.25." + new BigInteger(littleEndianOrder).ToString(CultureInfo.InvariantCulture);
}
答案 1 :(得分:3)
有关DICOM UID的详细信息,请参阅this答案。
A]增加计数器[不推荐]
一个简单的逻辑是获取SeriesInstanceUID并将其递增1。 所以说你的SeriesInstanceUID是“1.1.1.1.1”,那么你的SOPInstanceUID可能是“1.1.1.1。 2 ”或“1.1.1.1.1。 1 ”。< / p>
问题:
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:图片编号
yyyyMMddHHmmss:日期时间
zzzzzz:线程安全计数器/随机数
问题:
D] UUID派生的UID [推荐]
可以从根“2.25”生成UID。后跟通用唯一标识符(UUID)的十进制表示。
问题:
答案 2 :(得分:2)
根据DICOM standard(PS 3.5-2011,第61页),您需要一个orgroot和一个后缀。例子可以在这里找到(PS 3.5-2011第83页)。
另外不要忘记,必须使用&#39; \ 0&#39;填充UI字段(如果它们没有均匀的长度)字节而不是空格。
我建议像这样创建UID:
YOUR_ORGROOT.Year.Month.Day.Hour.Minute.Second.Milliseconds.StaticCounter
请注意限制是64个字符!
答案 3 :(得分:1)
我真的建议你去离开自己实施它。如今大多数语言确实提供了一个UUID库,不要重新发明轮子。 ESP。如果您要编写代码来提取MAC地址,那么在可移植 C中编写代码会非常复杂。
UUID不完全符合DICOM定义,因此您需要注册自己的组织根UID,然后使用生成的UUID填充,这会带来空间和时间唯一性条件。
YOUR_ORG_ROOT.CONVERTED_UUID
请注意您在Value Representation UI中有64个字节(已经很多,请参阅here)存储:
([0-9.]+)
Org Root
\0
(0二进制)。最后,因为您使用的是python,请使用uuid lib python-uuid。
以上内容应被视为标准中正式定义的替代实现:
将UUID直接转换为UID时,必须使用“2.25”。根