Eu tenho um DEM que gostaria de suavizar ou generalizar para remover extremos topográficos (cortar picos e vales de preenchimento). Idealmente, eu também gostaria de ter controle sobre o raio ou o nível de "embaçamento". No final, precisarei de um conjunto de rasters que variam de levemente desfocado a realmente desfocado. (Teoricamente, o desfoque seria uma varredura constante da média aritmética de todos os valores).
Existem ferramentas ou métodos que posso usar (com base em Esri, GDAL, GRASS)? Preciso fazer em casa minha própria rotina de desfoque gaussiano ? Eu poderia usar um filtro passa-baixo (por exemplo, filtro do ArcGIS ) e, se sim, precisaria executá-lo várias vezes para obter o efeito de um raio grande?
raster
tools
generalization
smoothing
Mike T
fonte
fonte
Respostas:
O desfoque gaussiano é apenas uma média focal ponderada. Você pode recriá-lo com alta precisão com uma sequência de meios circulares de vizinhança de curta distância (sem peso): esta é uma aplicação do Teorema do Limite Central .
Você tem muitas opções. O "filtro" é muito limitado - é apenas para bairros 3 x 3 - por isso não se preocupe. A melhor opção para os grandes DEMs é levar o cálculo para fora do ArcGIS para um ambiente que use as transformações rápidas de Fourier: eles fazem os mesmos cálculos focais, mas (em comparação) eles fazem isso de uma maneira incrivelmente rápida. (O GRASS possui um módulo FFT . Destina-se ao processamento de imagens, mas você pode colocá-lo em serviço no seu DEM se for possível redimensioná-lo com razoável precisão na faixa de 0..255.) Exceto isso, pelo menos duas soluções Vale a pena considerar:
Crie um conjunto de pesos de vizinhança para aproximar um desfoque gaussiano de uma vizinhança considerável. Use passes sucessivos desse desfoque para criar sua sequência de DEMs cada vez mais suaves.
(Os pesos são calculados como exp (-d ^ 2 / (2r)) onde d é a distância (nas células, se desejar) e r é o raio efetivo (também nas células). Eles devem ser calculados dentro de um círculo que se estende até pelo menos 3. Depois de fazer isso, divida cada peso pela soma de todos, de modo que no final eles somam 1.)
Como alternativa, esqueça a ponderação; basta executar uma média focal circular repetidamente. Fiz exatamente isso estudando como as grades derivadas (como inclinação e aspecto) mudam com a resolução de um DEM.
Ambos os métodos funcionarão bem e, após os primeiros passes, haverá pouco a escolher entre os dois, mas há retornos decrescentes: o raio efetivo de n meios focais sucessivos (todos usando o mesmo tamanho de vizinhança) é apenas (aproximadamente) o raiz quadrada de n vezes o raio da média focal. Assim, para grandes quantidades de desfoque, você desejará começar de novo com uma vizinhança de grande raio. Se você usar uma média focal não ponderada, execute 5-6 passagens sobre o DEM. Se você usar pesos aproximadamente gaussianos, precisará de apenas uma passagem: mas precisará criar a matriz de pesos.
Essa abordagem realmente tem a média aritmética do DEM como um valor limitador.
fonte
Eu estive explorando a abordagem signal.convolve do SciPy (com base neste livro de receitas ) e estou obtendo um sucesso muito bom com o seguinte trecho:
Eu uso isso em outra função que lê / grava GeoTIFFs float32 via GDAL (não é necessário redimensionar para 0-255 bytes para processamento de imagem), e eu tenho tentado tamanhos de pixel (por exemplo, 2, 5, 20) e ele tem saída realmente agradável (visualizada no ArcGIS com 1: 1 pixel e alcance mínimo / máximo constante):
Nota: esta resposta foi atualizada para usar uma função de processamento signal.fftconvolve baseada em FFT muito mais rápida .
fonte
Isso poderia ser um comentário à excelente resposta de MikeT , se não fosse muito longa e muito complexa. Eu brinquei muito com ele e criei um plugin QGIS chamado FFT Convolution Filters (no estágio "experimental" ainda) com base em sua função. Além de suavizar, o plugin também pode afiar as bordas subtraindo a varredura suavizada da original.
Atualizei a função de Mike um pouco no processo:
As verificações de validade são bastante evidentes, mas o importante é lançar para flutuar e voltar. Antes disso, a função tornava as matrizes inteiras pretas (somente zeros), devido à divisão pela soma dos valores (
g / g.sum()
).fonte
No QGIS, obtive bons resultados com facilidade usando o filtro de imagem do Orfeo Toolbox . É rápido e o modo em lote é razoável. Difusões gaussianas, médias ou anisotrópicas estão disponíveis.
Observe que
Radius
se refere ao número de células, não à distância.Aqui está um exemplo usando Suavização (gaussiana) :
Cru:
Filtrado:
fonte
Ótima solução para o borrão gaussiano e animação interessante. Com relação à ferramenta Esri Filter mencionada acima, essa é basicamente a ferramenta Esri "Estatísticas Focais" codificada para um tamanho 3x3. A ferramenta Estatísticas focais oferece muito mais opções sobre a forma do filtro em movimento, o tamanho e a estatística que você deseja executar. http://desktop.arcgis.com/en/arcmap/latest/tools/spatial-analyst-toolbox/focal-statistics.htm
Você também pode criar um filtro "irregular" onde passa seu próprio arquivo de texto com pesos para usar em cada célula. O arquivo de texto possui quantas linhas você deseja na sua área de filtro, com valores delimitados por espaço em branco para as colunas. Eu acho que você deve sempre usar um número ímpar de linhas e colunas, para que sua célula de destino esteja no meio.
Criei uma planilha do Excel para jogar com pesos diferentes que acabei de copiar / colar neste arquivo. Deverá alcançar os mesmos resultados acima, se você ajustar as fórmulas.
fonte