1 Classificação de Imagens Orbitais em R

Na aula de hoje iremos precisar dos pacotes a seguir. Então, antes de iniciar, realizem a instalação dos pocotes e o carregamento dos mesmos, como instruído no código a seguir.

Tutorial de como baixar imagens de satélite da plataforma Copernicus (https://dataspace.copernicus.eu/explore-data):

2 Conferindo a pasta de trabalho

Antes de darmos início ao trabalho, vamos conferir se estamos trabalhando no diretório correto (pasta de trabalho).

#encontrar diretório de trabalho
getwd()
## [1] "C:/ARQUIVOS COMPUTADOR/DOUTORADO/APOSTILA PROCESSAMENTO DIGITAL DE IMAGENS"
#selecionar diretório de trabalho
setwd ("C:/ARQUIVOS COMPUTADOR/DOUTORADO/APOSTILA PROCESSAMENTO DIGITAL DE IMAGENS")

No computador de vocês o caminho será diferente do meu. Então, se for preciso, façam os ajustes.

Primeiramente, vamos carregar o pacote “sf”, usado para manipulação de dados geoespaciais. Conforme vimos na aula anterior, as imagens orbitais possuem um resumo sobre elas, o qual é necessário para que haja a leitura da imagem pelos softwares. Portanto, sf vai nos ajudar nessa frente. Vamos instalar e carregar o pacote na sequência.

Após o carregamento do pacote, vamos carregar o arquivo “Franca.kml”, disponível na nossa pasta no Google Drive. O carregamento é feito através da função st_read() que integra o pacote sf. No código a seguir, coloque o caminho para o diretório em que você está trabalhando (substitua o meu). Após o carregamento, criamos o conjunto de dados franca e printamos o conjunto com a função print().

## Reading layer `Franca' from data source 
##   `C:\ARQUIVOS COMPUTADOR\DOUTORADO\APOSTILA PROCESSAMENTO DIGITAL DE IMAGENS\Franca.kml' 
##   using driver `KML'
## Simple feature collection with 1 feature and 2 fields
## Geometry type: POLYGON
## Dimension:     XYZ
## Bounding box:  xmin: -47.5416 ymin: -20.63941 xmax: -47.27391 ymax: -20.44025
## z_range:       zmin: 0 zmax: 0
## Geodetic CRS:  WGS 84
## Simple feature collection with 1 feature and 2 fields
## Geometry type: POLYGON
## Dimension:     XYZ
## Bounding box:  xmin: -47.5416 ymin: -20.63941 xmax: -47.27391 ymax: -20.44025
## z_range:       zmin: 0 zmax: 0
## Geodetic CRS:  WGS 84
##                 Name Description                       geometry
## 1 Medição sem título             POLYGON Z ((-47.5416 -20.63...

Note que o resultado de print() é um resumo do tipo de conjunto que estamos trabalhando, aquele que dissemos que estaria presente na imagem orbital.

Feito isso, utilizaremos o arquivo CBERS_4_MUX_20231228_156_123_L4_BAND8.tif que também consta na pasta de trabalho do Google Drive (recomendo baixar todos os arquivos CERBS na pasta de trabalho do computador). Este arquivo refere-se a uma imagem orbital disponibilizada pelo INPE, no acervo digital da instituição. Ao salvar as imagens no computador elas aparecerão em escala de cinza; não se preocupem, ao carregar no RStudio, os demais arquivos CERBS serão lidos já na escala RGB. Para o carregamento, a função será raster() com a especificação do nome do arquivo na pasta de trabalho. Posteriormente, utilizaremos a função plot() para visualizar a imagem do arquivo.

imagem_orbital <- raster("CBERS_4_MUX_20231228_156_123_L4_BAND8.tif")

plot(imagem_orbital)

Notem que a visualização do arquivo já encontra-se em RGB (colorida), isto ocorre pelas diretrizes dos arquivos de suporte (demais arquivos na pasta de trabalho).

Agora vamos recortar, da imagem orbital carregada, uma área de interesse para a análise (classificação). Para o recorte, estruturamos um quadrado de aproximadamente 20.000 (distância entre valores máximo e mínimo de XY) sobre a área de interesse; optamos por este valor porque, ao desenhar um quadrado no Google Earth sobre a cidade de Franca-SP, notamos que ele cobria praticamente todo o perímetro urbano da cidade (área urbana e rural inclusas).

Considerando os valores de xy min e máx da imagem orbital, disponibilizado por extent(), realizamos a determinação do quadrado sobre a imagem orbital

extent(imagem_orbital)
## class      : Extent 
## xmin       : 176940 
## xmax       : 322600 
## ymin       : 7653620 
## ymax       : 7792400
# Definir a extensão geográfica da área de interesse (substitua com suas próprias coordenadas)
aoi_extent <- extent(c(xmin = 196940  , xmax = 216940   , ymin = 7723010 , ymax = 7743010 ))

# Recortar a área de interesse
imagem_recortada <- crop(imagem_orbital, extent(aoi_extent))

# Visualizar a imagem recortada
plot(imagem_recortada)

3 Classificação Não-Supervisionada no R

3.1 kMeans

Usaremos os arquivos imagem_orbital01 e imagem_recortada. Nesta técnica de classificação, precisamos indicar no nosso código quantos grupos/classes queremos identificar. Vamos tentar identificar as seguintes classes:

  • pastagens;
  • reflorestamentos;
  • matas nativas;
  • áreas agricultáveis;
  • solo exposto (estradas de chão);
  • área urbanizada;
  • corpos d’água;

A partir desta definição, utilizaremos o código abaixo para rodar a classificação não-supervisionada kMeans.

# Supondo que a imagem orbital já foi carregada e é representada por "imagem_recortada"

# Obter os valores dos pixels
valores_pixels <- raster::extract(imagem_recortada, raster::extent(imagem_recortada), buffer = 500)

# Normalizar os valores
valores_normalizados <- scale(valores_pixels)

# Remover valores ausentes dos dados normalizados
valores_normalizados[is.na(valores_normalizados)] <- 0

# Ajustar o número de clusters para 7
num_clusters <- 7

# Realizar a clusterização com k-means
kmeans_result <- kmeans(valores_normalizados, centers = num_clusters)

# Atribuir rótulos aos clusters
rotulos_clusters <- kmeans_result$cluster

# Atribuir rótulos aos pixels
valores_atribuidos <- matrix(rotulos_clusters, ncol = ncol(imagem_recortada), nrow = nrow(imagem_recortada), byrow = TRUE)
imagem_agrupada <- setValues(imagem_recortada, valores_atribuidos)

# Visualizar a imagem original e a imagem agrupada
par(mfrow=c(1, 2))
plot(imagem_recortada, main = "Imagem Original")
plot(imagem_agrupada, col = brewer.pal(num_clusters, "Set3"), main = "Imagem Agrupada")

Observamos que a Classificação não supervisionada kMeans realizou a classificação da nossa imagem orbital recortada em 7 classes, conforme definimos anteriormente, gerando a imagem agrupada no código acima. A seguir, vamos individualizar cada uma das 7 classes em plotagens separadas.

# Supondo que a imagem agrupada já foi criada e é representada por "imagem_agrupada" e que os rótulos dos grupos estão na variável "rotulos_clusters"

# Ajustar o número de clusters
num_clusters <- max(rotulos_clusters)

# Descobrir quantas classes únicas existem
classes_unicas <- unique(rotulos_clusters)
num_classes <- length(classes_unicas)

# Criar uma paleta de cores com base no número real de classes
paleta_cores <- brewer.pal(num_classes, "Set3")

# Loop para criar visualizações separadas para cada classe
for (i in classes_unicas) {
  # Subconjunto da imagem original para a classe atual
  subconjunto_original <- imagem_recortada
  subconjunto_original[rotulos_clusters != i] <- NA
  
  # Visualizar a classe atual
  plot(subconjunto_original, col = paleta_cores[i], main = paste("Classe", i))
}

Com isto, encerramos a aula 02 apresentando uma ferramenta de classificação de imagem orbital não supervisonada, a kMeans. Conseguimos carregar a imagem orbital adquirida na plataforma do Copernicus, recortar esta imagem em uma área de interesse e realizar a classificação em 7 classes. Plotamos estes dados e visualizamos em conjunto e individualmente cada uma das categorias classificadas.

Índice

Capítulo 01 - Introdução ao R, RStudio e RMarkdown

Capítulo 03 - Histogramas - Quantização e Amostragem

4 Referências Bibliográficas

ANDERSON, E. C. Making Maps with R Â: Reproducible Research. GitHub, 2021. Disponível em: https://eriqande.github.io/rep-res-web/lectures/making-maps-with-R.html.

CHAMBERS, J. M. Extending R. CRC Press, 364p., 2017. ISBN: 9781498775724.

DA SILVA, F. R.; GONÇALVES-SOUZA, T.; PATERNO, G. B.; PROVETE, D. B.; VANCINE, M. H. Análises ecológicas no R. Recife, PE: Nupeea, 1ª ed., 640p., 2022. ISBN: 9788579175640. Disponível em: https://analises-ecologicas.com/.

GAUTHIER, N. Anthromes 12K DGG (V1) analysis code and R research compendium. Harvard Dataverse, 2021. DOI: https://doi.org/10.7910/DVN/6FWPZ9.

LOVELACE, R. Introduction to visualizing spatial data in R. 2017. Disponível em:https://github.com/Robinlovelace/Creating-maps-in-R.

LOVELACE, R., NOWOSAD, J., & MUENCHOW, J. Geocomputation with R. Chapman and Hall/CRC, 353p., 2019. Disponível em: https://www.routledge.com/Geocomputation-withR/Lovelace-Nowosad-Muenchow/p/book/9780367670573

MACHLIS, S. Create maps in R in 10 (fairly) easy steps. Computerworld, 2017. Disponível em: https://www.computerworld.com/article/3038270/create-maps-in-r-in-10-fairly-easy-steps.html.

MARTOS, G. Cluster Analysis with R. 2021. Disponível em: https://rstudio-pubsstatic.s3.amazonaws.com/33876_1d7794d9a86647ca90c4f182df93f0e8.html.

MENESES, P. R.; ALMEIDA, T. D.; ROSA, A. N. D. C. S.; SANO, E. E. et al. Introdução ao Processamento de Imagens de Sensoriamento Remoto. Brasília: UnB-CNPq, 276 p., 2012.

MORENO, M. & BASILLE, M. Drawing beautiful maps programmatically with R, sf and ggplot2 - Part 1: Basics. 2021. Disponível em: https://r-spatial.org/r/2018/10/25/ggplot2-sf.html.

MUENCHOW, J.; SCHRATZ, P.; BRENNING, A. RQGIS: Integrating R with QGIS for Statistical Geocomputing. The R Journal, 9, n. 2, p. 409-428, 2017 2017. Doi: https://doi.org/10.32614/RJ-2017-067.

NOVIA, D. Cluster Analysis in R: Tips for Great Analysis and Visualization. Datanovia, 2018.Disponível em: https://www.datanovia.com/en/blog/cluster-analysis-in-r-simplified-and-enhanced/.

PEBESMA, E.; BIVAND, R. Spatial Data Science: With Applications in R. Chapman and Hall/CRC, 1ª ed., 314p., 2023. Doi: https://doi.org/10.1201/9780429459016.

R-BLOGGERS. Cluster Analysis in R. 2021. Disponível em: https://www.rbloggers.com/2021/04/cluster-analysis-in-r/.

STANIAK, M.; BIECEK, P. The Landscape of R Packages for Automated Exploratory Data Analysis. The R Journal, v. 11, n. 2, 23 p., 2019. Disponível em: https://arxiv.org/pdf/1904.02101.

VENABLES, W. N.; SMITH, D. M. An Introduction to R. R Core Team, 2017. Disponível em: http://colinfay.me/intro-to-r/#.

WICKHAM, H. Advanced R. CRC Press, 2ª ed., 2022. Disponível em: https://advr.hadley.nz/#license

:::