2012-04-24 209 views
3

我正在開發一個能夠爲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

回答

1

我真的建議你從自己實現它去離開。現在大多數語言都提供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

2

根據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

7

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

1

有關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支持更廣泛的範圍。