Pillow调用.show()方法显示二维数组转灰度图像时出现显示异常
异常原因
- 变量调用错误:你完成最大池化计算得到结果
arr2后,调用Image.fromarray时传入的仍是原始图像数组arr,并未使用池化后的结果。 - 数据类型不匹配:
maxPool函数内通过np.zeros创建的数组默认是float64浮点类型,而PIL的L(8位灰度)模式要求输入为取值0-255的uint8整数类型,直接传入浮点数组会导致PIL对像素值解析错误,出现和预期不符的显示效果。
修复方案
调整主逻辑的代码,传入池化后的数组并做类型转换即可:
import numpy as np from PIL import Image def maxPool(arr,s): if (arr.shape[0] % s != 0 or arr.shape[1] % s != 0): print("Max pooling not compatible with image dimensions!") return rows = int(arr.shape[0] / s) cols = int(arr.shape[1] / s) nar = np.zeros([rows, cols]) for i in range(rows): for j in range(cols): nar[i,j] = arr[i * s:i * s + s, j * s:j * s + s].max() # 函数内提前完成类型转换,减少后续重复操作 return nar.astype(np.uint8) # 主方法逻辑 arr = np.array(Image.open("dino.jpg").convert('L')) # 提前转灰度避免原图是三通道带来的潜在问题 arr2 = maxPool(arr,2) # 传入池化后的arr2生成图像 i2 = Image.fromarray(arr2,'L') i2.show()
额外优化说明:读取原图时添加
convert('L')主动转灰度,避免原图是三通道彩色图时,池化逻辑处理三维数组带来的异常。
内容的提问来源于stack exchange,提问作者Henrique Lee
相关产品推荐
相关产品推荐

