我通常使用ENVI来执行此过程,但是我试图将所有内容保留在R中以编写更多的栅格处理脚本。
在ENVI中,我使用的工具称为“细分图像”。参数包括像素阈值,最小人口数和所考虑的邻居数。它的工作原理是首先找到所有满足定义阈值的像素,然后将这些像素(如果它们共同满足总体大小)分组在一起。
有没有办法在R中实现这一目标?看来这是一个相对简单的分析,但我似乎找不到能做到这一点的函数。
谢谢!
答案 0 :(得分:1)
示例数据
library(raster)
vi <- raster(ncols=20, nrows=20, xmn=0, xmx=1, ymn=0, ymx=1)
set.seed(101)
values(vi) <- runif(ncell(vi)) * .9
重新分类
m <- c(-1, 0.5, 0,
0.5, 1, 1)
r <- reclassify(vi, m)
查找补丁(此处仅是Rook-case补丁)
rc <- clump(r, directions=4)
#plot(rc)
获取补丁大小并选择大于10的补丁
f <- freq(rc)
ff <- f[f[,2]>10, 1]
ff <- ff[!is.na(ff)]
选择大于10的补丁
msk <- subs(rc, data.frame(ff, 1))
并使用它来选择原始栅格中的网格像元
z <- mask(vi, msk)
答案 1 :(得分:0)
使用上面的罗伯特(Robert)的示例,这是我最终完成任务所需的代码。
# set parameters
min_val <- 0.5
min_pop <- 9
neighbors <- 8
# reclassify all cells
# values between -1 and min_val become 0
# values between min_val and 1 become 1
r <- ndvi
r[r > min_val] <- 1
r[r <= min_val] <- 0
# clump together cells
rc <- clump(r, directions = neighbors, gaps = TRUE)
# get patch size and select those larger than min_pop
f <- freq(rc)
ff <- f[f[,2] >= min_pop, 1]
ff <- ff[!is.na(ff)]
# select those larger than 10
msk <- subs(rc, data.frame(ff, 1))
# mask original NDVI raster
z <- mask(ndvi, msk)
# make result binary
z[z > 0] <- 1
z[is.na(z)] <- 0}