Преобразование изображения DICOM в массив numpy формы (s, 3, 256, 256)

У меня есть папки с изображениями МРТ, и я пытаюсь воспроизвести исследование MRnet с моими собственными данными. Их модель работает с 1 файлом.npy для каждого предмета, формы (s, 3, 256, 256), где s - количество фрагментов для данного предмета (варьируется от предмета).

Я рассмотрел несколько различных методов решения этой проблемы, но, похоже, ни один из них не работает для меня. Самое близкое, что я получил, было, по крайней мере, преобразовать файлы.dcm в JPEG, используя:

import pydicom
import os
import numpy as np
import cv2
dicom_folder = 'C:/Users/GlaDOS/PythonProjects/dicomnpy/DICOMFILES/sub1/' # Set the folder of your dicom files that inclued images 
jpg_folder = 'C:/Users/GlaDOS/PythonProjects/dicomnpy/DICOMFILES/jpg' # Set the folder of your output folder for jpg files 
# Step 1. prepare your input(.dcm) and output(.jpg) filepath 
dcm_jpg_map = {}
for dicom_f in os.listdir(dicom_folder):
    dicom_filepath = os.path.join(dicom_folder, dicom_f)
    jpg_f = dicom_f.replace('.dcm', '.jpg') 
    jpg_filepath = os.path.join(jpg_folder,jpg_f)
    dcm_jpg_map[dicom_filepath] = jpg_filepath

# Now, dcm_jpg_map is key,value pair of input dcm filepath and output jpg filepath

# Step 2. process your image by input/output information
for dicom_filepath, jpg_filepath in dcm_jpg_map.items():
    # convert dicom file into jpg file
    dicom = pydicom.read_file(dicom_filepath)
    np_pixel_array = dicom.pixel_array
    cv2.imwrite(jpg_filepath, np_pixel_array)

Я знаю, что могу использовать для этого pydicom, но я не могу найти в их документации никакой информации о том, как достичь этого результата.

Я действительно хочу, чтобы информация была np_pixel_array приведенного выше кода, который возвращает форму 256, 216, однако я хочу, чтобы каждый файл dcm в папке в этом массиве стал (30, 256, 216) или каким-либо количеством фрагментов в каждой папке.

У кого-нибудь есть опыт в этом и может ли он помочь?

1 ответ

Решение

Вы можете изменить этот раздел своего кода:

for dicom_filepath, jpg_filepath in dcm_jpg_map.items():
    # convert dicom file into jpg file
    dicom = pydicom.read_file(dicom_filepath)
    np_pixel_array = dicom.pixel_array
    cv2.imwrite(jpg_filepath, np_pixel_array)

к этому:

unstacked_list = []
for dicom_filepath, jpg_filepath in dcm_jpg_map.items():
    # convert dicom file into jpg file
    dicom = pydicom.read_file(dicom_filepath)
    np_pixel_array = dicom.pixel_array
    unstacked_list.append(np_pixel_array)
    cv2.imwrite(jpg_filepath, np_pixel_array)
final_array = np.array(unstacked_list)

пример того, как это работает, приведен ниже с более простым сценарием, представьте, что массивы a, b и c - это массивы np_pixel_array, а final_array - это формат, который вы хотели

import numpy as np
unstacked_list = []

a = np.array([[1,2], [3,4]])
b = np.array([[5,6], [7,8]])
c = np.array([[9,10], [11,12]])

for i in [a, b, c]:
    unstacked_list.append(i)
final_array = np.array(unstacked_list)

print(final_array.shape)
print(f'shape of final_array is {shape}')
print('')
print(f'final array is{final_array}')

выход

shape of final_array is (3, 2, 2)


final array is

[[[ 1  2]
  [ 3  4]]

 [[ 5  6]
  [ 7  8]]

 [[ 9 10]
  [11 12]]]
Другие вопросы по тегам