我是 MRI 和 Python 的初学者。 我正在尝试从 .nii.gz 文件导出切片图像。
我让 ChatGPT 帮我写下这个示例代码。该代码根据需要存储三个平面上的切片图像。 我无法解决的问题是,不同的 .nii.gz 文件会导致切片图像具有不同且不连贯的亮度级别。
这些目录屏幕截图显示了每个图像如何具有不同的亮度级别。一些 .nii.gz 文件提供所有切片之间具有正确且一致的亮度的图像。其他没有。
这是我从 ChatGTP 获得的代码:
import nibabel as nib
import matplotlib.pyplot as plt
import os
import numpy as np
def save_slices(volume, plane_name, axis, output_dir):
os.makedirs(output_dir, exist_ok=True)
for i in range(volume.shape[axis]):
if axis == 0:
slice_img = volume[i, :, :]
elif axis == 1:
slice_img = volume[:, i, :]
elif axis == 2:
slice_img = volume[:, :, i]
# Normalize the slice image
slice_img = (slice_img - np.min(slice_img)) / (np.max(slice_img) - np.min(slice_img)) * 255
slice_img = slice_img.astype(np.uint8)
plt.imshow(slice_img.T, cmap='gray', origin='lower')
plt.axis('off')
plt.savefig(os.path.join(output_dir, f"{plane_name}_slice_{i:03d}.png"), bbox_inches='tight', pad_inches=0)
plt.close()
# Load the NIfTI file
nifti_file = '../dataset/raw/HUMAN/UCSF-PDGM-v3/UCSF-PDGM-0005_nifti/UCSF-PDGM-0005_DTI_eddy_L2.nii.gz'
nifti_img = nib.load(nifti_file)
volume = nifti_img.get_fdata()
# Define output directories
output_dirs = {
'axial': 'output/axial',
'coronal': 'output/coronal',
'sagittal': 'output/sagittal'
}
# Save slices for each plane
save_slices(volume, 'axial', 2, output_dirs['axial'])
save_slices(volume, 'coronal', 1, output_dirs['coronal'])
save_slices(volume, 'sagittal', 0, output_dirs['sagittal'])
出了什么问题?
谢谢大家的帮助!
找到答案了。
首先,我没有取全局体积最小值,而是取切片最小值。
其次,某些扫描可能存在极暗的异常值(即快速采集产生的伪影)。 这些离群值抵消了从切片中减去全局最小值的效果。 减去基于百分位数的最小值(即 0.05)而不是绝对最小值,可以正确恢复整组切片图像的亮度。