NIfTI图像绘制出现畸变问题求助
NIfTI图像绘制畸变的解决办法
问题根源
图像畸变是因为绘图时未应用NIfTI文件的Affine矩阵空间信息。3DSlicer等专业工具会自动解析Affine中的像素间距、轴方向参数来正确渲染,但matplotlib/nibabel默认绘图逻辑会忽略这些,导致图像拉伸变形。
你的Affine矩阵显示三个轴的像素间距(对角线元素绝对值)约为0.32mm、0.30mm、0.55mm,且轴间存在旋转分量,属于非正交空间,直接按数组行列比例绘制必然出现畸变。
修复方案
1. 修正nibabel plotting的显示
plotting.plot_img 默认可能未正确处理空间缩放,手动指定参数让工具自动适配:
fig, ax = plt.subplots(figsize=[10, 5]) plotting.plot_img(nii_before, cmap='gray', axes=ax, annotate=True, voxel_size=nii_before.header.get_zooms()) plt.show()
2. 手动设置plt.imshow的比例
直接读取数组切片时,根据Affine计算当前切片的实际像素长宽比:
# 获取各轴像素间距 zooms = nii_before.header.get_zooms() # 你取的是nii_before_data[100](第一个维度的第100层),对应y-z平面,比例为y轴间距/z轴间距 aspect_ratio = zooms[1] / zooms[2] plt.imshow(nii_before_data[100], cmap='bone', aspect=aspect_ratio) plt.axis('off') plt.show()
注意:如果切片维度不同(比如取第二个维度的层),要对应调整比例的轴索引
3. 转换为标准正交空间(可选)
如果后续需要正交图像,可以在DICOM转NIfTI时关闭自动重定向,或加载后转成标准RAS空间:
# 转换时关闭reorient dicom2nifti.convert_directory(path_to_dicom_before, path_to_dicom_before_converted, compression=True, reorient=False) # 或者加载后重定向到RAS标准空间 from nibabel.orientations import ornt_transform, axcodes2ornt original_ornt = axcodes2ornt(nii_before.affine) target_ornt = axcodes2ornt(('R', 'A', 'S')) nii_before_ras = nii_before.as_reoriented(ornt_transform(original_ornt, target_ornt)) # 绘制转换后的图像 plotting.plot_img(nii_before_ras, cmap='gray') plt.show()
验证
修改后绘制的图像形状应与3DSlicer中显示的一致,可对比同一层图像确认效果。
内容的提问来源于stack exchange,提问作者Cenoc
相关产品推荐
相关产品推荐

