Hier ist der Arbeitsablauf, dem ich gefolgt bin:
Ich habe die DICOM-Dateien nach Instanznummer sortiert:
Code: Select all
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
)
Code: Select all
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
berechnet
Code: Select all
transform_ornt = nib.orientations.ornt_transform(start_ornt, end_ornt)
Code: Select all
reoriented_nifti = nib.orientations.apply_orientation(nii_data, transform_ornt)
Was ich versucht habe:
- Ich habe mehrere Fälle mit unterschiedlichen Ausrichtungen getestet und festgestellt, dass Achsen unter bestimmten Bedingungen in alle drei Richtungen kippen können.
- Beim Betrachten der Dateien in 3D Slicer oder ITK-Snap sieht die Ausrichtung jedoch fast korrekt aus hat leichte Offsets.
- Ich habe mir die NIfTI-Transformationsmatrix angesehen in ITK-Snap (über Image Layer Inspector -> Info -> Reorient -> Voxel to World Matrix) und festgestellt, dass die NIfTI-Affinmatrix korrekt erscheint.
- Allerdings in In den DICOM-Dateien scheinen bestimmte Achsen manchmal vertauscht zu sein.
- Gibt es ein Problem damit, wie ich die affine Matrix erstellt habe? die DICOM-Dateien? Wie kann unter Berücksichtigung der häufigen Achsenumkehrungen in den DICOM-Dateien am besten sichergestellt werden, dass die NIfTI- und DICOM-Dateien perfekt aufeinander abgestimmt sind?