Разбор файлов DICOM на родном Python
Какой самый простой и самый питонический способ для анализа файла DICOM?
Нативная реализация Python без использования не-Python библиотек будет гораздо предпочтительнее. DICOM является стандартным форматом файлов в цифровых медицинских изображениях ( см. Дополнительную информацию здесь).
Существует несколько библиотек C/C++, которые поддерживают чтение (подмножество) файлов DICOM. Два или три из них даже имеют привязки Python. Нативный парсер Python будет служить двум целям для меня:
- Нет необходимости создавать какие-либо внешние библиотеки C/C++.
- Узнайте о формате файла DICOM.
9 ответов
И на сегодняшний день доступен еще один чистый пакет Python для чтения DICOM-файлов: pydicom
Я использую pydicom сильно в эти дни, и это качается.
Начать играть с ним довольно легко:
import dicom
data = dicom.read_file("yourdicomfile.dcm")
Чтобы получить интересные вещи из этого объекта "data", чем-то напоминающие вывод 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 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))
а затем, если вы находитесь в Mayavi,
from enthought.mayavi import mlab
mlab.pipeline.scalar_field(d)
Это дает неправильные координаты и масштабирование дозы, но принцип должен быть здравым.
Данные КТ должны быть очень похожими.
Более новая разработка gdcm теперь происходит здесь:
Он поддерживает Java и C# поверх Python.
Зачем писать еще одну реализацию dicom, если вы можете централизовать одну реализацию C++ и сделать ее доступной для очень многих разных языков
Несколько лет назад я искал то же самое и нашел это: Python DICOM lib
Код меня не сильно впечатлил, но это Python, читающий файлы DICOM.
DICOM - это настоящая боль... даже когда производитель придерживается стандартов. Если вы напишите свою собственную библиотеку DICOM, то обнаружите, что DICOM разных производителей фактически несовместимы с другими поставщиками.
Я попытался (в свое свободное время) написать синтаксический анализатор C dicom, позаимствовав у симпатичного маленького анализатора Ruby, которого я случайно обнаружил, под названием " ruby-dicom ". На самом деле это очень читаемый код (я посмотрел одну из более ранних версий).
Самая большая головная боль была попытка накопить библиотеку тегов заголовка с ожидаемыми типами данных. Существуют стандартные теги и теги поставщиков. Файлы ruby-dicom содержат библиотеку тегов в текстовом формате, которые можно легко проверить.
Я разочаровался в официальной литературе, так как меня интересовал только формат файла, который, кажется, только в одном из 10 или около того огромных PDF-файлов.
Мои локальные файлы DICOM не сжимаются и следуют стандартным легко кодируемым битовым схемам, но будьте готовы к различным сжатиям и странным 12-битным изображениям, хранящимся в 8-битных контейнерах с большим или меньшим порядком байтов и без битов заполнения...
Я сдался, как только время стало очень мало.
Python, вероятно, гораздо лучший выбор, чем C для этого стиля синтаксического анализа заголовка, хотя...
Есть некоторые библиотеки (чаще всего реализованные на C/C++) с привязками Python, например:
Тем не менее, я ищу нативную реализацию Python, чтобы узнать больше о формате файла DICOM.
Интересно, что попробовал оригинальный плакат и какие методы работали, а не работали для него. Я никогда не работал с DICOM, но быстрый поиск в Google по запросу "DICOM python" дал несколько интересных результатов. It seems that this project: http://www.creatis.univ-lyon1.fr/Public/Gdcm/ should deliver what you want. It has python bindings and a pretty active mailing list.