どのラスタースムージング/一般化ツールが利用可能ですか?


46

地形の極値(ピークとフィルインバレーを切り取る)を除去するために、平滑化または一般化するDEMがあります。理想的には、「ブラー」の半径またはレベルを制御したいと思います。最後に、少しぼやけたものから本当にぼやけたものまでの一連のラスタが必要になります。(理論的には、最もぼやけているのは、すべての値の算術平均の一定のラスターです)。

使用できるツールまたは方法はありますか(Esri、GDAL、GRASSに基づく)?独自のガウスぼかしルーチンを自宅で焼く必要がありますか?ローパスフィルター(ArcGISのフィルターなど)を使用できますか?使用する場合、大きな半径の効果を得るために何回も実行する必要がありますか?


ラスターをより大きなセルサイズにエクスポートするのはどうですか?これはまた、極端なミュートになりませんか?

1
はい、それはまた極端を減らします(暗黙のリサンプリングが何らかの平均化を伴うと仮定して)が、DEM を滑らかにするひどい方法です:少数の大きなブロックを作成します。ところで、通常これを行うためにラスターをエクスポートする必要はありません。集約と異なるセルサイズへのリサンプリングは、通常、ラスターベースのソフトウェアで見られる基本的な操作です。
whuber

回答:


29

ガウスぼかしは、加重焦点平均です。一連の短距離円形近傍(重みなし)を使用して、高精度に再作成できます。これは、中央極限定理の適用です。

選択肢はたくさんあります。「フィルター」は非常に限定的であり、3 x 3の近隣地域に限定されているため、気にしないでください。大規模なDEMの最適なオプションは、ArcGISの外部の計算を高速フーリエ変換を使用する環境に取り込むことです。それらは同じ焦点計算を行いますが、(比較して)驚くほど高速です。(GRASSが持つFFTモジュールを。これは、画像処理のために意図されていますが、あなたは0〜255の範囲に合理的な精度でそれを再スケールすることができた場合、あなたのDEMのためのサービスにそれを押すことができるかもしれない。)それがなければ、2つの解決策は、少なくともあります検討する価値があります:

  1. 近傍の重みのセットを作成して、かなりの近傍のガウスぼかしを近似します。このブラーの連続パスを使用して、より滑らかなDEMのシーケンスを作成します。

    (重みはexp(-d ^ 2 /(2r))として計算されます。dは距離(必要に応じてセル単位)、rは有効半径(セル単位)です。これらは円の範囲内で計算する必要があります少なくとも3rまで出力します。そうしたら、各重みをそれらの合計で除算し、最後に合計が1になるようにします。

  2. または、重み付けを忘れます。円形の焦点平均を繰り返し実行するだけです。これは、DEMの解像度によって派生したグリッド(勾配やアスペクトなど)がどのように変化するかを調べるために、まさにこれを行いました。

両方の方法はうまく機能し、最初の数回のパスの後、2つを選択することはほとんどありませんが、減少するリターンがあります:n連続する焦点手段の有効半径(すべて同じ近隣サイズを使用)は(およそ)焦点平均の半径のn倍の平方根。したがって、大量のぼかしの場合は、大きな半径の近傍からやり直す必要があります。非加重フォーカル平均を使用する場合は、DEMを5〜6パス実行します。ほぼガウスの重みを使用する場合、必要なパスは1つだけですが、重み行列を作成する必要があります。

実際、このアプローチには、制限値としてDEMの算術平均があります。


1
データにスパイクがある場合は、whuberが提案するより一般的なぼかしを適用する前に、メディアンフィルター(en.wikipedia.org/wiki/Median_filter)を最初に試すことができます。
MerseyViking

@Merseyそれは素晴らしい提案です。ローカルの外れ値を持つDEMを見たことはありませんが、生のDEM(生のLIDAR結果など)を処理する必要もありませんでした。FFTでメディアンフィルターを実行することはできませんが、(通常)必要なのは3 x 3の近傍のみであるため、とにかく高速な操作です。
whuber

ありがとうwhuber。前処理したLiDARデータのみを使用したことがあることを認めなければなりませんが、SRTMデータには、中央値フィルターの恩恵を受ける重要なスパイクがいくつかあります。ただし、それらは2または3サンプル幅になる傾向があるため、より大きな中央値フィルターが必要になります。
MerseyViking

@Mersey 5 x 5または7 x 7の大きなメジアンフィルターを使用しても大丈夫です。ただし、101 x 101フィルターを検討している場合は、待つ準備をしてください。また、説明する価値のある重要なポイントを提案します。何かを行う前に、DEMの探索的分析を実行することは非常に良い考えです。これには、スパイク(ローカルの外れ値)の識別と、サイズと範囲の特性評価が含まれます。フィルタを使用してそれらを完全に消去する前に、それらが実際にアーティファクトであることを確認します(実際の現象ではありません)。
whuber

1
標高データのFFTに対して+1。私は実際に、双方向ストライピングを削除するために、32ビットNEDデータの草でそれを動作させました。結局、これは、他の多くの輪郭から派生したDEMを悩ますテラス効果を再導入したため、問題もありました。
ジェイ・グァルネリ

43

私はSciPyのsignal.convolveアプローチ(このクックブックに基づく)を調査してきましたが、次のスニペットで本当に素晴らしい成功を収めています:

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')

私はこれをGDAL経由でfloat32 GeoTIFFを読み書きする別の関数で使用します(画像処理のために0-255バイトに再スケーリングする必要はありません)本当に素晴らしい出力(1:1ピクセルと一定の最小/最大範囲でArcGISで視覚化):

ガウスDTM

注:この回答は、FFTベースのはるかに高速なsignal.fftconvolve処理関数を使用するように更新されました。


1
+1素敵なソリューション!確かなことはわかりませんが、signal.convolveがFFTを使用していることは間違いありません。
whuber

私が書いている自動ステッチングツールのぼやけたコードを探していて、これにつまずいた。@MikeToewsよろしくお願いします!
ラギヤセルバーフム

@RagiYaserBurhumあなたのツールについてもっと知りたいです。MikeToewsすばらしい回答と、大歓迎のコードスニペット。
ジェイローラ

@JayLaura特別なことは何もありません。友達と一緒に撮った画像をバルーンで自動ステッチするツールを書くだけです。オルフェオツールボックスクラスを使用して orfeo-toolbox.org/SoftwareGuide/...
Ragi Yaser Burhum

2
@whuberは、このルーチンを改訂すると、FFTを使用していませんでしたが、現在はFFTを使用しており、非常に高速です。
マイクT

4

これは、長すぎず、複雑すぎない場合、MikeTの優れた答えに対するコメントかもしれません。私はそれをたくさん使って、彼の機能に基づいて、FFT Convolution Filtersという名前のQGISプラグインを作成しました(「実験」段階)。プラグインは、スムージングに加えて、元のラスタからスムージングされたラスタを差し引くことでエッジをシャープにすることもできます。

その過程でマイクの機能を少しアップグレードしました。

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)

妥当性チェックは非常に自明ですが、重要なのはフロートにキャストすることです。この前に、関数は値の合計(g / g.sum())で除算するため、整数配列を黒(ゼロのみ)にしました。


3

QGISでは、Orfeo Toolboxの画像フィルタリングを使用することで簡単に良い結果が得られました。妥当な速度であり、バッチモードは正常に機能します。ガウス、平均、または異方性拡散が利用可能です。

Radiusは距離ではなくセルの数を指すことに注意してください。

以下は、Smoothing(gaussian)を使用した例です。

  • 生:

    フィルターなし

  • フィルター済み:

    フィルタ


1

ガウスぼかしとクールなアニメーションのための素晴らしいソリューション。上記のEsri Filterツールに関して、それは基本的に3x3サイズにハードコードされたEsriの「焦点統計」ツールです。Focal Statisticsツールを使用すると、移動するフィルターの形状、サイズ、および実行する統計に関するオプションがはるかに多くなります。 http://desktop.arcgis.com/en/arcmap/latest/tools/spatial-analyst-toolbox/focal-statistics.htm

また、各セルに使用する重み付きの独自のテキストファイルを渡す「不規則な」フィルターを作成することもできます。テキストファイルには、フィルター領域に必要な数の行があり、列には空白で区切られた値があります。常に奇数の行と列を使用する必要があるため、ターゲットセルは中央にあります。

このファイルにコピー/貼り付けするだけのさまざまな重みで再生するために、Excelスプレッドシートを作成しました。数式を調整すると、上記と同じ結果が得られます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.