如何使用Rasterio将单波段热红外GeoTIFF保存为伪彩色PNG
将单波段热红外GeoTIFF保存为伪彩色文件
方法一:保存为普通伪彩色PNG(无地理信息)
适合仅需可视化图像的场景,利用matplotlib色卡将单波段灰度值映射为RGB颜色:
import rasterio import matplotlib.pyplot as plt from matplotlib import cm # 读取单波段热红外数据 with rasterio.open('2010ThermClip.tif') as src: gray_data = src.read(1) # 选择色卡(可替换为viridis、inferno、magma等任意matplotlib内置色卡) color_map = cm.get_cmap('plasma') # 将灰度值映射为RGBA格式,剔除alpha通道 rgb_data = color_map(gray_data)[:, :, :3] # 转换为PNG支持的uint8格式(0-255数值范围) rgb_data = (rgb_data * 255).astype('uint8') # 保存伪彩色PNG plt.imsave('chicTherm2010_pseudo_color.png', rgb_data)
方法二:保存带地理信息的伪彩色GeoTIFF
需要保留原数据地理坐标时,可将伪彩色数据写入带元数据的三波段GeoTIFF:
import rasterio from matplotlib import cm # 读取源数据及元数据 with rasterio.open('2010ThermClip.tif') as src: gray_data = src.read(1) src_profile = src.profile # 色卡映射并调整数据格式 color_map = cm.get_cmap('plasma') rgb_data = color_map(gray_data)[:, :, :3] rgb_data = (rgb_data * 255).astype('uint8') # 转换为rasterio要求的(通道数, 高度, 宽度)格式 rgb_data = rgb_data.transpose(2, 0, 1) # 更新元数据:通道数改为3,数据类型改为uint8 src_profile.update( count=3, dtype='uint8', compress='deflate' # 可选,设置压缩方式减小文件体积 ) # 保存带地理信息的伪彩色GeoTIFF with rasterio.open('chicTherm2010_pseudo_color.tif', 'w', **src_profile) as dst: dst.write(rgb_data)
注意事项
- 色卡可自由替换:matplotlib支持数十种内置色卡,也可自定义色卡使用
- 若原数据存在
nodata值,可在映射前对该区域做特殊处理(比如设置为透明色或特定颜色) - 保存PNG时如需透明背景,可保留RGBA的alpha通道,调用
plt.imsave时添加transparent=True参数
内容的提问来源于stack exchange,提问作者jeyre
相关产品推荐
相关产品推荐

