如何将患者的CT图像栈一次性输入模型而非逐张单图输入?
Nii.gz格式CT图像栈适配单张2D输入模型的处理方案
你此前的代码输出3D数组的原因是:调用skTrans.resize时仅指定了前两个维度的目标尺寸,第三个切片维度会被默认保留,因此得到的还是(宽, 高, 切片数)的3D结构,不符合单张2D输入的要求。
1. 逐切片输入模型的处理代码
如果你的模型需要逐张处理CT切片,可参考如下实现:
import nibabel as nib import numpy as np import skimage.transform as skTrans # 加载nii.gz格式的CT图像栈 ct_vol = nib.load('/1164.nii.gz').get_fdata() total_slice = ct_vol.shape[-1] processed_slice_list = [] for idx in range(total_slice): # 提取单张2D切片 single_slice = ct_vol[:, :, idx] # 调整分辨率到128*128,显式指定anti_aliasing参数消除警告 resized_slice = skTrans.resize( single_slice, (128, 128), order=1, preserve_range=True, anti_aliasing=True # 下采样时开启可避免伪影,不需要可设为False ) # 如果模型要求输入带通道维度,可添加如下代码: # resized_slice = np.expand_dims(resized_slice, axis=-1) processed_slice_list.append(resized_slice) # 后续遍历processed_slice_list即可得到单张2D numpy数组,直接输入模型
2. 全栈合并为单张2D输入的处理代码
如果你的模型要求将整份患者CT转换为单张2D输入,可先沿切片维度做投影,再调整分辨率:
import nibabel as nib import numpy as np import skimage.transform as skTrans ct_vol = nib.load('/1164.nii.gz').get_fdata() # 沿切片维度做最大密度投影,也可根据需求替换为np.mean做平均投影 proj_img = np.max(ct_vol, axis=-1) resized_proj = skTrans.resize( proj_img, (128, 128), order=1, preserve_range=True, anti_aliasing=True ) # 得到的resized_proj即为单张2D numpy数组
3. 警告消除方法
你遇到的抗锯齿警告是skimage版本兼容提示,只需在resize参数中显式指定anti_aliasing的布尔值,即可消除警告。下采样场景下建议开启该参数,避免图像出现伪影。
内容的提问来源于stack exchange,提问作者Rawan
相关产品推荐
相关产品推荐

