You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

scipy.misc.imread与skimage.io.imread结果差异原因咨询

Why scipy.misc.imread and skimage.io.imread Give Drastically Different Results on Handwritten Images?

我刚踩过一模一样的坑!这俩函数看似都是读图像,但底层处理逻辑差得老远,尤其是针对手写数据集这类灰度图场景,很容易直接导致模型输出完全不对。下面给你拆解核心区别:

1. 数值范围与数据类型的本质差异

  • scipy.misc.imread(..., flatten=True):当你加上flatten=True参数,它会把图像转成灰度图,输出的是0-255范围的uint8数组,完全对应原始图像的像素值(比如手写笔迹的深色像素会接近0,背景白色接近255,这和很多手写数字数据集的格式一致)。
  • skimage.io.imread():默认情况下,不管读的是灰度还是彩色图,它都会把像素值归一化到0-1之间,而且返回float64类型的数组。如果你的神经网络是基于scipy那套0-255的数值训练的,突然换成0-1的范围,相当于输入信号缩小了255倍,模型肯定直接“懵圈”,输出结果自然天差地别。

2. 图像维度的处理不同

  • scipy的imread在flatten=True时,直接返回2D数组(比如28x28),刚好符合你要重塑成784维列表的需求。
  • skimage的imread默认读灰度图会返回3D数组(比如28x28x1),多了一个通道维度。如果你直接像之前那样reshape(784),得到的数组形状会完全错误,后续的神经网络输入自然不对。你需要要么在读的时候加as_gray=True参数,要么手动用np.squeeze()去掉多余的通道。

3. 废弃状态的影响

你看到的DeprecationWarning是真的——scipy.misc.imread早就被官方废弃了,现在scipy推荐用imageio或者skimage的读取函数,所以你换skimage的方向是对的,只是需要适配它的特性。

适配skimage的修正代码示例

from skimage import io, img_as_ubyte

# 读取图像并直接转为灰度图(得到2D数组)
img_array = io.imread('/Users/usr/Desktop/NN/Test_Sets/handwritten/IMG_5.png', as_gray=True)
# 将float64类型的0-1数值转回scipy风格的0-255 uint8数组
img_array = img_as_ubyte(img_array)
# 接下来就可以和之前一样处理了
img_flattened = img_array.reshape(784).tolist()
# 你的减法操作...

另外提醒一句:如果你的模型是用scipy读取的数据训练的,一定要保证测试数据的预处理和训练时完全一致;要是之后打算全换skimage,那训练数据也要用同样的方式读取并处理,不然模型性能会崩得很惨!

内容的提问来源于stack exchange,提问作者Bn.F76

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:23:18