Подтвердить что ты не робот

Разбирайте файлы DICOM на родном Python

Каков самый простой и наиболее-pythonic способ разобрать файл DICOM?

Было бы предпочтительнее использовать встроенную реализацию Python без использования библиотек, отличных от Python. DICOM является стандартным форматом файлов в цифровой медицинской визуализации (смотрите здесь для получения дополнительной информации).

Существуют некоторые библиотеки C/С++, которые поддерживают чтение (подмножество) файлов DICOM. У двух или трех из них даже есть привязки Python. Нативный анализатор Python будет служить для меня двумя целями:

  • Не нужно создавать какие-либо внешние библиотеки C/С++.
  • Узнайте о формате файла DICOM.
4b9b3361

Ответ 1

И на сегодняшний день есть еще один чистый пакет Python, который читает доступные файлы DICOM: pydicom

Ответ 2

Я использую pydicom в наши дни, и это скалы.

С этим легко начать играть:

import dicom 
data = dicom.read_file("yourdicomfile.dcm")

Чтобы получить интересный материал из этого объекта данных, как-то напоминающий dcmdump вывод:

for key in data.dir():        
    value = getattr(data, key, '')
    if type(value) is dicom.UID.UID or key == "PixelData":
        continue

    print "%s: %s" % (key, value)

Я думаю, что отличный способ узнать больше о формате dicom - открыть похожие файлы и написать код, чтобы сравнить их по различным аспектам: описание исследования, ширину окна и центр, представление пикселей и т.д.

Удачи!:)

Ответ 3

Если вы хотите узнать о формате DICOM, "Digital Imaging and Communications in Medicine" (DICOM): "Практическое введение и руководство по выживанию" Олега Пьяныха вполне читабельна и дает хорошее представление о ключевых концепциях DICOM. Springer-Verlag является издателем этой книги. Полный стандарт DICOM - это, конечно, конечная рекомендация, хотя это несколько более устрашающе. Он доступен от NEMA (http://medical.nema.org).

Формат файла на самом деле менее эзотерический, чем вы могли себе представить, и состоит из преамбулы, за которой следует последовательность элементов данных. Преамбула содержит текст ASCII "DICM" и несколько зарезервированных байтов, которые не используются. Следуя преамбуле, это последовательность элементов данных. Каждый элемент данных состоит из размера элемента, двухсимвольного кода ASCII, указывающего представление значения, тега DICOM и значения. Элементы данных в файле упорядочены по номерам тегов DICOM. Само изображение - это еще один элемент данных с представлением размера, значения и т.д.

Представления значений точно определяют, как интерпретировать значение. Это номер? Это строка символов? Если это символьная строка, она короткая или длинная и какие символы разрешены? Код представления значения говорит об этом.

Тег DICOM представляет собой 4-байтовый шестнадцатеричный код, состоящий из 2-байтового "группового" номера и 2-байтового "элемента". Номер группы - это идентификатор, который сообщает вам, к какой информационной сущности применяется тег (например, группа 0010 относится к пациенту, а группа 0020 относится к исследованию). Номер элемента идентифицирует интерпретацию значения (такие элементы, как идентификационный номер пациента, описание серии и т.д.). Чтобы узнать, как вы должны интерпретировать значение, ваш код просматривает тег DICOM в файле словаря.

Есть и другие детали, но это суть. Наверное, самая поучительная вещь, которую вы можете сделать, чтобы узнать о формате файла, - взять пример файла DICOM, посмотреть на него с помощью шестнадцатеричного редактора и пройти процесс разбора его мысленно. Я бы посоветовал не пытаться узнать о DICOM, взглянув на существующие реализации с открытым исходным кодом, по крайней мере на начальном этапе. Это скорее смущает, а не просветит. Получение большей картины важнее. Как только у вас будет большая картина, вы можете спуститься в тонкости.

Ответ 4

Библиотека pydicom, упомянутая выше, кажется большой библиотекой для доступа к структурам данных DICOM. Использовать его для доступа, например. RT DOSE, я думаю, что вы бы сделали что-то вроде

import dicom,numpy
dose = dicom.ReadFile("RTDOSE.dcm")
d = numpy.fromstring(dose.PixelData,dtype=numpy.int16)
d = d.reshape((dose.NumberofFrames,dose.Columns,dose.Rows))

а затем, если вы находитесь в майави,

from enthought.mayavi import mlab
mlab.pipeline.scalar_field(d)

Это дает неправильные координаты и масштабирование дозы, но принцип должен быть звуковым.

Данные CT должны быть очень похожими.

Ответ 5

Теперь появилась новая разработка gdcm:

http://gdcm.sourceforge.net/

Он поддерживает Java и С# поверх python.

Зачем писать еще одну реализацию dicom, когда вы можете централизовать одну реализацию на С++ и сделать ее доступной для многих разных языков

Ответ 6

Несколько лет назад я искал то же самое и нашел это: Python DICOM lib

Меня не впечатлил код, но он является родным Python, читающим файлы DICOM.

Ответ 7

DICOM - настоящая боль... даже когда производитель придерживается стандартов. Если вы пишете свою собственную библиотеку DICOM, вы найдете разных производителей. DICOMs фактически несовместимы с другими поставщиками [citation needed].

Я пробовал (в свободное время) писать парсер C dicom, сильно заимствуя из приятного маленького анализатора Ruby. Я наткнулся на хитро, назвав " ruby-dicom". Это действительно очень читаемый код (я посмотрел на одну из более ранних версий).

Самая большая головная боль пыталась собрать библиотеку тегов заголовков с ожидаемыми типами данных. Существуют теги, определенные стандартом, и теги поставщика. Файлы ruby-dicom содержат библиотеку тегов в текстовом формате, который можно легко проверить.

Я отказался от официальной литературы, так как меня интересовал только формат файла, который, кажется, находится только в одном из 10 или около того огромных PDF файлов.

Мои локальные файлы DICOM не сжимаются и выполняются стандартные простые для кодирования битовые устройства, но должны быть подготовлены к различным сжатиям и странным 12-битным изображениям, хранящимся в 8-битных контейнерах с большой или малой точностью и без дополнительных битов...

Я сдался, как только время стало очень скудным.

Python, вероятно, намного лучший выбор, чем C для этого стиля анализа заголовков, хотя...

Ответ 8

Существуют некоторые библиотеки (чаще всего реализуемые на C/С++) с привязками Python, например:

Однако я ищу собственную реализацию Python, чтобы узнать больше о формате DICOM.

Ответ 9

Интересно, что пытался попробовать оригинальный плакат и какие методы работали и не работали для него. Я никогда не работал с DICOM, но быстрый поиск Google для "DICOM python" дал несколько интересных результатов. Кажется, что этот проект: http://www.creatis.univ-lyon1.fr/Public/Gdcm/ должен доставить то, что вы хотите. Он имеет привязки python и довольно активный список рассылки.