如何使用 nibabel 修改 mgh/dicom/nifti 文件的方向
How to modify orientation of mgh/dicom/nifti file using nibabel
我很难为 3 个不同的视图(即冠状视图、轴向视图和矢状视图)找出合适的仿射变换,每个视图都有如下不同的问题:
1:轴向彩色图与矢状原始视图重叠。
2:类似地,矢状彩色图与轴向原始图像重叠。
3:每个人都有一些方向问题,比如当日冕的彩色地图和原始图像正确但方向错误时,这里最明显。
我正在保存发送到服务器的原始文件以进行某种预测,它会生成一个颜色图和 returns 该文件以供可视化,稍后我将所有内容一起显示。
预测后在服务器中,这里是保存文件的代码。
nifti_img = nib.MGHImage(idx, affine, header=header)
而affine和header是从我发送的文件中提取的原始仿射和header。
我需要处理以 Numpy 数组格式保存原始数据的 "idx" 值,但不确定具体要做什么。这里需要帮助。
正在努力使用 nibabel python 库来解决问题,但由于我对这些文件的工作原理和仿射变换的了解非常有限,我我很难弄清楚我应该怎么做才能使它们正确。
我在前端使用带有 threejs 支持的 AMI js,在后端使用带有 python 的 nibabel。任何地方的前端或后端解决方案都是可以接受的。
请帮忙。提前致谢。
很简单,使用 numpy.moveaxis() 和 numpy.flip() 对来自 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)
我很难为 3 个不同的视图(即冠状视图、轴向视图和矢状视图)找出合适的仿射变换,每个视图都有如下不同的问题:
1:轴向彩色图与矢状原始视图重叠。
2:类似地,矢状彩色图与轴向原始图像重叠。
3:每个人都有一些方向问题,比如当日冕的彩色地图和原始图像正确但方向错误时,这里最明显。
我正在保存发送到服务器的原始文件以进行某种预测,它会生成一个颜色图和 returns 该文件以供可视化,稍后我将所有内容一起显示。
预测后在服务器中,这里是保存文件的代码。
nifti_img = nib.MGHImage(idx, affine, header=header)
而affine和header是从我发送的文件中提取的原始仿射和header。
我需要处理以 Numpy 数组格式保存原始数据的 "idx" 值,但不确定具体要做什么。这里需要帮助。
正在努力使用 nibabel python 库来解决问题,但由于我对这些文件的工作原理和仿射变换的了解非常有限,我我很难弄清楚我应该怎么做才能使它们正确。
我在前端使用带有 threejs 支持的 AMI js,在后端使用带有 python 的 nibabel。任何地方的前端或后端解决方案都是可以接受的。
请帮忙。提前致谢。
很简单,使用 numpy.moveaxis() 和 numpy.flip() 对来自 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)