如何在R中计算3D RasterLayer各图层的20x11维度均值?
解决R中图像栈单张图像均值计算问题
你的核心需求是:对维度为20×11×68的图像栈,计算每一层(共68张20×11图像)的全局像素均值,最终得到一个长度为68的数值向量。以下针对不同数据类型给出正确实现方案:
先分析你之前的错误
- 直接调用
mean():若为普通数组会计算所有元素的总均值;若为RasterStack则默认按像素维度(前两维)跨层求均值,因此得到20×11矩阵,不符合需求。 apply指定MARGIN = c(1,2):这是对每个像素位置跨68层求均值,方向完全搞反,结果自然是20×11矩阵。- 最初的for循环:逻辑正确,但未预先初始化结果向量,且若为
RasterStack类型,直接用mean(layer[])的写法效率低且易出错。 lapply代码:存在语法错误(括号未闭合),且错误使用extract函数,完全没必要用它提取单图层像素值。
正确实现方法
情况1:stack_images是基础R数组(array)
如果是普通多维数组结构,用apply指定对第三维(层维度)计算均值即可:
# 假设stack_images是array(..., dim = c(20, 11, 68)) mean_per_layer <- apply(stack_images, MARGIN = 3, FUN = function(x) mean(x, na.rm = TRUE))
也可以用更高效的colMeans(先将每个图层转为一列):
mean_per_layer <- colMeans(array(stack_images, dim = c(20*11, 68)), na.rm = TRUE)
情况2:stack_images是RasterStack(raster包)
如果是遥感图像常用的RasterStack类型,用cellStats结合lapply更高效:
library(raster) # 遍历每个图层计算全局均值 mean_per_layer <- unlist(lapply(stack_images, function(layer) cellStats(layer, mean, na.rm = TRUE)))
或者修复你最初的for循环:
# 预先初始化结果向量 moyennes_par_image <- numeric(nlayers(stack_images)) for (i in 1:nlayers(stack_images)) { layer <- stack_images[[i]] moyennes_par_image[i] <- cellStats(layer, mean, na.rm = TRUE) }
结果验证
最终得到的mean_per_layer或moyennes_par_image会是一个长度为68的数值向量,每个元素对应一张20×11图像的全局像素均值。
内容的提问来源于stack exchange,提问作者Aurélien Lengrand
相关产品推荐
相关产品推荐

