为何TIFF灰度图用Python读取得到3维数组,与课程2维数组示例不符?
问题原因及解决方案
核心原因是图片视觉上的灰度效果和实际存储的色彩通道模式没有必然关联,你使用的灰度TIFF本质是带透明度通道的RGBA模式存储,因此读取后得到4通道的三维数组。
具体规则说明
PIL读取TIFF图片后转numpy数组的维度完全由图片本身的存储模式决定:
- 单通道灰度图(PIL识别模式为
L):转换后为二维数组,维度(高度, 宽度),就是你讲师示例中的输出结果 - RGB三通道彩色图(模式
RGB):转换后为三维数组,维度(高度, 宽度, 3) - 带透明度通道的RGBA图(模式
RGBA):转换后为三维数组,维度(高度, 宽度, 4),和你得到的输出完全匹配
为什么视觉是灰度但存储为RGBA模式
绝大多数图像处理工具导出时,如果没有手动指定存储为「单通道灰度」格式,哪怕图片内容全为灰度,默认也会按照RGBA或RGB模式存储:四个通道的R/G/B值设置为相同的灰阶值,A通道固定为255(完全不透明),视觉上和单通道灰度没有差异,但实际是多通道存储。
验证及解决方法
- 先验证图片模式:在你现有代码的
im = Image.open("你的图片.tiff")行后添加print(im.mode),输出结果大概率为RGBA - 代码层面直接转换得到单通道灰度数组:修改读取代码为
im = Image.open("你的图片.tiff").convert('L')
后续转换为numpy数组就会得到二维的单通道灰度数组,和示例效果一致
3. 也可以在导出图片的工具中,手动选择导出格式为「单通道灰度TIFF」,再次读取也会得到二维数组
内容的提问来源于stack exchange,提问作者Kam
相关产品推荐
相关产品推荐

