Разбор файлов DICOM в собственном Python

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

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

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

  1. нет необходимости создавать какие-либо внешние библиотеки C/C++.
  2. узнайте о формате файла DICOM.

9 ответов


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


Я использую 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-открыть похожие файлы и написать код для их сравнения в соответствии с различными аспектами: описание исследования, ширина окна и центр, пиксель представление и так далее.

удачи! :)


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

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

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

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

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


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

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)

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

данные КТ должны быть очень похожи.


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

http://gdcm.sourceforge.net/

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

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


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

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


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

Я попытался (в свободное время) написать парсер c dicom, сильно заимствуя у хорошего маленького рубинового парсера, с которым я столкнулся хитро под названием 'Рубин-Дицом'. На самом деле это очень читаемый код (я посмотрел на один из меньших ранее версии.)

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

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

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

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

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


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

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


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