Разбор файлов DICOM в собственном Python
каков самый простой и самый питонический способ анализа файла DICOM?
родная реализация Python без использования библиотек, отличных от Python, была бы намного предпочтительнее. DICOM-это стандартный формат файлов в цифровой медицинской визуализации (look здесь для получения дополнительной информации).
есть некоторые библиотеки C / C++, которые поддерживают чтение (подмножество) файлов DICOM. Два или три из них даже имеют привязки Python. Родной парсер на Python будет служить двум целям для я:
- нет необходимости создавать какие-либо внешние библиотеки C/C++.
- узнайте о формате файла 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 теперь происходит здесь:
Он поддерживает 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 и довольно активный список рассылки.