将黑白PNG图像转为二进制数组(黑1白0)的代码报错求助
解决黑白PNG转二进制数组的代码报错问题
嘿,我一眼就揪出问题所在啦!你碰到的argument 2 to map() must support iteration错误,核心原因是给map()传了整个Image对象img,但map()需要的是可迭代的像素数据集合,不是Image实例本身。咱们一步步来修正:
错误原因拆解
- 你已经通过
pixels = img.getdata()获取了图像的像素迭代器,但在map(threshold, img)里误用了img而非pixels,导致map()无法迭代处理像素。 - 还有个小语法坑:导入语句挤在了同一行,Python会直接报错,得拆成两行写。
修正后的完整代码
from PIL import Image from resizeimage import resizeimage def threshold(col): # 黑白图RGB通道值一致,sum(col)等价于3*col[0],判断是否偏黑(黑色对应1) s = sum(col) # 阈值设为255*3//2,即像素亮度低于一半时判定为黑色(1) return int(s > 255 * 3 // 2) if __name__ == "__main__": img = Image.open("filename.png") # 计算宽高比,按宽度100等比例缩放图像 ratio = float(img.size[1]) / img.size[0] img = resizeimage.resize_cover(img, [100, int(ratio * 100)]) pixels = img.getdata() # 这里把img换成pixels,用map处理每个像素 binary = list(map(threshold, pixels)) # 将一维像素数组转为二维,对应图像的行列结构 array2d = [binary[i * img.size[0] : (i+1) * img.size[0]] for i in range(img.size[1])] # 打印每行的二进制字符串 print('\n'.join(''.join(map(str, line)) for line in array2d))
额外优化建议
如果你的图像已经是灰度图,可以把threshold函数简化,直接取单个通道值,效率更高:
def threshold(col): # 灰度图像素为单值,直接判断亮度即可 return int(col[0] > 127) # 127是255的一半,和原阈值逻辑一致
这样修改后,代码就能正常运行,把黑白PNG转换成你需要的二进制数组啦~
内容的提问来源于stack exchange,提问作者Hasmik Khachatryan
相关产品推荐
相关产品推荐

