Изображения DICOM, считанные с помощью GDCMSeriesFileNames или списка путей - PullRequest
0 голосов
/ 12 июня 2018

Я использую SimpleITK для анализа динамических данных PET.У меня есть папка с 148 * N изображениями (с N числом кадров моего Dynamic PET), и я хочу разделить изображения каждого кадра.Во-первых, я создал одну подпапку для каждого кадра с соответствующими изображениями.

>folder #Folder of dynamic data
   >subfolder1 #Subfolder with images of Frame 1
      >image1, image2, ..., image148
   >subfolder2 #Subfolder with images of Frame 2
      >image149 image 150, ..., image296

Я читал мои изображения следующим образом:

series_reader = sitk.ImageSeriesReader()
image = sitk.ReadImage(series_reader.GDCMSeriesFileNames(path_subfolder1))

Создание всех этих подпапок не очень удобно для пользователяпоэтому я пытаюсь сохранить все пути изображений в списках:

frame1 = [image1, ..., image148]
frame2 = [image149, ..., image296]
...
frame_list = [frame1, frame2, ..., frameN]

И читать изображения так:

image = sitk.ReadImage(frame_list[0])

Проблема в том, что когда я смотрю на значениеВоксель, расположенный в тех же координатах (x, y, z), я не получаю одинаковое значение с 2 методами.Похоже, что series_reader.GDCMSeriesFileNames() SimpleITK извлекает некоторую информацию об изображении DICOM, например, Origin.

Какую информацию извлекает SimpleITK для создания его изображений с series_reader.GDCMSeriesFileNames(), которые мне нужны для получения точно такого же изображения?Или есть другой способ получить одно и то же изображение, используя список путей?

PS: в этом посте все переменные с именем 'image' являются путями к изображениям, а не объектом SimpleITK Image.

Редактировать: В моем случае все мои кадры имеют одинаковый номер серии, поэтому я не могу использовать series_reader.GDCMSeriesFileNames(path_folder, series_ID)

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Нет необходимости разбивать серию на отдельные каталоги.Вы можете получить список seriesID в каталоге с помощью метода itk :: simple :: ImageSeriesReader :: GetGDCMSeriesIDs .

Вы можете легко создать карту для seriesID в списках файлов со следующимиодин вкладыш: series_dic = { series_id: reader.GetGDCMSeriesFileNames(path, series_id) for series_id in reader.GetGDCMSeriesIDs(path) }

Используя метод GetGDCMSeriesFileNames, вы должны получить все файлы в правильном порядке, отсортированном по их физическому расположению, с вашим ручным методом - нет.

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

0 голосов
/ 19 июня 2018

Временное решение, которое я нахожу, следующее:

1) Создание списков, содержащих каждый фрагмент в качестве объекта изображения, с использованием sitk.ImageFileReader():

frame1 = [Image1, ..., Image148]
frame2 = [Image149, ..., Image296]
...
frame_list = [frame1, frame2, ..., frameN]

Примечание: здесь мы имеем дело с sitkОбъект изображения, а не путь к изображениям, как в моем первом сообщении

2) Изменение каждого seriesID изображения в заголовке DICOM:

count = 1
for frames in frame_list:
  for images in frames:
    newID = images.GetMetaData('0020|000e') + str(count)
    images.SetMetaData('0020|000e', newID)
  count += 1

3) Запись изображений с их новым seriesID в буферную папкуиспользуя writer = sitk.ImageFileWriter() и writer.KeepOriginalImageUIDOn()

4) Сохранение в словаре всех различных серийных ID с соответствующим путем к изображениям, используя метод @blowekamp:

series_dic = { series_id: reader.GetGDCMSeriesFileNames(path, series_id) for series_id in reader.GetGDCMSeriesIDs(path) }

5) Чтение серии исохраните их в списке:

for keys in series_dic:
  Img_list.append(sitk.ReadImage(series_dic[keys]))

6) Наконец я удаляю папку буфера с помощью shutil.rmtree(path, ignore_errors=True)

Это не очень оптимизировано, потому что я должен написать новые изображения, а затем удалить их.Если у вас есть лучший ответ, не стесняйтесь комментировать!

0 голосов
/ 12 июня 2018

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

reader = sitk.ImageSeriesReader()
dicom_names = reader.GetGDCMSeriesFileNames(path_subfolder1)
reader.SetFileNames(dicom_names)
image = reader.Execute()

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

Надеюсь, это поможет, если не стесняйтесь комментировать ниже.

...