5

PACSの構造化されたレポートを作成できるシステムを開発しています。

明らかに、DICOMインスタンス(レポートデータを含むファイル)を作成するには、スタディ、シリーズ、インスタンスの3つのUIDが必要です。StudyUIDとSeriesUIDは、レポートが作成されるスタディとシリーズのものと同じである必要があります。ただし、SOPInstanceUIDの場合、新しいUIDを生成する必要があります。

Pixelmedのドキュメントでメソッドを見getNewSOPInstanceUIDたことがありますが、Pixelmedのソースに精通していません。アルゴリズムまたはPythonソースが必要です。

4

4 に答える 4

12

DICOMでUIDを作成する方法は2つあります。1つは登録済みのUIDルートに基づいており、もう1つはUUIDに基づいています。後者の方法は、2012年にCP-1156でDICOM標準に追加されました。スタディUID、シリーズUID、SOPインスタンスUIDなどのUIDは、UUIDをDICOMUIDに変換することで作成できます。

ほとんどのプログラミング言語には、UUIDを作成するためのサポートが組み込まれています。以下のサンプルコードコードは、GUID値に基づいてC#で有効なDICOMUIDを作成します。

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);
}
于 2013-01-04T22:20:18.257 に答える
6

DICOM UIDの詳細については、この回答を参照してください。

A]カウンターを増やす[非推奨]

単純なロジックの1つは、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

どこ:

1.2.840.xxxxx:組織ルート
30:アプリケーションID
152:アプリケーションバージョン
99999:インストール/場所ID
235:スタディID
20:シリーズ番号
100:イメージ番号
yyyyMMddHHmmss:日時
zzzzzz:スレッドセーフカウンター/乱数

問題:

  • システムクロックがオフになると、アルゴリズムが失敗する可能性があります。これは、スレッドセーフカウンター/乱数によってさらに保護されます。リモートの可能性; 少し注意する必要があります。

D]UUID派生UID[推奨]

UIDはルート「2.25」から生成される場合があります。その後に、Universally Unique Identifier(UUID)の10進表現が続きます。

問題:

  • これは、SOPインスタンスUIDなどの動的に作成されたUIDには適切な場合がありますが、プライベートSOPクラスや転送構文UID、実装クラスUIDなどの設計中に決定されたUIDには適切ではありません。
  • UIDは128ビットのみに制限されています。DICOMUIDはより広い範囲をサポートします。
于 2017-09-20T08:12:22.830 に答える
2

DICOM規格(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文字であることに注意してください!

于 2012-04-25T12:45:38.080 に答える
-1

自分で実装するのはやめましょう。最近のほとんどの言語はUUIDライブラリを提供しており、車輪の再発明はしていません。Esp。MACアドレスを抽出するコードを作成する場合、ポータブルCでの作成は非常に複雑になる可能性があります。

UUIDはDICOM定義に正確に適合しないため、独自の組織ルートUIDを登録してから、空間および時間の一意性条件をもたらす生成されたUUIDで埋める必要があります。

YOUR_ORG_ROOT.CONVERTED_UUID

値表現UIに保存するための64バイト(すでに十分です。ここを参照)があることに注意してください。

  • UUIDの16進表記をVRに変換:UI定義([0-9.]+)
  • 細心の注意を払ってトリミングします(この操作中に冗長性を導入する場合があります)
  • 短いものを選択してくださいOrg Root
  • 必要に応じて\0(0バイナリ)で埋めます。

最後に、Pythonを使用しているので、uuidlibpython -uuidを使用します。


上記は、規格で公式に定義されているものの代替実装と見なす必要があります。

UUIDをUIDに直接変換する場合は、「2.25」を使用する必要があります。根。

于 2013-01-07T12:10:54.660 に答える