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
相关产品推荐
相关产品推荐

