使用PIL统计geoTIFF像素颜色时如何匹配索引对应的实际色彩
首先你代码里im.convert('RGB')没有生效,是因为该方法会返回新的图像对象,不会修改原对象,你没有将返回值赋值给变量,所以无论是否注释该行,你统计的都是P模式下的调色板索引值,结果自然一致。如果要直接统计RGB像素,需要修改为im = im.convert('RGB')。
问题1:为什么统计出4种颜色
肉眼的色彩分辨能力有限,你看到的3种是占比最高的主色,第4种属于正常的图像编码产物,不属于隐藏色彩:
- 大概率是图像生成时边缘抗锯齿处理产生的过渡色,比如蓝白交界、冰面和背景交界的位置,会生成介于两种主色之间的近色,和主色差异极小,肉眼难以区分;
- 也有可能是GeoTIFF生成时预留在调色板中的分类值,对应某种你没注意到的极少量地物/背景像素。
问题2:获取调色板索引对应的实际颜色
可以直接通过PIL内置的getpalette()方法获取索引到RGB的映射关系,P模式图像的调色板会按索引顺序返回RGB三通道数值,每3个连续值对应一个索引的R、G、B分量,参考代码如下:
from PIL import Image im = Image.open(fp) # 获取完整调色板列表,默认P模式调色板共256个索引位,总长度为256*3 full_palette = im.getpalette() # 遍历你统计到的4个索引,打印对应的RGB值 for idx in [0, 1, 2, 3]: r = full_palette[idx * 3] g = full_palette[idx * 3 + 1] b = full_palette[idx * 3 + 2] print(f"索引{idx}对应RGB:({r}, {g}, {b})")
拿到RGB值后直接和你肉眼看到的颜色对比,就能对应上黑色背景、蓝色、白色和过渡色分别对应的索引了。
内容的提问来源于stack exchange,提问作者gram_schmidt
相关产品推荐
相关产品推荐

