Os pixels à esquerda representam os locais das árvores e seus raios de coroa associados (ou seja, valores de pixels que variam de 2 a 5). Gostaria de armazenar em buffer esses pixels de varredura pelo valor do raio da coroa. A imagem à direita é o que espero obter usando apenas métodos de processamento de varredura .
Inicialmente, eu pensaria em usar uma soma focal circular no ArcGIS, embora a configuração da vizinhança seja um valor fixo, o que não levaria em consideração o raio da coroa de tamanho variável.
Qual é um bom método para "buffer" de pixels por seus valores?
Respostas:
Aqui está uma solução pura de varredura no
Python 2.7
usonumpy
escipy
:Entrada:
Saída:
fonte
Abordagem baseada em vetor
Esta tarefa pode ser realizada em três etapas:
Raster To Point
;Buffer
(usando oVALUE
campo como campo de buffer );Feature To Raster
.Nota: o uso do campo buffer evita o cálculo de um buffer para cada valor do raio da coroa.
Abordagem baseada em varredura
Evitando a solução baseada em vetores, esse problema sugere o uso de um tipo de autômato celular baseado nos vizinhos mais próximos. Supondo que todos os pixels pretos sejam zeros, os pixels são quadrados e seu tamanho é igual a 1 (ou, como alternativa, são dimensionados oportunamente), as regras a serem adotadas são muito simples:
VALUE
) for maior que 1, seu valor se tornaráVALUE-1
e, em seguida, considere os pixels adjacentes. Se seus valores forem menores queVALUE-1
, esses pixels nascem ou crescem e seu valor se tornaVALUE-1
. Caso contrário, esses pixels sobreviverão e permanecerão inalterados.VALUE<=1
não fizer nada (o pixel está morto!).Essas regras devem ser aplicadas até que todos os pixels estejam mortos, ou seja, seus valores são iguais a 0 ou 1. Então
N-1
, vezes, ondeN
é o valor máximo que você tem na varredura de entrada. Essa abordagem pode ser facilmente implementada com um pouco de Python e numpy.fonte
Outra opção seria criar separadores separados para cada valor de pixel, neste caso 4 separadores, com uma condição. Em seguida, expanda os rasters por uma contagem de pixels correspondente ao valor da varredura (possivelmente repetindo uma lista de valores). Por fim, junte os rasters (algébricos ou espaciais), para criar uma varredura binária para as copas das árvores.
fonte
É uma pergunta desafiadora fazer isso em varredura, porque você não tem a oportunidade de usar o valor do pixel para definir o tamanho do buffer. Portanto, você precisaria fazer o filtro focal para cada valor, como você já disse.
Aqui está uma resposta possível para fazer isso com apenas 3 filtros (não consegui encontrar menos), mas não perfeitamente como mencionado por Whuber: seus buffers serão truncados quando as árvores estiverem próximas umas das outras.
1) EDIT: Alocação euclidiana (isso não resolve completamente o problema, pois corta os buffers nas proximidades de árvores menores, mas é melhor que os artefatos da minha primeira solução).
2) distância euclidiana em torno de cada pixel
3) calculadora raster (álgebra de mapa) com uma declaração condicional
Observe que você pode ajustar a condição dependendo das suas necessidades em termos de raio (com ou sem o pixel central)
fonte
Pergunto por que você não usa a ferramenta de expansão do ArcGIS ?
Em caso de sobreposição: o último
expand
comando cobrirá os anteriores.fonte
Se você tiver a posição do pixel, o raio e o algoritmo do círculo do ponto médio (uma variante do algoritmo Bresenham) fornecem uma pista. Na IMO, é fácil criar um polígono a partir dessa abordagem e acho fácil implementá-lo no Python. A união desse conjunto de polígonos fornece a área de cobertura.
fonte