我有包含高光谱数据的 hdf5 栅格文件。
我用 R 编程语言做了
f <- paste0(wd,"img1.h5")
View(h5ls(f,all=T))
输出的反射率数据为:
/SITE-NAME/Reflectance/Reflectance_Data
维度为 (3311, 678, 425)(行、列、带)。
我需要做一些计算,不是频带数学,而是光谱数学,即像素计算。
每个频谱(像素)x 都被 xbn 替代,定义为 x 除以其向量||x|| 的长度。
如何完成。
我不知道如何在 R 中做到这一点..我能够进行带计算。
忽略任何复杂的附带问题(例如 RAM 过载以及与文件和 R 中不同数据存储模型相关的性能),计算 xbn 的基本函数相对简单:
# x is a vector of spectral values for a single pixel
xbn <- function(x) {
x / sqrt(sum(x^2))
}
这将为您提供构成像素的每个光谱带的 425 个
bn
值。
将此功能应用于整个图像同样简单:
# Load your data into R, calling it here img1
img1bn <- apply(img1, MARGIN = c(1, 2), xbn) |> aperm(c(2, 3, 1))
apply()
函数在数组的一个或多个维度上运行函数(此处为xbn()
),在本例中,前两个维度表示数据的列和行。 apply()
然后获取剩余维度中的数据(您的光谱数据)并将其输入到提供的函数。
有点烦人(但从性能角度来看可以理解),结果的维度交换了,应用函数的维度首先出现,边距维度紧随其后。这是使用
aperm()
函数修复的。
从这样的事情开始
library(terra)
x <- rast(f)
# or
x <- sds(f)
并找出如何对感兴趣的变量进行子集化。我无法告诉你如何做,因为我没有该文件。
之后你就可以做
bn <- app(x, \(i) i / sqrt(sum(i^2)))