Reduzir a extensão do processamento de varredura no ArcPy ou ArcGIS Desktop?

8

Preciso reduzir a extensão do processamento da minha varredura por algum tipo de procedimento automático em python. Atualmente, as bordas do conjunto de dados que tenho usado têm anomalias (devido à classificação das linhas de varredura do landsat).

ScanLines Classified

Gostaria de reduzir a extensão do processamento de varredura para que, quando recupero as informações acima por uma função SetNull, as bordas não sejam processadas. Algo como Área

Agora, isso pode ser feito facilmente com uma função de extração por máscara (por exemplo, figura 2), embora isso exija a seleção manual da região de máscara. Existe um método que eu possa utilizar para calcular a região de extensão (ignorando os valores nodata) menos a largura da borda nas direções xey de cada linha / coluna e, em seguida, utilizar o arcpy.env.extentem Python?

BJEBN
fonte
Você poderia apenas obter a extensão de toda a varredura e subtrair uma distância padrão de cada lado? Ou isso é muito simplista?
Radar
Isso iria trabalhar assumindo que a extensão é derivada dessas áreas com valores, em vez de toda a área (isto é, valores NODATA)
BJEBN
1
Estou com um pouco de dificuldade para entender o que constitui uma "fronteira". Deseja detectar automaticamente as anomalias de digitalização e depois cortá-las? Nesse caso, você está procurando um método que permita detectar essas anomalias?
Radar
A borda é a área da varredura que contém valores - talvez a segunda imagem acima seja um pouco confusa, pois agora vejo que eles são valores externos (deve ter uma camada extra ativa quando agarrei a tela). A área sólida acima, é a fronteira quadriculação - o quadrado vermelho é o grau desejado de varredura, enquanto a extensão actual quadriculação é toda a imagem (incluindo os valores de * NODATA brancas)
BJEBN

Respostas:

9

Esse fluxo de trabalho lida primeiro com o lixo flutuando pelas bordas e depois resolve o problema.

  1. Crie um indicador binário da área "borda", que tomo para incluir todas as células NoData ao redor. É conveniente usar qualquer valor para indicar a borda e o NoData para o restante, como em SetNull(Not(IsNull('X')), 1):

    Fronteira

  2. Agrupe o resultado na região e selecione o componente de borda. (Geralmente, isso pode ser automatizado, selecione o componente com o maior valor de [Count].) A imagem terá a mesma aparência; apenas alguns pixels dispersos no centro são excluídos aqui - mas devem ser excluídos para a próxima etapa funcionar.

    (Uma abordagem alternativa é usar operações morfológicas primeiro para reduzir a borda e depois expandi-la novamente: isso apaga os bits isolados no meio.)

  3. Calcule a grade de distância euclidiana para o componente de borda.

    Distâncias

  4. Mascarar todas as pequenas distâncias na imagem original, como em SetNull(([Distance to Border component] < 30),X ):

    Resultado

(A imagem final mostra a borda original em verde sobreposta, para referência, no resultado.)

whuber
fonte