Pular para o conteúdo principal

Questão de TI - Ciência de Dados e Inteligência Artificial — NumPy — CESPE / CEBRASPE 2025

TI - Ciência de Dados e Inteligência ArtificialNumPy
Código
ce417539
Banca
CESPE / CEBRASPE
Órgão
EMBRAPA
Ano
2025
Cargo
Pesq ( )
O NDVI (ou índice de vegetação por diferença normalizada) permite identificar a presença de vegetação verde e caracterizar sua distribuição espacial, como também sua evolução no decorrer do tempo. Para calcular o NDVI, a linguagem Python é amplamente utilizada, devido à sua flexibilidade e às bibliotecas de processamento de dados geoespaciais disponíveis. A seguir, é apresentado um código em Python relativo ao cálculo do NDVI.   import numpy as np import rasterio def calcular_ndvi(arquivo_nir, arquivo_red, saida_ndvi):        with rasterio.open(arquivo_nir) as nir_src:               nir = nir_src.read(1).astype('float32')               perfil = nir_src.profile        with rasterio.open(arquivo_red) as red_src:               red = red_src.read(1).astype('float32')        ndvi = (nir - red) / (nir + red + 1e-10)        perfil.update(dtype=rasterio.float32, count=1)        with rasterio.open(saida_ndvi, 'w', **perfil) as dst:            dst.write(ndvi, 1)        print(f"NDVI calculado e salvo em: {saida_ndvi}")   Com base no código precedente, julgue o item a seguir.   Ao salvar a imagem resultante, o código preserva automaticamente a escala original dos valores de NDVI, sem precisar de ajustes adicionais.
  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoE — Errado

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

NDVI e a preservação da escala original dos valores

Gabarito: ERRADO. O código calcula o NDVI com a fórmula (nir - red) / (nir + red + 1e-10), que produz valores em ponto flutuante (float32) tipicamente no intervalo [-1, 1]. Ao salvar a imagem com perfil.update(dtype=rasterio.float32, count=1), o código não preserva automaticamente a escala original dos valores de NDVI — ele apenas define o tipo de dado como float32, sem aplicar nenhum fator de escala ou transformação que mantenha a faixa original de valores. A afirmação está incorreta porque a escala original (que seria, por exemplo, a faixa de valores inteiros de 0 a 255 ou outra escala específica dos dados de entrada) não é mantida automaticamente; o NDVI é um índice normalizado que, por definição, resulta em valores entre -1 e 1, independentemente da escala dos dados de entrada.

O NDVI (Normalized Difference Vegetation Index) é um índice espectral amplamente utilizado em sensoriamento remoto para avaliar a presença e a vigorosidade da vegetação. Ele é calculado a partir da reflectância nas bandas do infravermelho próximo (NIR) e do vermelho (RED), seguindo a fórmula:

NDVI=NIRREDNIR+REDNDVI = \frac{NIR - RED}{NIR + RED}

O resultado é um valor adimensional que varia, teoricamente, entre -1 e 1. Valores próximos de 1 indicam vegetação densa e saudável, valores próximos de 0 indicam solo exposto ou vegetação esparsa, e valores negativos indicam água, nuvens ou superfícies não vegetadas. Essa normalização é justamente o que torna o NDVI um índice comparável entre diferentes imagens e datas, pois elimina a influência da escala radiométrica original dos dados.

No código apresentado, os dados de entrada são lidos com .astype('float32'), convertendo os valores originais (que poderiam ser inteiros de 0 a 255, ou 0 a 65535, dependendo da resolução radiométrica) para ponto flutuante. A operação (nir - red) / (nir + red + 1e-10) é uma operação vetorizada do NumPy que produz um array de float32 com valores no intervalo [-1, 1]. O termo 1e-10 é adicionado ao denominador para evitar divisão por zero, um detalhe técnico importante.

Ao salvar a imagem resultante, o código atualiza o perfil com dtype=rasterio.float32 e count=1, mas não aplica nenhum fator de escala (scale) ou offset. Isso significa que os valores de NDVI são gravados diretamente como float32, sem qualquer transformação que os converta para uma escala inteira (como 0-255) ou que preserve a escala original dos dados de entrada. A escala original dos dados de entrada (por exemplo, 0-255 para imagens de 8 bits) é perdida no momento em que os dados são convertidos para float32 e normalizados pela fórmula do NDVI.

A afirmação do enunciado sugere que o código "preserva automaticamente a escala original dos valores de NDVI". Isso é incorreto por dois motivos: primeiro, o NDVI é um índice normalizado que, por definição, não mantém a escala original dos dados de entrada — ele a transforma para o intervalo [-1, 1]. Segundo, o código não aplica nenhum ajuste adicional (como multiplicar por 100 e somar 100 para obter valores de 0 a 200, ou aplicar um fator de escala para armazenar como inteiro) que poderia "preservar" ou "recuperar" uma escala específica. O código simplesmente salva os valores float32 resultantes, que já estão na escala normalizada do NDVI.

A pegadinha aqui é que o candidato pode confundir "preservar a escala original" com "salvar os valores corretamente". O código salva os valores corretamente, mas não preserva a escala original — ele a transforma. A escala original dos dados de entrada (por exemplo, 0-255) não é mantida; o que é mantido é a faixa normalizada do NDVI, que é uma consequência da fórmula, não uma preservação automática.

Critério

NDVI (código apresentado)

Escala original dos dados de entrada

Faixa de valores resultante

Normalizada, entre -1 e 1 (float32)

Depende da resolução radiométrica (ex.: 0–255 para 8 bits, 0–65535 para 16 bits)

Preservação automática da escala

Não preserva — a fórmula normaliza os valores

Seria mantida apenas se não houvesse transformação

Ajuste necessário para manter escala

Nenhum aplicado no código (apenas dtype=float32)

Exigiria fator de escala/offset (ex.: (ndvi + 1) * 127.5)

Tipo de dado salvo

Float32, sem escala ou offset

Inteiro ou float, conforme o formato original

Alternativa E — ❌ Incorreta (esta é a resposta pedida)

A afirmação está errada porque o código não preserva automaticamente a escala original dos valores de NDVI. O NDVI é um índice normalizado que produz valores entre -1 e 1, independentemente da escala dos dados de entrada. O código converte os dados para float32 e aplica a fórmula, resultando em valores normalizados. Ao salvar, ele apenas define o dtype como float32, sem aplicar nenhum fator de escala ou offset que pudesse "preservar" a escala original. A escala original dos dados de entrada (por exemplo, 0-255) é perdida no processo de normalização. Para preservar uma escala específica, seria necessário aplicar um ajuste adicional, como multiplicar por 100 e somar 100 para obter valores de 0 a 200, ou usar um fator de escala ao salvar. O código não faz isso, portanto a afirmação é incorreta.

NÃO CAIA NESSA!

A banca tenta confundir o candidato ao sugerir que "preservar a escala original" é algo automático. Na verdade, o NDVI é um índice normalizado que transforma a escala original dos dados de entrada para o intervalo [-1, 1]. O código salva os valores float32 resultantes, mas não aplica nenhum ajuste para preservar a escala original. O candidato pode cair ao pensar que "salvar corretamente" é o mesmo que "preservar a escala original", mas são coisas diferentes.

PEGA ESSA DICA!

Para questões sobre NDVI, lembre-se sempre da fórmula e do intervalo de resultados. O NDVI é um índice normalizado, então a escala original dos dados de entrada é sempre transformada. Se a questão perguntar sobre "preservar a escala", desconfie: o NDVI não preserva escala, ele a normaliza. Para armazenar o NDVI em uma escala inteira (como 0-255), seria necessário aplicar um fator de escala e offset, como ndvi_escalado = (ndvi + 1) * 127.5.

Gabarito: letra E

Link permanente: /questoes/ce417539