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

Scikit Image加载PNG二进制图像并转换回二进制矩阵的问题

问题解答

1. 读取得到的数组格式含义

  • 该数组是RGBA四通道8位图像的标准存储格式:数组最后一维长度为4,四个值依次对应单个像素的红(R)、绿(G)、蓝(B)、透明度(A)通道数值,每个通道取值范围为0-255的无符号整数;你读取到的所有像素A通道值为255,代表图像完全不透明。
  • 数组值和你原始二值矩阵不匹配的核心原因是:调用matplotlib.imsave时未显式指定配色映射规则,函数默认使用viridis伪彩色映射,将你原始单通道数组中的最小值0映射为viridis色板的深紫色(对应RGB值[68, 1, 84]),最大值1映射为viridis色板的亮黄色(对应RGB值[253, 231, 36]),最终存储的是伪彩色PNG而非二值灰度图,读取后自然和原始数组结构、数值不一致。

2. 转换回原始二进制矩阵的方法

根据你当前的阶段,可选择对应方案:

已读取到四通道数组,直接还原

原始0和1对应的像素色彩差异极大,任选一个数值差明显的通道做阈值分割即可100%还原,示例代码:

import numpy as np
from skimage import io

# 读取PNG图像
img = io.imread("your_image_path.png")
# 取G通道做阈值分割(0对应G值1,1对应G值231,阈值取127可完全区分)
binary_matrix = (img[:, :, 1] > 127).astype(np.uint8)

运行得到的binary_matrix就是和你原始输入完全一致的11×11二值矩阵。

后续保存数组时避免该问题

保存时显式指定灰度配色、固定数值映射范围,就不会自动套用伪彩色映射:

import matplotlib.pyplot as plt
# arr为你的原始0/1二值数组
plt.imsave("valid_binary.png", arr, cmap="gray", vmin=0, vmax=1)

如果需要严格存储无额外色彩映射的单通道二值图,可将数组转为0-255范围的uint8格式后用PIL保存:

import numpy as np
from PIL import Image

img = Image.fromarray((arr * 255).astype(np.uint8))
img.save("strict_binary.png")

用该方式保存的图像读取后为单通道数组,除以255即可得到原始0/1矩阵。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:09:26