Как изменить ориентацию файла mgh/dicom/nifti с помощью nibabel
Мне трудно найти правильное аффинное преобразование для 3 различных видов: коронального, осевого и саггитального, у каждого из которых есть отдельные проблемы, как показано ниже:
1: осевая цветовая карта перекрывается саггитальным исходным видом.
2: Аналогичным образом, сагиттальная цветовая карта перекрывается с аксиальным исходным изображением.
3: И у всех есть какие-то проблемы с ориентацией, которые лучше всего видны здесь, когда цветная карта и исходное изображение для коронала соответствуют друг другу, но с неправильной ориентацией.
Я сохраняю исходный файл, который отправляю на сервер для какого-то прогноза, который генерирует цветную карту и возвращает этот файл для визуализации, позже я отображаю все вместе.
На сервере после прогнозирования приведен код для сохранения файла.
nifti_img = nib.MGHImage(idx, affine, header=header)
Принимая во внимание, что аффин и заголовок - это исходный аффин и заголовок, извлеченные из файла, который я отправил.
Мне нужно обработать значение "idx", которое содержит необработанные данные в формате массива Numpy, но не уверен, что именно нужно сделать. Нужна помощь здесь.
Старался решить проблему с помощью библиотеки nibabel python, но из-за моих очень ограниченных знаний о том, как работают эти файлы и об аффинном преобразовании, мне трудно понять, что мне нужно сделать, чтобы исправить их.
Я использую AMI JS с поддержкой ThreeJS во внешнем интерфейсе и Nibabel с Python в конце. Решение на интерфейсе или бэкэнде в любом месте приемлемо.
Пожалуйста помоги. Заранее спасибо.
2 ответа
Это было просто, используя операции numpy.moveaxis() и numpy.flip() для rawdata из nibabel. как ниже.
# Getting raw data back to process for better orienation and label mapping.
orig_img_data = nib.MGHImage(numpy_arr, affine)
nifti_img = nib.MGHImage(segmented_arr_output, affine)
# Getting original and predicted data to preprocess to original shape and view for visualisation.
orig_img = orig_img_data.get_fdata()
seg_img = nifti_img.get_fdata()
# Placing proper views in proper place and flipping it for a better visualisation as required.
# moveaxis to get original order.
orig_img_ = np.moveaxis(orig_img, -1, 0)
seg_img = np.moveaxis(seg_img, -1, 0)
# Flip axis to overcome mirror image/ flipped view.
orig_img_ = np.flip(orig_img_, 2)
seg_img = np.flip(seg_img, 2)
orig_img_data_ = nib.MGHImage(orig_img_.astype(np.uint8), np.eye(4), header)
nifti_img_ = nib.MGHImage(seg_img.astype(np.uint8), np.eye(4), header)
Примечание. Очень важно иметь одинаковую аффинную матрицу, чтобы обернуть оба этих массива обратно. Матрица идентичности 4*4 лучше, чем использование оригинальной аффинной матрицы, поскольку это создавало для меня проблему.
img = nib.load(img_path)
# check the orientation you wanna reorient.
# For example, the original orientation of img is RPI,
# you wanna reorient it to RAS, the second the third axes should be flipped
# ornt[P, 1] is flip of axis N, where 1 means no flip and -1 means flip.
ornt = np.array([[0, 1],
[1, -1],
[2, -1]])
img_orient = img.as_reoriented(ornt)
nib.save(img_orient, img_path)