像素级数学

问题描述 投票:0回答:2

我有包含高光谱数据的 hdf5 栅格文件。

我用 R 编程语言做了

f <- paste0(wd,"img1.h5")
View(h5ls(f,all=T))

输出的反射率数据为:

/SITE-NAME/Reflectance/Reflectance_Data

维度为 (3311, 678, 425)(行、列、带)。

我需要做一些计算,不是频带数学,而是光谱数学,即像素计算。

每个频谱(像素)x 都被 xbn 替代,定义为 x 除以其向量||x|| 的长度。 Equation for calculation

如何完成。

我不知道如何在 R 中做到这一点..我能够进行带计算。

r raster hdf5 rhdf5
2个回答
1
投票

忽略任何复杂的附带问题(例如 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()
函数修复的。


0
投票

从这样的事情开始

library(terra)
x <- rast(f)
# or 
x <- sds(f)

并找出如何对感兴趣的变量进行子集化。我无法告诉你如何做,因为我没有该文件。

之后你就可以做

bn <- app(x, \(i) i / sqrt(sum(i^2)))
© www.soinside.com 2019 - 2024. All rights reserved.