如何直接向MONAI transforms传入图像以避免类型错误?
解决Monai变换直接处理numpy数组的报错问题
问题根源是你用的LoadImaged变换是专门用来从文件路径加载图像的,现在直接传numpy数组自然会报类型错误。要解决这个问题,只需要调整变换链,去掉加载路径的步骤,换成适配numpy数组的处理逻辑:
修改步骤
- 移除
LoadImaged变换:既然已经拿到numpy格式的图像,不需要再从路径加载,直接删掉这个步骤。 - 调整
EnsureChannelFirstd的参数(可选但建议):根据你的numpy数组维度来设置channel_dim参数,确保通道维度在最前面:- 如果是单通道灰度图,数组维度是
(H, W),设置channel_dim=None,会自动添加通道维度变成(1, H, W) - 如果是RGB图,数组维度是
(H, W, 3),设置channel_dim=-1,把最后一维的通道移到最前面变成(3, H, W)
- 如果是单通道灰度图,数组维度是
- 保留后续的变换逻辑:
ScaleIntensityd、Resized这些处理图像的变换可以直接复用,因为它们支持处理numpy数组或tensor。
修改后的完整代码
import os import numpy as np import torch import torchvision.models as models import torch.nn as nn from PIL import Image import tempfile from monai.transforms import ( EnsureChannelFirstd, Resized, EnsureTyped, Compose, ToTensord, ScaleIntensityd, CenterSpatialCropd, ) from monai.config import print_config print_config() # 调整后的变换链,去掉LoadImaged,按需设置EnsureChannelFirstd的channel_dim test_transforms = Compose( [ # 替换LoadImaged,直接处理numpy数组 EnsureChannelFirstd(keys=["image1","image2"], channel_dim=None), # 根据你的数组维度调整channel_dim EnsureTyped(keys=["image1","image2"]), # 将numpy数组转为Monai支持的类型,也可以指定type='tensor'直接转tensor ScaleIntensityd(keys=["image1","image2"], minv=0.0, maxv=1.0), Resized( keys=["image1","image2"], spatial_size=(512,512), ), CenterSpatialCropd(keys=["image1","image2"], roi_size=(448,448), ), ToTensord(keys=["image1", "image2"]), # 如果EnsureTyped已经转成tensor,这一步可以省略 ] ) def sgmt(r_img, l_img): test_Data =[ { "image1": r_img, "image2": l_img } ] img = test_transforms(test_Data[0])
额外说明
- 如果你的numpy数组已经是
(C, H, W)的通道在前格式,可以直接去掉EnsureChannelFirstd变换 EnsureTyped默认会把numpy数组转成numpy.ndarray类型,如果想直接转成tensor,可以设置EnsureTyped(keys=["image1","image2"], type='tensor'),这样后面的ToTensord就可以删掉了
内容的提问来源于stack exchange,提问作者Juan Yoo
相关产品推荐
相关产品推荐

