R导入导出多波段RGB航测.tif影像后谷歌地球显示黑白问题咨询
需要导入.tif格式的航测影像,再以相同色彩格式导出。原文件在Windows照片查看器、谷歌地球中打开均为彩色,但导出后显示为黑白。
最终需求是裁剪、合并约6块影像瓦片生成单张航测影像地图,6块瓦片中仅需约30%的区域(水面区域加20米左右缓冲区),因此希望仅保留所需区域生成单文件缩小影像体积,无需导入全部6块瓦片。原始单张.tif可在谷歌地球中正常打开为彩色航测影像,这也是自定义边界地图/影像需要的效果。
当前卡在单张.tif的导入导出环节,无法导出可被谷歌地球正常识别的彩色格式。使用R的raster包导入文件,尝试用writeRaster导出,但导出的影像在谷歌地球中打开为黑白,猜测可能是仅渲染了单张RGB图层?但R中的plotRGB()函数可以正常彩色绘制该导出影像。
现有测试代码如下:
# 导入并绘制tif,可正常显示彩色 brick('ACT2017-RGB-10cm_6656073_55_0001_0001.tif') %>% plotRGB
上述代码运行后plotRGB()的显示效果和原始文件在谷歌地球中的打开效果一致,为需要的输出色彩:
导出测试代码:
# 导出影像 brick('ACT2017-RGB-10cm_6656073_55_0001_0001.tif') %>% writeRaster('my_output.tif') # 导入导出后的影像 brick('my_output.tif') %>% plotRGB
导出得到的my_output.tif在R中可正常彩色绘制,但在谷歌地球中打开为黑白。
导出的TIFF文件未明确标注RGB色彩模式和波段对应关系,谷歌地球无法自动识别三个波段分别对应红、绿、蓝通道,默认仅渲染第一个波段为灰度图。R的plotRGB会自动识别前三个波段为RGB通道,因此显示正常。
方法1:基于raster包调整导出参数
导出时明确指定色彩模式、数据类型,添加压缩参数即可兼容谷歌地球:
library(raster) library(dplyr) # 读取原始影像 rgb_brick <- brick('ACT2017-RGB-10cm_6656073_55_0001_0001.tif') # 导出参数配置 writeRaster(rgb_brick, filename = 'my_output.tif', format = 'GTiff', datatype = 'INT1U', # 若原始影像为16位可修改为INT2U options = c("PHOTOMETRIC=RGB", "COMPRESS=LZW"), # 明确指定色彩模式为RGB,添加LZW无损压缩缩小体积 overwrite = TRUE)
方法2:使用terra包(推荐,兼容性更强)
terra是raster包的官方升级版本,对GDAL的支持更完善,导出的TIFF兼容性更好:
library(terra) # 读取原始影像 rgb_rast <- rast('ACT2017-RGB-10cm_6656073_55_0001_0001.tif') # 导出配置 writeRaster(rgb_rast, filename = 'my_output_terra.tif', filetype = "GTiff", datatype = "INT1U", gdal = c("PHOTOMETRIC=RGB", "COMPRESS=LZW"), overwrite = TRUE)
后续裁剪合并优化
不需要完整导入6块大体积瓦片,可先准备好水面+20米缓冲区的矢量边界,逐一对瓦片使用crop()函数裁剪目标区域后再合并,全程仅加载所需区域数据,内存占用低、处理速度快。
内容的提问来源于stack exchange,提问作者hugh-allan

