使用像素值和人口规模分割光栅图像

Segment raster image with pixel values and population size

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

在 ENVI 中,我使用的工具称为 "Segmentation Image." 参数包括像素阈值、人口最小值和考虑的邻居数量。它的工作原理是首先找到满足定义阈值的所有像素,然后将这些像素分组在一起,如果它们共同满足人口规模。

有没有办法在 R 中解决这个问题?看起来是一个比较简单的分析,但我似乎找不到一个函数可以做到这一点。

谢谢!

示例数据

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)

获取补丁大小和select那些大于10

f <- freq(rc)
ff <- f[f[,2]>10, 1]
ff <- ff[!is.na(ff)]

Select 大于 10

的补丁
msk <- subs(rc, data.frame(ff, 1))

并将其用于 select 原始栅格中的网格单元

z <- mask(vi, msk)

使用上面 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}