如何在R语言中将单波段分类栅格转换为映射RGB值及三维RGB数组?
将单波段分类栅格转换为三维RGB数组
问题场景
如何将单波段分类栅格转换为三维RGB数组?我们需要为每个类别数值指定对应颜色,最终生成包含十进制RGB值(0-255)的三维数组。比如已知示例中的栅格r和颜色映射myCol,如何程序化生成目标rgb_array?
示例基础代码:
library(raster) # 示例栅格 r <- raster(ncol=4, nrow=4) r[] <- c(rep(1, 8), rep(2, 8)) # 类别颜色映射:1=红色,2=蓝色 myCol = c("red", "blue") plot(r, col=myCol) # 手动定义的目标RGB数组(需程序化生成) red_band <- c(rep(255, 8), rep(0, 8)) green_band <- c(rep(0, 8), rep(0, 8)) blue_band <- c(rep(0, 8), rep(255, 8)) rgb_array <- array(c(red_band, green_band, blue_band), dim= c(4, 4, 3))
程序化实现步骤
核心思路是将颜色字符串转换为RGB数值,再根据栅格的类别值映射到对应通道,最后重组为三维数组:
- 将颜色名称转换为RGB十进制值
使用R内置的col2rgb()函数,把颜色字符串转换为0-255范围的RGB矩阵:
rgb_vals <- col2rgb(myCol)
该矩阵为3行(红、绿、蓝通道)×N列(N为类别数量)的结构,每一列对应一个类别的RGB值。
- 为栅格像元匹配对应RGB通道值
通过栅格的像元值作为索引,从rgb_vals中提取每个通道的数值:
red_band <- rgb_vals[1, ][r[]] # 红通道 green_band <- rgb_vals[2, ][r[]] # 绿通道 blue_band <- rgb_vals[3, ][r[]] # 蓝通道
- 构建三维RGB数组
使用array()函数将三个通道的向量组合成(行数, 列数, 3)的三维数组:
rgb_array <- array(c(red_band, green_band, blue_band), dim = c(nrow(r), ncol(r), 3))
完整可运行代码
library(raster) # 示例栅格 r <- raster(ncol=4, nrow=4) r[] <- c(rep(1, 8), rep(2, 8)) # 类别颜色映射 myCol = c("red", "blue") # 转换颜色为RGB数值 rgb_vals <- col2rgb(myCol) # 匹配每个像元的RGB通道值 red_band <- rgb_vals[1, ][r[]] green_band <- rgb_vals[2, ][r[]] blue_band <- rgb_vals[3, ][r[]] # 生成三维RGB数组 rgb_array <- array(c(red_band, green_band, blue_band), dim = c(nrow(r), ncol(r), 3)) # 查看结果 print(rgb_array)
运行后生成的rgb_array与手动定义的完全一致,且支持扩展到任意数量的类别,无需手动编写重复代码。
内容的提问来源于stack exchange,提问作者jens wiesehahn
相关产品推荐
相关产品推荐

