mto*_*loo 3 python uuid uniqueidentifier dicom
我正在开发一个能够为PACS创建结构化报告的系统.
显然,为了创建一个DICOM实例(包含Report数据的文件),我需要三个UID用于Study,Series和Instance.StudyUID和SeriesUID必须与为其创建的研究和系列相同.但对于SOPInstanceUID,我需要生成新的UID.
我getNewSOPInstanceUID在Pixelmed文档中看过方法,但我不熟悉Pixelmed源代码.我需要一个算法或Python源.
Vic*_*rks 10
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);
}
Run Code Online (Sandbox Code Playgroud)
以下方法执行相同但速度提高约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);
}
Run Code Online (Sandbox Code Playgroud)
有关 DICOM UID 的更多详细信息,请参阅此答案。
A] 增加计数器 [不推荐]
一个简单的逻辑是让你SeriesInstanceUID和1递增呢?所以说,你SeriesInstanceUID为“1.1.1.1.1”,那么你的SOPInstanceUID可能是“1.1.1.1。2 ”或“1.1.1.1.1。1 ”。
问题:
B] 日期时间【不推荐】
通常使用的其他技术是将时间戳(带刻度)附加到组织根。
问题:
C] 更复杂 [推荐]
1.2.840.xxxxx.30.152.99999.235.20.100.yyyyMMddHHmmss.zzzzzz
Run Code Online (Sandbox Code Playgroud)
在哪里:
1.2.840.xxxxx:组织根
30:应用程序 ID
152:应用程序版本
99999:安装/位置 ID
235:研究 ID
20:序列号
100:图像编号
yyyyMMddHHmmss:日期时间
zzzzzz:线程安全计数器/随机数
问题:
D] UUID 派生 UID [推荐]
UID 可以从根“2.25”生成。后跟通用唯一标识符 (UUID) 的十进制表示。
问题:
mal*_*lat -1
我真的建议你不要自己实现它。现在大多数语言都提供了 UUID 库,不要重新发明轮子。特别是。如果您要编写代码来提取 MAC 地址,那么用可移植的C 语言编写它可能会非常复杂。
UUID并不完全符合 DICOM 定义,因此您需要注册自己的组织根 UID,然后简单地填充生成的 UUID,从而带来空间和时间唯一性条件。
YOUR_ORG_ROOT.CONVERTED_UUID
Run Code Online (Sandbox Code Playgroud)
请注意,您有 64 个字节(已经足够了,请参阅此处)用于值表示 UI 中的存储:
([0-9.]+)Org Root\0如果需要,用(0 二进制)填充。最后,由于您使用的是 python,请使用 uuid lib python-uuid。
上述内容应被视为标准中正式定义的替代实现:
将 UUID 直接转换为 UID 时,必须使用“2.25”。根。
| 归档时间: |
|
| 查看次数: |
7009 次 |
| 最近记录: |