创建聚类值并将其设置为新的栅格-k-均值分类

Creating and setting clusters values to a new raster- k-mean classification

我想创建一个简单的 kmeans 无监督分类。我在创建聚类并将聚类值设置为新栅格时遇到问题。 site.

我受到了启发
landsat5 <- stack('5.tif')
names(landsat5) <- c('blue', 'green', 'red', 'NIR', 'SWIR1', 'thermal', 'SWIR2')
ndvi <- (landsat5[['NIR']] - landsat5[['red']]) / (landsat5[['NIR']] + landsat5[['red']])
nr <- getValues(ndvi)
set.seed(99)
kmncluster <- kmeans(na.omit(nr), centers = 10, iter.max = 500, nstart = 5, algorithm="Lloyd")
knr <- setValues(ndvi, kmncluster$cluster)
knr <- raster(ndvi)
values(knr) <- kmncluster$cluster
mycolor <- c("#fef65b","#ff0000", "#daa520","#0000ff","#0000ff","#00ff00","#cbbeb5",
             "#c3ff5b", "#ff7373", "#00ff00", "#808080")
par(mfrow = c(1,2))
plot(ndvi, col = rev(terrain.colors(10)), main = 'Landsat-NDVI')
plot(knr, main = 'Unsupervised classification', col = mycolor )

我收到这个错误:

Error in 'setValues(ndvi, kmncluster$cluster)': length(values) is not equal to ncell(x), or to 1.

知道为什么会显示错误吗?

正如 s_t 指出的那样,问题是由 na.omit(nr) 造成的,因为它删除了案例,案例数不再等于栅格单元数。

这是一个最小的、可重现的、独立的例子

library(raster)
b <- brick(system.file("external/rlogo.grd", package="raster"))
vi <- (b$red - b$green) / (b$red + b$green)
nr <- getValues(vi)

nr 中有 NA 个值(其中 red+green == 0),需要删除这些值才能使用 kmeans。但是您可以使用

而不是使用 na.omit
i <- !is.na(nr)
set.seed(99)
kmncluster <- kmeans(nr[i], centers = 10, iter.max = 500, nstart = 5, algorithm="Lloyd")

现在您可以用它们的集群成员替换 nr 中的值,并将这些值放入 RasterLayer

nr[i] <- kmncluster$cluster
knr <- setValues(vi, nr)
plot(knr)