Ref.: Cap. 09: aritmética de bandas - 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.
A aritmética de bandas é uma técnica comum usada para processar imagens multiespectrais, como aquelas capturadas por satélites. Envolve a manipulação matemática das diferentes bandas espectrais para obter informações mais úteis sobre a área de interesse. Geralmente, isso inclui operações como adição, subtração, multiplicação e divisão entre as bandas. Essas operações podem ajudar a realçar características específicas na imagem, remover ruídos ou corrigir distorções atmosféricas, entre outras aplicações.
A soma de bandas é uma técnica de processamento de imagens que envolve adicionar os valores de pixel correspondentes de duas ou mais bandas espectrais de uma imagem multiespectral. Essa técnica é frequentemente utilizada para realçar características específicas na imagem ou para combinar diferentes fontes de informação espectrais.
A multiplicação de bandas é uma técnica de processamento de imagens que envolve multiplicar os valores de pixel correspondentes de duas ou mais bandas espectrais de uma imagem multiespectral. Essa técnica é frequentemente utilizada para realçar características específicas na imagem ou para destacar relações entre as diferentes bandas espectrais.
A subtração de bandas é uma técnica de processamento de imagens que envolve subtrair os valores de pixel correspondentes de duas bandas espectrais de uma imagem multiespectral. Essa técnica é comumente utilizada para realçar diferenças ou identificar mudanças na cena observada. ções de processamento de imagens orbitais para realçar características, detectar mudanças e extrair informações relevantes da cena observada.
A divisão de bandas em imagens orbitais é uma técnica comumente usada no processamento de imagens de sensoriamento remoto, especialmente em áreas como sensoriamento remoto ambiental e agrícola. Esta técnica envolve a divisão das intensidades de pixel de uma banda por outra, geralmente para corrigir efeitos atmosféricos, normalizar os dados ou realçar características específicas na imagem. Por exemplo, na correção atmosférica, a divisão das bandas pode ser usada para compensar os efeitos da atmosfera na intensidade da radiação capturada pelos sensores orbitais. Isso ajuda a obter medidas mais precisas das características da superfície terrestre. Além disso, na agricultura de precisão, a divisão de bandas pode ser aplicada para calcular índices de vegetação, como o NDVI (Índice de Vegetação por Diferença Normalizada), onde a divisão de bandas específicas (geralmente banda de infravermelho próximo e banda vermelha) ajuda a identificar a saúde e a densidade da vegetação.
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.
Antes de darmos início ao trabalho, vamos conferir se estamos trabalhando no diretório correto (pasta de trabalho).
## [1] "C:/ARQUIVOS COMPUTADOR/DOUTORADO/APOSTILA PROCESSAMENTO DIGITAL DE IMAGENS"
Carregados os pacotes e verificado o diretório de trabalho, vamos para nossas análises. As dividiremos conforme a introdução, seguindo a mesma sequência: soma, multiplicação, subtração e divisão.
Primeiramente vamos carregar nossas imagens utilizando a função raster(). Carregaremos 5 bandas de uma imagem captada pelo sensor CBERS: 1 imagem pancromática (PAN), 1 infravermelho próximo (nir) e 3 bandas das cores RGB (vermelho, verde e azul), as quais foram recortadas em uma área de interesse; o recorte da imagem foi realizado no Multispec.
#Carregamento da banda pancromática (PAN)
area_pan <- raster("area_banda0_pan.tif")
#Carregamento das bandas RGB e NIR
area_banda1_azul <- raster("area_banda1_blue.tif")
area_banda2_verde <- raster("area_banda2_green.tif")
area_banda3_vermelho <- raster("area_banda3_red.tif")
area_banda4_nir <- raster("area_banda4_nir.tif")Destas 4 bandas carregadas, utilizaremos apenas as bandas 2 e 3 na soma, de modo a otimizar nossa análise. Entretanto, como dito precedentemente, a soma pode envolver n bandas. Para facilitar a comparação, vamos exportar as imagens das duas bandas apenas tratadas.
Agora que as bandas foram carregadas, podemos prosseguir com a soma das bandas. Na aritmética de bandas, especialmente quando tratamos da soma de bandas, é necessário realizar a média dos valores dos pixels em cada posição das bandas e então criar uma nova imagem com esses valores médios, através das seguintes etapas:
Então vamos ao código. O passo seguinte ao carregamento é a extração dos valores dos pixels.
# Extrair os valores dos pixels de cada banda
valores_area_banda2_verde <- getValues(area_banda2_verde)
valores_area_banda3_vermelho <- getValues(area_banda3_vermelho)Extraídos os valores, vamos à soma dos valores dos pixels das 4 bandas, seguida pela divisão pelo número de bandas.
# Somar os valores dos pixels de todas as bandas
soma_bandas <- (valores_area_banda2_verde + valores_area_banda3_vermelho)
# Dividir pelo número de bandas
bandas_somadas_area <- soma_bandas / 2Realizados os processos de soma e divisão, seguimos com a criação da nova imagem.
# Criar uma nova imagem com os valores médios
imagem_bandas_somada <- setValues(area_banda2_verde, bandas_somadas_area)
# Plotar a imagem resultante
plot(imagem_bandas_somada, col = gray.colors(256), main = "Area com as Bandas Somadas")Neste tópico utilizaremos as mesmas imagens carregadas anteriormente (bandas pan, RGB e nir) da área de análise. Na multiplicação de bandas para realçar características como vegetação, é comum usar a banda do infravermelho próximo (NIR) e a banda do vermelho. Isso se deve ao fato de que a vegetação reflete muito bem na banda NIR e absorve na banda do vermelho, o que resulta em uma diferença de contraste significativa entre vegetação e outros tipos de cobertura terrestre. Portanto, na multiplicação de bandas para realçar a vegetação, podemos multiplicar a banda NIR pela banda do vermelho pixel a pixel, de modo a realçar as áreas de vegetação na imagem resultante.
Antes de iniciarmos o processo, vamos exportar as imagens geradas pelas duas bandas para podermos compará-las no final
area_banda3_vermelho <- raster(“area_banda3_red.tif”) area_banda4_nir <- raster(“area_banda4_nir.tif”)
Com as imagens exportadas, vamos prosseguir com a multiplicação das bandas. Primeiro vamos extrair os valores dos pixels das duas imagens. Depois vamos multiplicar estes valores das duas matrizes. Após a multiplicação, vamos criar a imagem com os valores multiplicados e plotar esta imagem. O código a seguir demonstra o processo.
# Extrair os valores dos pixels de cada banda
valores_area_banda3_vermelho <- getValues(area_banda3_vermelho)
valores_area_banda4_nir <- getValues(area_banda4_nir)
# Multiplicar os valores dos pixels das duas bandas
bandas_multiplicadas <- valores_area_banda3_vermelho * valores_area_banda4_nir
# Criar uma nova imagem com os valores multiplicados
imagem_area_multiplicada <- setValues(area_banda3_vermelho, bandas_multiplicadas)
# Plotar a imagem resultante
plot(imagem_area_multiplicada, col = gray.colors(256), main = "Multiplicacao de Bandas Red e NIR")Embora a subtração de bandas geralmente seja realizada entre imagens de datas diferentes para destacar mudanças ao longo do tempo, também pode ser útil realizar a subtração entre bandas de uma mesma data para realçar características específicas na cena. Por exemplo, ao subtrair a banda verde da banda azul, podemos realçar características na cena que são mais proeminentes na banda verde em comparação com a banda azul, e vice-versa. Isso pode ser útil para destacar variações na cobertura do solo, diferenças na vegetação ou outras características que tenham respostas espectrais distintas em diferentes comprimentos de onda. Portanto, embora seja mais comum realizar a subtração entre imagens de datas diferentes para detectar mudanças temporais, também é válido realizar a subtração entre bandas de uma mesma data para realçar características específicas na cena.
Nesta perspectiva, realizaremos a subtração de bandas de uma mesma imagem (aquelas já carregadas anteriormente). Focaremos nas bandas azul e verde que carregamos para realizar a subtração. Vamos exportar as imagens das bandas verde e azul para a posterior comparação.
area_pan <- raster(“area_banda0_pan.tif”) area_banda1_azul <- raster(“area_banda1_blue.tif”) area_banda2_verde <- raster(“area_banda2_green.tif”) area_banda3_vermelho <- raster(“area_banda3_red.tif”) area_banda4_nir <- raster(“area_banda4_nir.tif”)
Após a exportação, vamos dar início ao processo de subtração de bandas. Primeiramente vamos extrair os valores dos pixels das bandas azul e verde, criando duas matrizes. Depois vamos subtrair os valores da banda verde da banda azul, gerando uma nova matriz. Desta matriz, realizaremos a construção da nova imagem e, seguidamente, a plotagem dela. O código a seguir ilustra o processo.
# Extrair os valores dos pixels das bandas azul e verde
valores_area_banda1_azul <- getValues(area_banda1_azul)
valores_area_banda2_verde <- getValues(area_banda2_verde)# Subtração da banda verde da banda azul
subtracao_bandas <- (valores_area_banda1_azul - valores_area_banda2_verde)+255# Criar uma nova imagem com os valores multiplicados
imagem_subtracao_bandas <- setValues(area_banda1_azul, subtracao_bandas)
# Plotar a imagem resultante
plot(imagem_subtracao_bandas, col = gray.colors(256), main = "Subtracao Banda Azul - Banda Verde")Na divisão de bandas continuaremos com as mesmas bandas da imagem carregada antes.
Como já realizamos a extração dos valores dos pixels das bandas RGB e NIR, poderemos utilizar essas matrizes nas próximas análises. Os nomes das matrizes são:
No código a seguir, vamos calcular a média dos valores dos pixels para cada banda e depois vamos identificar a banda com maior e menor reflectância para realizarmos a divisão de bandas. De acordo com o predito na introdução, quanto maior for a diferença entre as reflectâncias das bandas, melhor será o resultado obtido na razão de bandas. Então, vamos ao cálculo para identificação.
# Calculando a média dos valores de cada banda
media_banda1_azul <- mean(valores_area_banda1_azul, na.rm = TRUE)
media_banda2_verde <- mean(valores_area_banda2_verde, na.rm = TRUE)
media_banda3_vermelho <- mean(valores_area_banda3_vermelho, na.rm = TRUE)
media_banda4_nir <- mean(valores_area_banda4_nir, na.rm = TRUE)## Media de reflectancia - Banda Azul: 137.3973
## Media de reflectancia - Banda Verde: 142.5909
## Media de reflectancia - Banda Vermelha: 103.5094
## Media de reflectancia - Banda NIR: 165.473
Apesar de observarmos que a banda NIR possui maior reflectância entre as 4 bandas, não a utilizaremos por hora, pois, ela é fundamental no cálculo do índice de vegetação (NDVI). Assim, utilizaremos para a divisão de bandas a banda verde e a banda vermelha, maior e menor reflectância respectivamente. Primeiramente vamos realizar a divisão entre as duas matrizes (verde pela vermelha) e depois iremos, com base nos resultados matriciais, identificar o valor escalar para multiplicação da matriz, de modo que os valores da nova matriz estejam entre 0 e 255.
# Calculando a divisão entre as bandas vermelha e verde para cada pixel
divisao_bandas <- valores_area_banda2_verde / valores_area_banda3_vermelho
# Calculando o valor escalar (a)
a <- 255 / max(divisao_bandas, na.rm = TRUE)
# Exibindo o valor escalar
print(a)## [1] 11.59091
Após a finalização da divisão das bandas para construção da matriz divisao_bandas_multiplicada, podemos passar à construção da nossa nova imagem.
# Criar uma nova imagem com os valores multiplicados
imagem_divisao_bandas <- setValues(area_banda2_verde, divisao_bandas_multiplicada)
# Plotar a imagem resultante
plot(imagem_divisao_bandas, col = gray.colors(256), main = "Divisao da Banda Verde pela Banda Vermelha")Sendo o índice de vegetação também uma divisão de bandas, realizaremos o mesmo procedimento apenas realizado. Entretanto, aqui focaremos nas bandas NIR e vermelha da imagem. Portanto, nossos conjuntos analíticos são:
# Calculando a divisão entre as bandas vermelha e verde para cada pixel
divisao_bandas_rvi <- valores_area_banda4_nir / valores_area_banda3_vermelho
# Calculando o valor escalar (a)
b <- 255 / max(divisao_bandas_rvi, na.rm = TRUE)
# Exibindo o valor escalar
print(b)## [1] 44.04545
divisao_bandas_rvi_multiplicada <- divisao_bandas_rvi * 44.04545
# Criar uma nova imagem com os valores multiplicados
imagem_divisao_rvi_bandas <- setValues(area_banda3_vermelho, divisao_bandas_rvi_multiplicada)
# Plotar a imagem resultante
plot(imagem_divisao_rvi_bandas, col = gray.colors(256), main = "Indice de Vegetacao - RVI")Seguindo com os índices de vegetação, focaremos agora do NDVI. De acordo com nossa introdução, sabemos que a razão aqui é feita entre a diferença e a soma das bandas NIR e vermelha. Portanto, precisaremos realizar 3 cálculos concomitantemente: 1. Subtrair a banda vermelha da banda NIR; 2. Somar as bandas NIR e vermelha; 3. Dividir o resultado da subtração pelo resultado da soma. Vale destacar que estamos tratando de soma, subtração e divisão de matrizes, portanto, os inúmeros valores dos pixels serão calculados individualmente dentro da matriz. O código a seguir ilustra o processo para o cálculo do índice NDVI e a construção da imagem gerada.
# Calculando o NDVI
divisao_bandas_ndvi <- (valores_area_banda4_nir - valores_area_banda3_vermelho) / (valores_area_banda4_nir + valores_area_banda3_vermelho)
# Criando uma nova imagem com os valores do NDVI
imagem_divisao_bandas_ndvi <- setValues(area_banda3_vermelho, divisao_bandas_ndvi)
# Plotando a imagem resultante do NDVI
plot(imagem_divisao_bandas_ndvi, col = gray.colors(256), main = "Indice de Vegetacao - NDVI")Conforme observamos na introdução, o índice SAVI adequa-se melhor a regiões onde há baixa cobertura vegetal (presença natural de solos expostos). O que o diferencia substancialmente do NDVI é a presença de um fator de correção (L), que, conforme sugerido na introdução, varia entre 0,5 e 1,5. Aqui optaremos pelo valor de 0,5 como fator de correção. A seguir encontra-se o código para o cálculo do SAVI.
# Definir o fator de correção L
L <- 0.5
# Calculando o SAVI
divisao_bandas_savi <- ((valores_area_banda4_nir - valores_area_banda3_vermelho) / (valores_area_banda4_nir + valores_area_banda3_vermelho + L)) * (1 + L)
# Criando uma nova imagem com os valores do SAVI
imagem_divisao_bandas_savi <- setValues(area_banda3_vermelho, divisao_bandas_savi)
# Plotando a imagem resultante do SAVI
plot(imagem_divisao_bandas_savi, col = gray.colors(256), main = "Indice de Vegetacao - SAVI")O índice de água (WI) possui a mesma estrutura de cálculo do NDVI, entretanto, nele a banda vermelha é substituída pela banda verde. Assim, os conjuntos que utilizaremos aqui são:
area_pan <- raster(“area_banda0_pan.tif”)
area_banda1_azul <- raster(“area_banda1_blue.tif”)
area_banda2_verde <- raster(“area_banda2_green.tif”)
area_banda3_vermelho <- raster(“area_banda3_red.tif”)
area_banda4_nir <- raster(“area_banda4_nir.tif”)
valores_area_banda1_azul <- getValues(area_banda1_azul)
valores_area_banda2_verde <- getValues(area_banda2_verde)
valores_area_banda3_vermelho <- getValues(area_banda3_vermelho)
valores_area_banda4_nir <- getValues(area_banda4_nir)
O código a seguir ilustra o procedimento para o cálculo do WI e para a construção da nossa imagem.
# Calculando o WI
divisao_bandas_wi <- (valores_area_banda2_verde - valores_area_banda4_nir) / (valores_area_banda4_nir + valores_area_banda2_verde)
# Criando uma nova imagem com os valores do WI
imagem_divisao_bandas_wi <- raster(area_banda2_verde) # Usando a banda verde como modelo
values(imagem_divisao_bandas_wi) <- divisao_bandas_wi
# Plotando a imagem resultante do WI
plot(imagem_divisao_bandas_wi, col = gray.colors(256), main = "Indice de Vegetacao - WI")Com isso, encerramos nossa prática sobre aritmética de bandas. Nela vimos como realizar a soma, multiplicação, subtração e divisão de bandas. Tratamos ainda dos índices de vegetação RVI, NDVI, SAVI e AI, gerando diferentes imagens para cada um deles. Nos vemos em breve.
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
:::