Questão de TI - Ciência de Dados e Inteligência Artificial — NumPy — CESPE / CEBRASPE 2025
- Código
- ce417539
- Banca
- CESPE / CEBRASPE
- Órgão
- EMBRAPA
- Ano
- 2025
- Cargo
- Pesq ( )
- CCerto
- EErrado
GabaritoE — Errado
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:
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 | Exigiria fator de escala/offset (ex.: |
Tipo de dado salvo | Float32, sem escala ou offset | Inteiro ou float, conforme o formato original |
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.
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.
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