Hangi raster düzleştirme / genelleme araçları mevcuttur?


46

Topografik aşırı uçları kaldırmak için pürüzsüzleştirmek veya genelleştirmek istediğim bir DEM'im var (dorukları kesmek ve vadileri doldurmak). İdeal olarak, yarıçap veya "bulanıklık" seviyesi üzerinde kontrol sahibi olmak isterim. Sonunda, biraz bulanıklaşmadan gerçekten bulanıklaşmaya kadar değişen bir raster grubuna ihtiyacım olacak. (Teorik olarak, en bulanık olan, tüm değerlerin aritmetik ortalamasının sabit bir taraması olacaktır).

Kullanabileceğim herhangi bir araç veya yöntem var mı (Esri, GDAL, GRASS'a dayanarak)? Evde kendi Gauss bulanıklık rutini pişirmem gerekiyor mu? Düşük geçişli bir filtre kullanabilir miyim (örneğin ArcGIS'in filtresi ) ve eğer öyleyse, büyük bir yarıçapın etkisini elde etmek için birkaç kez çalıştırmam gerekir mi?


Sadece rasteri daha büyük bir hücre boyutuna aktarmaya ne dersiniz? Bu aynı zamanda aşırı uçların kısılmasına neden olmaz mı?

1
Evet, bu aynı zamanda aşırılıkları da azaltacaktır (örtük yeniden örneklemenin bir miktar ortalama almayı içerdiğini varsayarsak), ancak bir DEM'i yumuşatmanın korkunç bir yolu : az sayıda büyük bloklar oluşturursunuz. Btw, genellikle bunu yapmak için bir raster vermek gerekmez; agregasyon hem de yeniden örnekleme farklı cellsize genellikle raster göre yazılımı bulunan temel işlemler vardır.
whuber

Yanıtlar:


29

Gauss bulanıklığı, sadece ağırlıklı bir odak noktasıdır. Kısa mesafeli dairesel komşuluk (ağırlıksız) araçlar dizisi ile yüksek hassasiyetle yeniden oluşturabilirsiniz: bu, Merkezi Limit Teoreminin bir uygulamasıdır .

Çok fazla seçeneğin var. "Filtre" çok sınırlı - sadece 3 x 3 mahalle için - bu yüzden onunla uğraşma. Büyük DEM'ler için en iyi seçenek, ArcGIS dışındaki hesaplamayı Hızlı Fourier Dönüşümleri kullanan bir ortama almaktır: aynı odak hesaplamaları yaparlar (karşılaştırmalı olarak) cayır cayır yanarlar. (GRASS bir FFT modülüne sahiptir . Görüntü işleme için tasarlanmıştır, ancak makul bir hassasiyetle 0,.255 aralığına yeniden ölçeklendirebilirseniz, DEM'iniz için hizmete girebilirsiniz.) Buna rağmen, en azından iki çözüm dikkate değer:

  1. Oldukça büyük bir mahalle için bir Gauss bulanıklığına yaklaşmak için bir mahalle ağırlıkları oluşturun. Hiç yumuşak DEM'ler dizinizi oluşturmak için bu bulanıklığın art arda geçişlerini kullanın.

    (Ağırlıklar exp (-d ^ 2 / (2r)) olarak hesaplanır, burada d mesafedir (eğer istersen hücrelerde) ve r etkili yarıçaptır (hücrelerde de). en az 3r'ye kadar, bunu yaptıktan sonra, her bir ağırlığı her birinin toplamına bölün ve sonunda 1'e toplayın.)

  2. Alternatif olarak, ağırlıkları unutun; sadece art arda dairesel bir fokal ortalama çalıştırın. Bunu, DEM'in kararıyla türetilmiş ızgaraların (eğim ve görünüş gibi) nasıl değiştiğini incelemek için tam olarak yaptım.

Her iki yöntem de çalışacaktır, ve ilk birkaç geçişten sonra ikisi arasında seçim için çok az olacaktır, ancak azalan döner vardır: etkin çapı n ardışık odak aracı (aynı mahalle boyutu kullanılarak) Sadece (yaklaşık) olduğu n çarpı karekökü fokal ortalamanın yarıçapı. Böylece, büyük miktarda bulanıklık için, büyük çaplı bir mahalleyle tekrar başlamak isteyeceksiniz. Ağırlıksız bir odak ortalama kullanıyorsanız, DEM üzerinden 5-6 geçişi yapın. Eğer yaklaşık Gauss ağırlıkları kullanıyorsanız, sadece bir sefer gerekir: fakat ağırlık matrisini oluşturmalısınız.

Bu yaklaşım aslında DEM'in aritmetik ortalamasını sınırlayıcı bir değer olarak değerlendiriyor.


1
Verilerinizde çiviler varsa, whuber tarafından önerilen daha genel bir bulanıklığı uygulamadan önce önce bir medyan filtresi ( en.wikipedia.org/wiki/Median_filter ) deneyebilirsiniz.
MerseyViking

@Mersey Bu mükemmel bir öneri. Yerel outliers ile bir DEM hiç görmedim, ancak o zaman yine ham bir DEM (ham LIDAR sonuçları gibi) işleme koymak zorunda kalmamıştım. FFT ile medyan filtreleri yapamazsınız, ancak yalnızca (genellikle) 3 x 3 mahalleye ihtiyacınız vardır, bu yüzden yine de hızlı bir işlemdir.
whuber

Teşekkürler whuber. Sadece önceden işlenmiş LiDAR verilerini kullandığımı itiraf etmeliyim, ancak SRTM verilerinde medyan bir filtreden yararlanabilecek bazı önemli artışlar var. Yine de 2 veya 3 örnek genişliğinde olma eğilimindedirler, bu nedenle daha geniş bir medyan filtresi gerekebilir.
MerseyViking

@Mersey 5 x 5 veya 7 x 7 daha büyük bir ortanca filtreyle hala iyisinizdir. (Örneğin) 101 x 101 filtreyi düşünürseniz, beklemeye hazır olun! Ayrıca, detaylandırmaya değer önemli bir noktaya değineceksiniz: Herhangi bir şey yapmadan önce DEM'in keşif analizini yapmak çok iyi bir fikir. Bu, sivri uçları (yerel aykırıklar) tanımlamayı ve boyutlarını ve uzantılarını karakterize etmeyi içerir. Bunları bir filtre ile silmeye başlamadan önce, gerçekten yapay (ve bazı gerçek fenomenler değil) olduklarından emin olmak istersiniz!
whuber

1
FFT için yükseklik verileri üzerindeki +1. Aslında bu işi iki yönlü şeritlemeyi gidermek için 32bit NED verisi için çimde yaptım. Sonunda, bu, aynı zamanda problemli bir durumdu çünkü başka birçok kontur-kaynaklı DEM'i rahatsız eden teraslama etkisini yeniden ortaya koydu.
Jay Guarneri

43

SciPy'nin signal.convolve yaklaşımını ( bu yemek kitabına dayanarak) araştırıyorum ve aşağıdaki kod parçasında çok iyi bir başarı elde ediyorum :

import numpy as np
from scipy.signal import fftconvolve

def gaussian_blur(in_array, size):
    # expand in_array to fit edge of kernel
    padded_array = np.pad(in_array, size, 'symmetric')
    # build kernel
    x, y = np.mgrid[-size:size + 1, -size:size + 1]
    g = np.exp(-(x**2 / float(size) + y**2 / float(size)))
    g = (g / g.sum()).astype(in_array.dtype)
    # do the Gaussian blur
    return fftconvolve(padded_array, g, mode='valid')

Bunu float32 GeoTIFF'leri GDAL üzerinden (görüntü işleme için 0-255 bayta çıkarmaya gerek kalmadan) okuyan / yazan başka bir işlevde kullanıyorum ve piksel boyutlarını denemek için kullanıyorum (örneğin, 2, 5, 20) ve gerçekten güzel çıktı (ArcGIS'te 1: 1 piksel ve sabit min / maksimum aralık ile görselleştirildi):

Gauss DTM'si

Not: Bu cevap çok daha hızlı bir FFT tabanlı signal.fftconvolve işleme fonksiyonunu kullanacak şekilde güncellendi .


1
+1 Güzel çözüm! Emin değilim, ancak signal.convolve FFT'leri kullanması iyi bir bahis.
whuber

Ben yazıyorum ve bunun üzerine tökezledi bir otomatik dikiş aracı için bazı bulanıklaştırma kodu arıyordum. @MikeToews adlı güzel iş!
Ragi Yaser Burhum,

@RagiYaserBurhum Aletiniz hakkında daha fazla şey duymak isterim. MikeToews Büyük cevap ve çok takdir edilen kod pasajı.
Jay Laura

@JayLaura Özel bir şey yok, sadece bir arkadaşımla bir balonla çektiğim bazı görüntüleri otomatik olarak dizmek için bir araç yazıyordum. Orfeo Toolbox sınıflarını kullanma orfeo-toolbox.org/SoftwareGuide/…
Ragi Yaser Burhum

2
@whuber bu rutini gözden geçirdikten sonra FFT kullanmıyordu, ama şimdi ve çok daha hızlı.
Mike T

4

Bu , çok uzun ve çok karmaşık olmasaydı, MikeT'nin mükemmel cevabına bir yorum olabilir . Onunla çok oynadım ve FFT Convolution Filters (henüz "deneysel" aşamada) adlı QGIS eklentisini işlevine göre yaptım . Pürüzsüzleştirmenin yanı sıra eklenti, pürüzsüzleştirilmiş rasterleri orijinal olandan çıkararak da kenarları keskinleştirir.

Bu süreçte Mike'ın işlevini biraz yükselttim:

def __gaussian_blur1d(self, in_array, size):
        #check validity
        try:
            if 0 in in_array.shape:
                raise Exception("Null array can't be processed!")
        except TypeError:
            raise Exception("Null array can't be processed!")
        # expand in_array to fit edge of kernel
        padded_array = np.pad(in_array, size, 'symmetric').astype(float)
        # build kernel
        x, y = np.mgrid[-size:size + 1, -size:size + 1]
        g = np.exp(-(x**2 / float(size) + y**2 / float(size)))
        g = (g / g.sum()).astype(float)
        # do the Gaussian blur
        out_array = fftconvolve(padded_array, g, mode='valid')
        return out_array.astype(in_array.dtype)

Geçerlilik kontrolleri oldukça açıktır, ancak önemli olan şey yüzmek ve geriye atmaktır. Bundan önce, işlev tam sayı dizileri siyah (yalnızca sıfır) değerlerini, ( g / g.sum()) değerlerinin toplamına bölünmesi nedeniyle ayırır .


3

QGIS'de Orfeo Toolbox Image filtrelemeyi kullanarak kolayca iyi sonuçlar elde ettim . Makul hızlı ve toplu mod iyi çalışıyor. Gauss, ortalama veya anizotropik difüzyonlar mevcuttur.

Not Radiushücrelerinin sayısını ifade eder, mesafe değildir.

Smoothing (gaussian) kullanarak bir örnek :

  • Çiğ, ham:

    Filtresiz

  • Filtrelenmiş:

    filtre


1

Gauss bulanıklığı ve harika animasyon için güzel bir çözüm. Yukarıda belirtilen Esri Filtre aracıyla ilgili olarak, temelde sadece 3x3 boyutunda kodlanmış Esri "Odak İstatistikleri" aracıdır. Odak İstatistikleri aracı, hareketli filtrenizin şekli, boyutu ve çalıştırmak istediğiniz istatistiklerle ilgili çok daha fazla seçenek sunar. http://desktop.arcgis.com/en/arcmap/latest/tools/spatial-analyst-toolbox/focal-statistics.htm

Ayrıca, her bir hücre için kullanılacak ağırlıklar ile kendi metin dosyanızda geçirdiğiniz bir "düzensiz" filtre de yapabilirsiniz. Metin dosyasında, filtre alanınızda istediğiniz kadar satır bulunur ve bu sütunlar için boşluklarla sınırlandırılmış değerler bulunur. Her zaman tek sayıda satır ve sütun kullanmalısınız, bu nedenle hedef hücreniz ortada.

Bu dosyaya kopyaladığım / yapıştırdığım farklı ağırlıklarla oynamak için bir excel tablosu oluşturdum. Formülleri ayarlarsanız yukarıdakilerle aynı sonuçları elde etmelidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.