Вот рабочий процесс, которому я следовал:
Я отсортировал файлы DICOM по номеру экземпляра:
Код: Выделить всё
dicom_files = sorted(
[os.path.join(dcm_folder, f) for f in os.listdir(dcm_folder) if f.endswith('.dcm')],
key=lambda x: pydicom.dcmread(x).InstanceNumber
)
Код: Выделить всё
ds1 = pydicom.dcmread(dicom_files[0])
ds2 = pydicom.dcmread(dicom_files[1])
a = np.array(ds1.ImageOrientationPatient[:3])
b = np.array(ds1.ImageOrientationPatient[3:])
slice_diff = (np.array(ds1.ImagePositionPatient) - np.array(ds2.ImagePositionPatient)) / (
ds1.InstanceNumber - ds2.InstanceNumber
)
c = slice_diff / np.sum(slice_diff**2) ** 0.5
matrix = np.zeros((4, 4))
matrix[3, 3] = 1
matrix[:3, 0] = b
matrix[:3, 1] = a
matrix[:3, 2] = c
affine_matrix = matrix
Код: Выделить всё
transform_ornt = nib.orientations.ornt_transform(start_ornt, end_ornt)
Код: Выделить всё
reoriented_nifti = nib.orientations.apply_orientation(nii_data, transform_ornt)
Что я пробовал:
- Я протестировал несколько случаев с разной ориентацией и обнаружил, что при определенных условиях оси могут поворачиваться во всех трех направлениях.
- При просмотре файлов в 3D Slicer или ITK-Snap выравнивание выглядит почти правильным, но имеет небольшие смещения.
- Я проверил Матрица преобразования NIfTI в ITK-Snap (с помощью инспектора слоев изображения -> Информация -> Переориентация -> Воксельная матрица в мировую) и обнаружила, что аффинная матрица NIfTI выглядит правильно.
- Однако в файлах DICOM некоторые оси иногда кажутся перевернутыми.
- Есть ли проблема с тем, как я построил аффинную матрицу для файлов DICOM?
- Должен ли я обрабатывать ориентацию файлов DICOM по-другому из-за их нефиксированной ориентации?
- Почему файл NIfTI отображается правильно в 3D Slicer/ITK-Snap, но не при визуализации в рабочем процессе Jupyter Notebook?
- Существуют ли какие-либо известные подводные камни при использовании nib.orientations.ornt_transform или apply_orientation, которые я, возможно, пропустил?
- Как лучше всего обеспечить идеальное выравнивание файлов NIfTI и DICOM, учитывая частые перевороты осей в файлах DICOM?
Подробнее здесь: https://stackoverflow.com/questions/793 ... icom-files