使用像素值和人口规模分割光栅图像
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}
我通常使用 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}