Вопрос

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

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

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

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

Решение

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

Другие советы

я использую Пидиком в наши дни тяжело, и это здорово.

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

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, изучая существующие реализации с открытым исходным кодом, по крайней мере на начальном этапе.Это скорее запутает, чем просветит.Более важно получить общую картину.Когда у вас будет общая картина, вы сможете погрузиться в тонкости.

Библиотека Пидиком упомянутая выше кажется отличной библиотекой для доступа к структурам данных 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)

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

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

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

http://gdcm.sourceforge.net/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top