Невозможно определить идентификатор среза / идентификатор серии с помощью VTK (vtkDICOMImageReader)

У меня есть два вида данных DICOM, первый работает с моим существующим кодом (на котором я его построил), но я не могу импортировать второй.

Первый стиль имеет папку нижнего уровня со всеми фрагментами от одного сканирования в этой папке (в упорядоченных файлах ".dcm"). Я просто указываю vtk на каталог, используя этот код:

vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
reader->SetDirectoryName(dicomDirectory.c_str());
reader->Update();
vtkSmartPointer<vtkImageData> sliceData = reader->GetOutput();
double tempIntensity = sliceData->GetScalarComponentAsDouble(x, y, z, 0);

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


Однако это зависит от того, как VTK интерпретирует каталог. Здесь говорится: что есть некоторые подробности о на что способен VT управление (подробное описание, предупреждение) с точки зрения данных DICOM. (Я не уверен, что мои текущие данные нарушают эту спецификацию)

Второй стиль DICOM имеет структуру каталогов, в которой нижний уровень папок называется A-Z, и каждый из них содержит 25 файлов (без суффикса) с именами (в каждой папке) Z01-Z25. Я могу открывать файлы по отдельности, используя:

reader->SetFileName(tempFile.c_str());

Вместо указания каталога. Если я прочитал все 25 в одной из нижних папок, это смесь разных упорядоченных фрагментов из разных сканирований. Я был готов настроить функцию для просмотра всех папок и файлов в каталоге, чтобы найти и собрать все фрагменты, связанные с одним сканированием, но до сих пор мне не удалось найти / надлежащим образом реализовать функцию в vtkDICOMImageReader, чтобы:

A: определить, в каком уникальном наборе серий срезов я нахожусь (метка серии)

ни

B: определить мой текущий номер среза в серии, а также общее количество серий (количество срезов / общее количество срезов в серии)


При необходимости я могу опубликовать дополнительные источники, но в основном я пытался отслеживать все параметры в «reader» и «sliceData» при загрузке фрагментов из разных серий и пока еще не получил ничего, что могло бы предоставить мне вышеуказанные данные. Я предполагаю, что либо я не обновляю должным образом между загрузками срезов, либо не смотрю на правильные параметры объекта.

Мы будем очень благодарны за любую информацию о том, что я делаю неправильно с точки зрения кода, или даже за мое плохое понимание структуры DICOM!

ps: я работаю на c ++, но почти уверен, что использование похоже на Python


person Sneaky Polar Bear    schedule 18.01.2018    source источник
comment
Вы пробовали библиотеку vtk-dicom? (не vtkDICOMImageReader, а vtkDICOMReader) Это намного интереснее для Dicoms, проверьте это здесь: dgobbi.github.io/vtk-dicom/doc/api/directory.html   -  person MrPedru22    schedule 19.01.2018
comment
о, щелчок ... нет, я не делал. глядя на это сейчас   -  person Sneaky Polar Bear    schedule 19.01.2018
comment
извините, я только начинаю работать с открытым исходным кодом ... является ли vtkDICOMReader дополнительным кодом, который мне нужно добавить в библиотеку vtk?   -  person Sneaky Polar Bear    schedule 19.01.2018
comment
: / У меня vtk 8.0, но кажется, что он не загружается в vtkDICOMReader, я посмотрю на него дальше.   -  person Sneaky Polar Bear    schedule 19.01.2018
comment
Вы пользуетесь Cmake? У вас есть возможность скомпилировать vtk dicom   -  person MrPedru22    schedule 19.01.2018
comment
См. Приложение по этой ссылке: dgobbi.github.io/vtk- dicom / doc / vtk-dicom.pdf   -  person MrPedru22    schedule 19.01.2018


Ответы (3)


Как я писал в комментариях, в этом случае vtk-dicom больше подходит для ваших нужд. Вот несколько полезных ссылок:

person MrPedru22    schedule 19.01.2018

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

Ваш второй пример звучит так, как будто существует более сложная структура, которая может содержать несколько серий и, возможно, такие вещи, как скаутские изображения или даже файлы Dicom, не относящиеся к типу изображений. Для работы с этим типом данных вам понадобится некоторая логика для чтения метаданных и выяснения, какие файлы вам интересны и как их собрать. Метаданные для всего набора содержатся в одном файле с именем «dicomdir», который должен находиться в каталоге верхнего уровня. Эти данные дублируются с данными в заголовках файлов .dcm, но чтение из этого файла избавляет вас от необходимости сканировать заголовки каждого файла по отдельности.

VTK - это библиотека для обработки и отображения изображений, а не система Dicom. Я не уверен, что они хорошо поддерживают сложные структуры каталогов. Вы можете попробовать reader->SetFileName('dicomdir'); и посмотреть, есть ли у них логика для автоматической обработки этого, но я был бы немного удивлен, если бы это сработало.

Если вы собираетесь работать со сложными многосерийными данными, подобными этой, вам, вероятно, потребуется использовать другую библиотеку для извлечения нужной информации. Я очень рекомендую DCMTK. Это отличная библиотека C ++ с открытым исходным кодом для работы с Dicom, только не ожидайте, что она будет супер простой.

person bivouac0    schedule 18.01.2018
comment
Да, у второго действительно есть скаутский файл. ty для подсказки по файлу dicomdir, я нашел его и посмотрю, что я могу получить от него. tbh Я не пристрастен к vtk, я просто хочу, чтобы он был (потому что pcl его использует), и я установлю DCMTK и опробую его, спасибо! - person Sneaky Polar Bear; 19.01.2018
comment
Пытался установить имя файла в файл DICOMDIR, и он выплюнул его обратно. Я начну настраивать DCMTK сейчас - person Sneaky Polar Bear; 19.01.2018
comment
Я должен указать, что есть утилита командной строки под названием dcmdump (она является частью DCMTK), которая будет печатать содержимое dicomdir или отдельных файлов dicom. Это будет намного проще, чем использовать код C ++ напрямую, если вы просто пытаетесь выяснить, какие файлы загружать. - person bivouac0; 19.01.2018
comment
... idk, проблема в том, что мне нужно загрузить несколько сотен файлов. Также можно реализовать лучший инструмент для импорта данных. - person Sneaky Polar Bear; 19.01.2018

Вы не должны предполагать содержимое файла DICOM по его имени или положению в структуре каталогов.

Вместо этого корень папки DICOM должен содержать файл DICOMDIR, который содержит список файлов и их взаимосвязь (например, объекты пациентов содержат объекты исследований, которые содержат серии, а затем изображения).

Я не знаю, предлагает ли VTK способ чтения и интерпретации файлов DICOMDIR; в противном случае вы можете попытаться интерпретировать их с помощью dcmtk или Imebra.

Раскрытие: я автор Imebra

person Paolo Brandoli    schedule 19.01.2018
comment
Вы совершенно правы, и спасибо вам. Как вы все заявили, мне не хватало файла DICOMDIR. Все три библиотеки vtkDICOM, dcmtk и Imebra могут читать этот файл и предоставлять структурированный доступ. Поскольку я уже использую vtk в другом месте своего проекта, проще всего было просто добавить vtkDICOM, а не добавлять другую библиотеку с открытым исходным кодом ... - person Sneaky Polar Bear; 19.01.2018