Разбор файлов DICOM на родном Python - PullRequest
19 голосов
/ 23 сентября 2008

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

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

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

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

Ответы [ 9 ]

21 голосов
/ 07 октября 2008

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

18 голосов
/ 01 мая 2009

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

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

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

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

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

Веселись! :)

9 голосов
/ 18 октября 2008

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

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

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

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

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

7 голосов
/ 26 января 2009

Библиотека 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)

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

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

4 голосов
/ 18 декабря 2008

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

http://gdcm.sourceforge.net/

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

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

3 голосов
/ 23 сентября 2008

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

Код меня не сильно впечатлил, но это нативный Python, читающий DICOM-файлы.

2 голосов
/ 16 февраля 2011

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

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

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

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

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

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

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

1 голос
/ 23 сентября 2008

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

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

0 голосов
/ 23 сентября 2008

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

...