调用skimage resize函数后图像显示为黑色的技术问题咨询
图像缩放后显示为黑色的问题排查与解决
我来帮你分析下这个问题——你遇到的图像缩放后显示全黑的情况,核心原因是重复对像素值做了归一化处理,具体细节如下:
问题根源拆解
- 原图加载:用
matplotlib.image.imread加载JPG图像时,返回的是uint8类型数组,像素值范围是0-255,这时候plt.imshow能正常识别并显示。 skimage.transform.resize的默认行为:这个函数对输入的uint8类型图像会自动做归一化——它会把0-255的像素值直接缩放到0-1的float范围,返回的结果已经是符合显示要求的0-1区间数值。- 多余的归一化操作:你在
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
相关产品推荐
相关产品推荐

