如何让scikit-image返回无负步长的连续数组?
解决Scikit-Image imread读取图像负步长导致PyTorch ToTensor报错问题
问题根源
你碰到的负步长数组,是因为Scikit-Image默认解码器读取部分图像(比如存储顺序为底行在前的格式)时,会返回一个垂直翻转的视图而非副本(节省内存),但PyTorch的ToTensor()不支持带负步长的非连续数组。从你的数组属性看,当前img是另一个形状为(3024, 4032, 3)数组的视图,负步长对应行方向的逆序访问。
无需创建副本的解决方案
指定PIL插件读取图像
Scikit-Image的imread支持通过plugin参数指定读取后端,用PIL插件读取的图像默认返回连续数组(无负步长),从根源避免问题,无需额外复制:
import skimage.io as io # 用PIL插件读取图像 img = io.imread("你的图像路径", plugin='pil') # 验证数组是否连续(输出应为True) print(f"是否连续: {img.flags.contiguous}")
额外说明
如果必须使用默认插件(如imageio),部分图像格式确实无法避免非连续视图,此时只能通过copy()或np.ascontiguousarray()创建副本,但这是你想避免的情况,因此优先推荐更换为PIL插件读取。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

