Tengo una serie temporal de imágenes de satélite (5 bandas) y quiero clasificarlas por kmeans en R. Mi script está funcionando bien (recorrer mis imágenes, convertir las imágenes en data.frame, agruparlas y convertirlas nuevamente en un trama):
for (n in files) {
image <- stack(n)
image <- clip(image,subset)
###classify raster
image.df <- as.data.frame(image)
cluster.image <- kmeans(na.omit(image.df), 10, iter.max = 10, nstart = 25) ### kmeans, with 10 clusters
#add back NAs using the NAs in band 1 (identic NA positions in all bands), see http://stackoverflow.com/questions/12006366/add-back-nas-after-removing-them/12006502#12006502
image.df.factor <- rep(NA, length(image.df[,1]))
image.df.factor[!is.na(image.df[,1])] <- cluster.image$cluster
#create raster output
clusters <- raster(image) ## create an empty raster with same extent than "image"
clusters <- setValues(clusters, image.df.factor) ## fill the empty raster with the class results
plot(clusters)
}
Mi problema es: no puedo comparar los resultados de clasificación entre sí porque los asignadores de clúster difieren de una imagen a otra. Por ejemplo, "agua" está en el primer grupo de imágenes número 1, en los siguientes 2 y en los terceros 10, lo que hace imposible comparar los resultados del agua entre las fechas.
¿Cómo puedo arreglar la asignación del clúster?
¿Puedo especificar un punto de partida fijo para todas las imágenes (esperando que el agua siempre se detecte primero y, por lo tanto, se clasifique como 1)?
Y si es así, ¿cómo?
fuente
Para implementar la agrupación en una pila de imágenes, no lo hace banda por banda sino más bien en toda la pila de imágenes simultáneamente. De lo contrario, como señaló @nmatton, la estadística no tiene mucho sentido.
Sin embargo, no estoy de acuerdo en que esto no sea posible, solo en memoria intensiva. En datos satelitales reales, este será un gran problema, y tal vez imposible en datos de alta resolución, pero puede procesar en la memoria coaccionando su (s) ráster (es) en un solo objeto que se puede pasar a una función de agrupamiento. Deberá realizar un seguimiento de los valores de NA en los rásteres porque se eliminarán durante el agrupamiento y deberá conocer las posiciones en el ráster para poder asignar los valores del clúster a las celdas correctas.
Podemos pasar por un enfoque aquí. Agreguemos las bibliotecas requeridas y algunos datos de ejemplo (el logotipo RGB R para darnos 3 bandas para trabajar).
Primero, podemos obligar a nuestro objeto de pila de ráster multibanda a un marco de datos usando getValues. Tenga en cuenta que estoy agregando un valor de NA en la fila 1, columna 3 para que pueda ilustrar cómo tratar sin datos.
Aquí, podemos ponernos manos a la obra y crear un índice de celda de los valores distintos de NA que se utilizarán para asignar los resultados del clúster.
Ahora, creamos un objeto de clúster a partir de los valores RGB de 3 bandas con k = 4. Estoy usando el método clara K-Medoids porque es bueno con datos grandes y es mejor con distribuciones extrañas. Es muy similar a K-Means.
Por simplicidad, podemos crear un ráster vacío extrayendo una de las bandas de ráster de nuestro objeto de pila ráster original y asignándole valores NA.
Finalmente, usando el índice, asignamos los valores del clúster a la celda apropiada en el ráster vacío y graficamos los resultados.
Para rásters enormes, es posible que desee buscar en el paquete bigmemory que escribe matrices en el disco y opera en bloques y hay una función k-means disponible. Además, tenga en cuenta que esto no es exactamente para lo que R fue diseñado y que un procesamiento de imágenes o software SIG puede ser más apropiado. Sé que SAGA y la caja de herramientas Orfeo son software libre que tiene clústeres de k-means disponibles para pilas de imágenes. Incluso hay una biblioteca RSAGA que permite llamar al software desde R.
fuente