用像素值和总体大小分割光栅图像

时间:2019-02-18 17:31:46

标签: r raster

我通常使用ENVI来执行此过程,但是我试图将所有内容保留在R中以编写更多的栅格处理脚本。

在ENVI中,我使用的工具称为“细分图像”。参数包括像素阈值,最小人口数和所考虑的邻居数。它的工作原理是首先找到所有满足定义阈值的像素,然后将这些像素(如果它们共同满足总体大小)分组在一起。

有没有办法在R中实现这一目标?看来这是一个相对简单的分析,但我似乎找不到能做到这一点的函数。

谢谢!

2 个答案:

答案 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}