Definindo NoData para um raster multibanda?

10

Eu tenho uma ortoimagem RGB com área preta em vez de NoData, como mostrado aqui: insira a descrição da imagem aqui

Quando uso a ferramenta SetNull, ela remove a área preta, mas a transforma em uma ortoimagem em escala de cinza, que não é o que eu quero.

insira a descrição da imagem aqui

Eu sei que existe uma maneira de contornar isso usando a ferramenta Clip (Data Management) para cortar a varredura para si mesma e lá você pode definir o valor NoData como o valor das células pretas (0). No entanto, estou criando um workshop para estudantes e gostaria de usar um método menos contra-intuitivo.

É claro que existe a opção de executar a ferramenta NoData em cada banda individualmente e depois combinar as três bandas, no entanto, preciso ter uma condição em que band1, band2 e band3 sejam iguais a 0 para definir isso como NoData. Ser capaz de fazer isso no ModelBuilder seria ideal, mas criar scripts usando o ArcPy também seria bom.

Estou usando o ArcGIS 10.2 Desktop com licença avançada.

Alex McVittie
fonte
Você diz que está usando o "ArcGIS 10.2 Pro", mas o aplicativo ArcGIS Pro foi lançado apenas com o ArcGIS 10.3 for Desktop. Você pode editar sua pergunta para esclarecer o que está usando, por favor?
PolyGeo
Me desculpe. Estou usando o ArcGIS 10.2 for Desktop com a licença Avançada.
Alex McVittie
Obrigado por fazer esta pergunta. Tenho clientes que sempre me procuram pensando que há algo errado com as imagens deles.
18715 Wes Wes

Respostas:

12

O que você deseja fazer é Definir propriedades de varredura em um script ou alterá-lo manualmente no ArcCatalog. Isso não criará uma nova varredura ou levará muito tempo.

Em python, é um pouco complicado:

import sys, os, arcpy

InFolder = sys.argv[1]
arcpy.env.workspace = InFolder

for Ras in arcpy.ListRasters():
    arcpy.AddMessage("Processing " + Ras)
    arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0")

Como o nodata está na lista, acho mais fácil especificar isso; os parâmetros são Band Value; Band Value; ... até que todas as bandas sejam endereçadas. Se você provavelmente tiver mais bandas (ou menos) na mesma pasta, precisará usar arcpy.Describe e a propriedade bandCount para definir o valor nulo para o número correto de bandas:

import sys, os, arcpy

InFolder = sys.argv[1]
arcpy.env.workspace = InFolder

for Ras in arcpy.ListRasters():
    arcpy.AddMessage("Processing " + Ras)
    desc = arcpy.Describe(Ras)
    if desc.bandCount == 3:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0")
    elif desc.bandCount == 4:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0;4 0")
    elif desc.bandCount == 1:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0")

No ArcCatalog, clique com o botão direito na camada e vá para Propriedades: insira a descrição da imagem aqui

clique no botão editar:

insira a descrição da imagem aqui

Digite os valores e pressione OK para descartar o editor NoData e OK para aplicar a alteração.

Agora a varredura não exibirá nada no ArcMap onde o valor da célula é 0,0,0.

Michael Stimson
fonte
3

Se você acessar as propriedades de varredura e se a simbologia estiver definida como composto RGB (o que parece ser), você poderá marcar a caixa Exibir valores de plano de fundo (RGB) e definir o que quiser como plano de fundo oco. Portanto, basta definir 0 0 0 como o valor de segundo plano e você deve estar no negócio.

mr.adam
fonte
2

Eu acho que a maneira mais fácil de conseguir isso seria criar uma raster de condição nula primeiro e depois usá-la para atribuir os valores NoData a cada banda separadamente.

Tente executar a função Con para criar a condição nula raster.

nullCondition = Con(((band1 == 0) & (band2 == 0) & (band3 == 0)), 1, 0)

Em seguida, use a varredura de condição nula para atribuir valores NoData a cada banda com a função Null definida . Você deve conseguir fazer isso com o construtor de modelos ou python.

Ben Gosack
fonte
2

Eu acredito que você pode usar diferentes procedimentos em árvore que os teóricos devem funcionar. Calculadora de varredura onde você pode usar esta expressão SETNULL([raster] == value, [raster]) Reclassificar onde você deve reclassificar apenas o valor que deseja. E usando o ArcPy, você pode usar este script que encontrei aqui https://gis.stackexchange.com/a/24578/47790

import arcpy
from arcpy import env
from arcpy.sa import *
env.workspace = "C:/sapyexamples/data"
outSetNull = SetNull("elevation", "elevation", "VALUE = 9999")
outSetNull.save("C:/sapyexamples/output/outsetnull")
Diogo Matos
fonte