【发布时间】:2011-08-05 19:57:27
【问题描述】:
包装:
数据:
- 具有 10 个波段的 rasterStack。
- 每个波段都包含一个被 NA 包围的图像区域
- 波段是合乎逻辑的,即图像数据为“1”,周围区域为“0”/NA
- 每个波段的“图像区域”彼此不完全对齐,尽管大多数有部分重叠
目标:
- 编写一个快速函数,该函数可以返回每个“区域”的 rasterLayer 或像元编号,例如,仅包含波段 1 和 2 的数据的像素位于区域 1,仅包含波段 3 和 4 的数据的像素位于在区域 2 等。如果返回 rasterLayer,我需要能够稍后将区域值与波段编号匹配。
第一次尝试:
# Possible band combinations
values = integer(0)
for(i in 1:nlayers(myraster)){
combs = combn(1:nlayers(myraster), i)
for(j in 1:ncol(combs)){
values = c(values, list(combs[,j]))
}
}
# Define the zone finding function
find_zones = function(bands){
# The intersection of the bands of interest
a = subset(myraster, 1)
values(a) = TRUE
for(i in bands){
a = a & myraster[[i]]
}
# Union of the remaining bands
b = subset(myraster, 1)
values(b) = FALSE
for(i in seq(1:nlayers(myraster))[-bands]){
b = b | myraster[[i]]
}
#plot(a & !b)
cells = Which(a & !b, cells=TRUE)
return(cells)
}
# Applying the function
results = lapply(values, find_zones)
我当前的函数需要很长时间才能执行。你能想出更好的方法吗?请注意,我不只是想知道每个像素有多少波段有数据,我还需要知道哪些波段。这样做的目的是在之后以不同的方式处理不同的区域。
另请注意,实际场景是 3000 x 3000 或更大的栅格,可能有超过 10 个波段。
编辑
由10个偏移图像区域组成的一些样本数据:
# Sample data
library(raster)
for(i in 1:10) {
start_line = i*10*1000
end_line = 1000000 - 800*1000 - start_line
offset = i * 10
data = c(rep(0,start_line), rep(c(rep(0,offset), rep(1,800), rep(0,200-offset)), 800), rep(0, end_line))
current_layer = raster(nrows=1000, ncols=1000)
values(current_layer) = data
if(i == 1) {
myraster = stack(current_layer)
} else {
myraster = addLayer(myraster, current_layer)
}
}
NAvalue(myraster) = 0 # You may not want to do this depending on your solution...
【问题讨论】:
-
你能详细说明什么是“区域”吗?
-
我会定义一个“区域”,一组单元格具有相同波段的数据(并且只有那些共同的波段)。例如,如果您有两个图层,每个图层都是正方形,但有一个偏移 100 像素,那么您将有 3 个区域,一个只有波段 1,一个只有波段 2,一个有两个。我需要在 rasterLayer 中对它们进行编号,使用数据框来链接波段编号和区域编号,或者使用可以返回哪些单元格编号属于每个区域的函数。最后,需要将至少 1 个波段中的数据所在的每个像素分配给这样的“区域”。
-
有点像你对多边形特征进行联合,但需要知道子区域共有哪个原始多边形。
-
@Benjamin:想添加一些样本数据作为测试用例吗?
-
@Joris Meys:完成。好主意。
标签: r image-processing raster