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

调用skimage resize函数后图像显示为黑色的技术问题咨询

图像缩放后显示为黑色的问题排查与解决

我来帮你分析下这个问题——你遇到的图像缩放后显示全黑的情况,核心原因是重复对像素值做了归一化处理,具体细节如下:

问题根源拆解

  1. 原图加载:用matplotlib.image.imread加载JPG图像时,返回的是uint8类型数组,像素值范围是0-255,这时候plt.imshow能正常识别并显示。
  2. skimage.transform.resize的默认行为:这个函数对输入的uint8类型图像会自动做归一化——它会把0-255的像素值直接缩放到0-1的float范围,返回的结果已经是符合显示要求的0-1区间数值。
  3. 多余的归一化操作:你在resize之后又执行了return img /255,这就把已经是0-1的数值再次缩小255倍,最终像素值范围变成了0~0.0039左右。而plt.imshow默认的颜色映射范围是0-1,这么小的数值几乎都接近0,所以显示出来就是全黑的。

你可以通过打印处理后图像的最大值来验证这个问题:

print(np.max(io))  # 输出会远小于1,比如0.0039左右

修复方案

方案1:移除多余的归一化操作(最简单)

直接去掉/255的代码,因为resize已经帮你完成了0-255到0-1的转换:

def rescale_image(img):
    """Rescale the jpg range of 0-255 to 0-1"""
    img = resize(img, (100, 100), anti_aliasing=True)
    return img  # 移除多余的/255

方案2:手动控制归一化流程(可选)

如果你想完全自己控制归一化步骤,可以先把原图转成float类型并手动归一化,再执行resize(此时resize不会再额外做归一化):

import numpy as np

def rescale_image(img):
    """Rescale the jpg range of 0-255 to 0-1"""
    # 先手动将uint8的0-255转成0-1的float
    img = img.astype(np.float32) / 255.0
    # 执行resize,此时不会再自动归一化
    img = resize(img, (100, 100), anti_aliasing=True)
    return img

临时验证技巧

如果不想修改函数,你可以在显示时手动指定颜色范围,这样就能看到处理后的图像(仅用于验证,不推荐作为长期解决方案):

plt.imshow(io, vmin=0, vmax=np.max(io))

内容的提问来源于stack exchange,提问作者elksie5000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:18:14