Как сгенерировать SOPInstance UID для файла DICOM?

Я разрабатываю систему, которая сможет создавать структурированный отчет для PACS.

Очевидно, чтобы создать экземпляр DICOM (файл, содержащий данные отчета), мне нужны три UID для Study, Series и Instance. StudyUID и SeriesUID должны быть такими же, как и для исследования и серии, для которых создан отчет. Но для SOPInstanceUID мне нужно создать новый UID.

Я видел метод getNewSOPInstanceUID в документации Pixelmed, но я не знаком с источником Pixelmed. Мне нужен алгоритм или источник Python.

4 Solutions collect form web for “Как сгенерировать SOPInstance UID для файла DICOM?”

Я бы действительно предложил вам уйти от его реализации. В настоящее время большинство языков предоставляют библиотеку UUID, не изобретают велосипед. Особенно если вы собираетесь писать код для извлечения MAC-адреса, это может быть очень сложным, записывая его в переносном C.

UUID точно не соответствуют определению DICOM, поэтому вам нужно зарегистрировать свой собственный корневой UID организации, а затем просто наполнить сгенерированным UUID, который приведет к пространственному и временному условию уникальности.

 YOUR_ORG_ROOT.CONVERTED_UUID 

Обратите внимание, что у вас есть 64 байта (это уже много, см. Здесь ) для хранения в интерфейсе представления значений:

  • Преобразование шестнадцатеричных обозначений UUID в VR: определение пользовательского интерфейса ([0-9.]+)
  • Обрезать с особой осторожностью (вы можете ввести избыточность во время этой операции)
  • Выберите короткий Org Root
  • Pad с \0 (0 двоичный), если необходимо.

Наконец, поскольку вы используете python, используйте uuid lib python-uuid .

В DICOM есть два способа создания UID. Один основан на зарегистрированном корне UID и один на основе UUID. Более поздний метод был добавлен к стандарту DICOM с CP-1156. UID для UID исследования, UID UID, UID экземпляра SOP могут быть созданы путем преобразования UUID в DICOM UID.

Большинство языков программирования имеют встроенную поддержку для создания UUID. Пример кода кода ниже создает допустимый идентификатор DICOM в C # на основе значения GUID.

 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); } 

В соответствии со стандартом DICOM (PS 3.5-2011, стр. 61) вам нужен orgroot и суффикс. Примеры можно найти здесь (PS 3.5-2011).

Также не забывайте, что поля пользовательского интерфейса должны быть дополнены (если они не имеют четной длины) с байтами '\ 0', а не с пробелами.

Я бы предложил создать UID следующим образом:

YOUR_ORGROOT.Year.Month.Day.Hour.Minute.Second.Milliseconds.StaticCounter

Остерегайтесь, что предел составляет 64 символа!

Дополнительную информацию о DICOM UID см. В этом ответе.

A] Увеличение счетчиков [Не рекомендуется]

Одна простая логика состоит в том, чтобы получить свой идентификатор SeriesInstanceUID и увеличить его. 1. Скажите, что ваш SeriesInstanceUID равен «1.1.1.1.1», тогда ваш SOPInstanceUID может быть «1.1.1.1. 2 » или «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: Идентификатор приложения
152: Версия приложения
99999: идентификатор установки / местоположения
235: Идентификатор исследования
20: Серийный номер
100: номер изображения
yyyyMMddHHmmss: Дата Время
zzzzzz: счетчик потоков / случайный номер

Проблемы:

  • Алгоритм может выйти из строя, если системные часы погаснут. Удаленная возможность; нужно проявлять осторожность.

D] UUID Производный UID [РЕКОМЕНДУЕТСЯ]

UID может быть сформирован из корня «2.25». а затем десятичное представление универсально уникального идентификатора (UUID).

Проблемы:

  • Это может быть целесообразно для динамически созданных UID, таких как UID экземпляра SOP, но не подходит для UID, определенных во время проектирования, таких как частные идентификаторы SOP класса или синтаксиса передачи или UID класса реализации.
  • UID ограничен только 28 бит. DICOM UID поддерживает более широкий диапазон.
  • Python. Зачем использовать что-либо другое, кроме uuid4 () для уникальных строк?
  • Кассандра / Пикасса: получение случайных строк
  • Возвращает массив UUID PosgreSQL в виде списка с psycopg2
  • cutdown uuid далее, чтобы сделать короткую строку
  • Когда следует использовать uuid.uuid1 () vs. uuid.uuid4 () в python?
  • Является ли python uuid1 последовательным как временные метки?
  • Как создать GUID / UUID в Python
  • Python - лучший язык программирования в мире.