tmap绘制非'value'栅格数值问题:FLIR图像在R中的异常表现
FLIR图像栅格分析:tmap与base R绘图差异的解决方法
问题根源
FLIR相机导出的JPG属于索引色图像:这类图像存储的是像素的索引值(对应内置颜色映射表的位置),而非直接的RGB数值或温度值。
raster包读取时,会将这些索引值作为栅格的values存入对象,范围通常为0-255;tmap绘图时会自动调用图像自带的颜色映射表(CLUT),用索引值匹配对应颜色,因此显示效果和原图一致;- base R的
plot()函数默认使用连续颜色渐变渲染栅格数值,不会读取图像的颜色映射表,所以显示结果与原图不符。
查看tmap使用的颜色映射
方法1:从图像文件提取颜色表
library(jpeg) # 读取图像并保留颜色映射属性 img <- readJPEG("FLIR0031.jpg", native = FALSE) # 提取tmap绘图时用的颜色映射表 clut <- attr(img, "col")
方法2:从tmap对象提取图例信息
tm_obj <- tm_shape(r1) + tm_raster() # 获取图例对应的颜色与数值映射 legend_info <- get_legend(tm_obj)
获取tmap绘图对应的数值
tmap实际绘制的就是栅格的索引值,只是通过颜色映射表转换为了原图的视觉效果。如果需要将索引值转换为对应的RGB颜色值,可以用索引匹配颜色表:
# 获取栅格的索引值 raster_vals <- values(r1) # 匹配颜色表得到RGB值(R索引从1开始,图像索引从0开始,所以+1) rgb_vals <- clut[raster_vals + 1]
如果需要提取FLIR图像的实际温度值,注意JPG的像素值是经过颜色映射的索引,需从EXIF元数据读取温度校准参数后转换:
library(exifr) exif_data <- read_exif("FLIR0031.jpg") # 查看温度相关校准参数 print(exif_data[, grep("Temperature|Emissivity", names(exif_data))])
内容的提问来源于stack exchange,提问作者katefull06
相关产品推荐
相关产品推荐

