Как загрузить и визуализировать файлы dicom? - PullRequest
0 голосов
/ 11 июля 2020

Я действительно работаю с данными dicom. Следующий код описывает, как я читаю и преобразовываю файлы. В этом случае я беру только центральный срез:

dcm_list = glob('./folder_path' + '/*.dcm')
imgp = np.zeros((len(dcm_list), 512, 512), dtype='float32')
z = []
# For each dcm file, get the corresponding slice, normalize HU values, and store the Z position of the slice
for i, f in enumerate(dcm_list):
    dcm = dcmread(f)
    imgp[i] = float(dcm.RescaleSlope) * dcm.pixel_array.astype('float32') + float(dcm.RescaleIntercept)
    z.append(dcm.ImagePositionPatient[-1])
imgp = imgp[np.argsort(z)]
print(imgp.shape)
index = int(imgp.shape[0]/2) # take central slice
im = imgp[index,:,:]# elemento centrale della serie letta; è gia in hu value
im = np.clip(im, -1024, 3071) # clip values not in range [-1024,3071]

После этого я визуализирую im, но результат полностью отличается от визуализации с помощью таких инструментов, как Horos. Я также сообщаю код для визуализации:

im = (im + 1024.) / (3071 + 1024.) # 0-1
plt.imshow(im, cmap='gray' ); plt.title('central slice');

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

1 Ответ

1 голос
/ 11 июля 2020

pydicom имеет функции для применения окна / масштабирования, которые (надеюсь) должны быть правильными:

from pydicom import dcmread
from pydicom.pixel_data_handlers.util import apply_modality_lut, apply_voi_lut

ds = dcmread('path/to/dataset.dcm')
arr = ds.pixel_array
# Applies any rescale operation, must be first
arr = apply_modality_lut(arr, ds)
# Applies any windowing, must be after rescale
arr = apply_voi_lut(arr, ds, index=0)

Где index - какое представление вы хотите использовать (если их больше одного)

...