如何将nii.gz格式医学影像体数据渲染为单张彩色映射图像?
将NIfTI体数据渲染为彩色合成单张图像
你可以通过**融合三个正交平面的切片(分别映射到RGB通道)**实现类似目标效果的彩色合成图像,以下是完整实现方案:
完整代码
import nibabel as nib import matplotlib.pyplot as plt import numpy as np # 加载NIfTI文件 mri_file = '/tmp/out_img/case0001_gt.nii.gz' img = nib.load(mri_file) img_data = img.get_fdata() # 修正原代码笔误:mg_data -> img_data # 获取三个正交平面的中间切片 # 轴向切片(x-y平面,z轴中间位置) z_mid = img_data.shape[2] // 2 axial_slice = img_data[:, :, z_mid].T # 冠状切片(x-z平面,y轴中间位置) y_mid = img_data.shape[1] // 2 coronal_slice = img_data[:, y_mid, :].T # 矢状切片(y-z平面,x轴中间位置) x_mid = img_data.shape[0] // 2 sagittal_slice = img_data[x_mid, :, :].T # 归一化切片数据到0-1范围(适配RGB通道要求) def normalize_slice(slice_data): return (slice_data - np.min(slice_data)) / (np.max(slice_data) - np.min(slice_data)) axial_norm = normalize_slice(axial_slice) coronal_norm = normalize_slice(coronal_slice) sagittal_norm = normalize_slice(sagittal_slice) # 对齐切片尺寸(确保三个切片大小一致,取最小尺寸裁剪) min_height = min(axial_norm.shape[0], coronal_norm.shape[0], sagittal_norm.shape[0]) min_width = min(axial_norm.shape[1], coronal_norm.shape[1], sagittal_norm.shape[1]) axial_cropped = axial_norm[:min_height, :min_width] coronal_cropped = coronal_norm[:min_height, :min_width] sagittal_cropped = sagittal_norm[:min_height, :min_width] # 合成RGB图像:轴向→红通道,冠状→绿通道,矢状→蓝通道 rgb_img = np.stack([axial_cropped, coronal_cropped, sagittal_cropped], axis=-1) # 显示合成图像 plt.figure(figsize=(10, 10)) plt.imshow(rgb_img, origin='lower') plt.xlabel('像素宽度') plt.ylabel('像素高度') plt.title('NIfTI体数据多平面RGB合成图') plt.axis('off') plt.show() # 可选:保存合成图像 # plt.imsave('/tmp/rgb_composite.png', rgb_img)
关键说明
- 切片自定义:代码默认取各轴中间切片,你可以手动指定切片位置(比如
z_mid = 119匹配你原代码的切片) - 色彩调整:可修改RGB通道的切片映射顺序,改变不同解剖结构的色彩显示效果
- 投影替代方案:如果需要更接近体渲染的效果,可用**最大强度投影(MIP)**替代单切片,示例代码如下:
后续归一化、尺寸对齐和合成步骤与上述代码一致。# 轴向MIP投影(取z轴所有切片的最大值) axial_mip = np.max(img_data, axis=2).T # 冠状MIP投影(取y轴所有切片的最大值) coronal_mip = np.max(img_data, axis=1).T # 矢状MIP投影(取x轴所有切片的最大值) sagittal_mip = np.max(img_data, axis=0).T
内容的提问来源于stack exchange,提问作者user836026
相关产品推荐
相关产品推荐

