如何将0/1构成的二维数组正确转换还原为二进制黑白图像
问题背景
开发过程中需要生成仅含黑白像素的随机二进制图像,规则为1代表黑色、0代表白色,生成的数组会存入txt文件,存储格式截断后如下:
[[0 1 0 ... 0 0 1] [1 1 1 ... 0 0 0] [1 0 0 ... 0 1 0] ... [0 1 1 ... 1 0 1] [1 1 0 ... 0 1 1] [0 1 1 ... 0 1 0]]
示例图像效果:
现有读取数组转图像的代码运行后输出全黑图像,无法得到预期的黑白效果,原代码如下:
import numpy as np from PIL import Image as im array = np.genfromtxt('binary_array.txt', dtype=int) print(array) print(array.shape) data = im.fromarray(array) data.save('new_img.png')
故障原因
- PIL处理单通道灰度图像时,默认识别
uint8类型、取值范围0~255的数组,数值0对应纯黑、255对应纯白。当前传入的数组仅包含0、1两个int类型值,数值1对应的亮度极低,肉眼看和纯黑没有区别 - 未显式指定图像模式,传入默认int类型时PIL存在类型解析异常的可能
- 原规则定义0为白色、1为黑色,和PIL默认灰度规则(0黑255白)是反向的,直接转换逻辑也不匹配
修复代码
按照规则做值映射和类型转换,显式指定灰度图模式即可:
import numpy as np from PIL import Image as im array = np.genfromtxt('binary_array.txt', dtype=int) # 反转二值匹配黑白规则,映射到0-255灰度范围,转换为uint8类型 img_data = (1 - array) * 255 img_data = img_data.astype(np.uint8) # 显式指定为单通道灰度模式 img = im.fromarray(img_data, mode='L') img.save('new_img.png')
如果后续调整规则为1代表白色、0代表黑色,去掉1 - array的反转步骤,直接将数组乘255做类型转换即可。
内容的提问来源于stack exchange,提问作者Aurorius
相关产品推荐
相关产品推荐

