使用scipy.misc.imsave保存全1numpy数组切片图像显示为黑色问题
搞定全1矩阵存成黑色图像的问题
嘿,我明白你遇到的麻烦了——明明是全1的8×8矩阵,存成图像却变成黑色,这事儿其实是像素值的范围没匹配对搞出来的问题,咱们一步步解决:
先搞懂为啥会变黑
大多数图像格式(比如PNG、JPG)用的是uint8类型的像素值,范围是0(纯黑)到255(纯白)。你那全1的矩阵,如果是uint8类型,1就对应几乎看不见的深灰色;就算是float类型的1,老版本的scipy.misc.imsave也可能没正确把0-1的范围映射到0-255,结果还是存成了接近黑色的数值。
直接能用的解决方案
方案1:给scipy.misc.imsave补全数据转换
把你的切片矩阵缩放成255(对应纯白),再转成uint8类型就行:
import numpy as np from scipy.misc import imsave # 假设你的原始数组是这样的 my_arr = np.ones((8, 8, 8)) # 遍历每个切片保存 for slice_idx in range(my_arr.shape[0]): current_slice = my_arr[slice_idx, :, :] # 把1转成255,再转成uint8类型 white_slice = (current_slice * 255).astype(np.uint8) imsave(f"slice_{slice_idx}.png", white_slice)
方案2:换用更靠谱的现代工具(推荐)
scipy.misc.imsave已经被弃用啦,用Pillow或者imageio会更稳定,行为也更明确:
用Pillow的写法:
import numpy as np from PIL import Image my_arr = np.ones((8, 8, 8)) for slice_idx in range(my_arr.shape[0]): current_slice = my_arr[slice_idx, :, :] # 转成图像对象再保存 img = Image.fromarray((current_slice * 255).astype(np.uint8)) img.save(f"slice_{slice_idx}.png")
用imageio的写法:
import numpy as np import imageio.v2 as imageio my_arr = np.ones((8, 8, 8)) for slice_idx in range(my_arr.shape[0]): current_slice = my_arr[slice_idx, :, :] imageio.imwrite(f"slice_{slice_idx}.png", (current_slice * 255).astype(np.uint8))
最后提个小提醒
8×8的图像真的很小,保存完打开可能看起来像个小黑点,记得放大看看,其实已经是纯白色啦!
内容的提问来源于stack exchange,提问作者Fahd_
相关产品推荐
相关产品推荐

