어떤 래스터 스무딩 / 일반화 도구를 사용할 수 있습니까?


46

지형 극단을 제거하기 위해 부드럽게하거나 일반화하려는 DEM이 있습니다 (피크와 필인 밸리를 잘라냅니다). 이상적으로는 "흐림"의 반경 또는 레벨을 제어하고 싶습니다. 결국, 나는 약간 흐릿한 것에서부터 정말로 흐릿한 것까지의 범위의 래스터 세트가 필요합니다. 이론적으로 모호한 값은 모든 값의 산술 평균에 대한 일정한 래스터입니다.

사용할 수있는 도구 나 방법이 있습니까 (Esri, GDAL, GRASS 기반)? 가우시안 블러 루틴 을 집에서 구워야 합니까? 저역 통과 필터 (예 : ArcGIS의 필터 )를 사용할 수 있습니까? 그렇다면 반지름이 큰 효과를 얻으려면 여러 번 실행해야합니까?


래스터를 더 큰 셀 크기로 내보내는 것은 어떻습니까? 이것이 또한 극한의 뮤팅을 초래하지 않습니까?

1
그렇습니다. 내재 리샘플링에 어떤 형태의 평균화가 있다고 가정하면 극단을 줄일 수 있지만 DEM 을 부드럽게 하는 끔찍한 방법 입니다. 작은 수의 큰 블록을 만들 것입니다. BTW, 일반적으로 래스터를 내보낼 필요가 없습니다. 다른 셀 라이즈 로의 리샘플링집계 는 일반적으로 래스터 기반 소프트웨어에서 발견되는 기본 작업입니다.
whuber

답변:


29

가우시안 블러는 단지 가중 초점입니다. 근거리 원근법 시퀀스 (비가 중)를 사용하여 높은 정확도로 재현 할 수 있습니다. 이것은 중심 한계 정리의 적용 입니다.

많은 선택이 있습니다. "필터"는 너무 제한적이며 3 x 3 이웃에만 해당되므로 귀찮게하지 마십시오. 대규모 DEM에 가장 적합한 옵션은 ArcGIS 외부에서 Fast Fourier Transforms를 사용하는 환경으로 계산하는 것입니다. 동일한 초점 계산을 수행하지만 비교하면 엄청나게 빠릅니다. (GRASS에는 FFT 모듈이 있습니다. 이미지 처리 용이지만 0..255 범위로 합리적인 정밀도로 크기를 조정할 수 있으면 DEM을 위해 서비스를 제공 할 수 있습니다.) 적어도 두 가지 해결책 은 고려할 가치가있는 :

  1. 크기 조정이 가능한 이웃에 대한 가우시안 블러를 근사화하기 위해 이웃 가중치 세트를 만듭니다. 이 블러를 연속적으로 사용하여 더욱 부드러운 DEM 시퀀스를 만듭니다.

    (가중은 exp (-d ^ 2 / (2r)로 계산됩니다. 여기서 d 는 거리 (원하는 경우 셀))이고 r 은 유효 반경 (셀))입니다. 원 내에서 계산되어야합니다. 적어도 밖으로 3R 이렇게하면되므로 단부 모두 합계하여 각각의 중량을 나눈다. 이들은 1로 합산)

  2. 또는 가중치를 잊어 버리십시오. 원형 초점 평균을 반복적으로 실행하십시오. DEM의 해상도에 따라 파생 그리드 (예 : 경사 및 종횡비)가 어떻게 변하는 지 연구하기 위해 정확히이 작업을 수행했습니다.

두 방법 모두 잘 작동하고 처음 몇 번의 통과 후에는 두 가지 중에서 선택할 수있는 것이 거의 없지만, 수익이 감소합니다. n 개의 연속 초점 수단 의 유효 반경 (모두 동일한 이웃 크기를 사용)은 (대략) n의 제곱근에 초점 평균의 반경을 곱한 값. 따라서 많은 양의 블러 링을 원한다면 큰 반경 근처에서 다시 시작하고 싶을 것입니다. 비가 중 초점 평균을 사용하는 경우 DEM에 대해 5-6 회 통과를 실행하십시오. 대략 가우스 가중치를 사용하는 경우 한 번만 패스하면되지만 가중치 행렬을 만들어야합니다.

이 접근법은 실제로 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을 괴롭히는 터 레이싱 효과를 다시 도입했기 때문에 문제가되었습니다.
Jay Guarneri

42

나는 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 바이트로 크기를 조정할 필요가 없음) 픽셀 크기 시도 (예 : 2, 5, 20)를 사용하고 있습니다. 정말 좋은 출력 (1 : 1 픽셀과 일정한 최소 / 최대 범위로 ArcGIS에서 시각화) :

가우스 DTM

참고 :이 답변은 훨씬 빠른 FFT 기반 signal.fftconvolve 처리 기능 을 사용하도록 업데이트되었습니다 .


1
+1 멋진 솔루션! 확실하지는 않지만 신호가 좋은 것은 내기입니다 .convolve는 FFT를 사용합니다.
whuber

필자가 작성하고 걸려 넘어지는 자동 스티칭 도구에 대한 희미한 코드를 찾고있었습니다. 좋은 직업 @MikeToews!
Ragi Yaser Burhum

@RagiYaserBurhum 도구에 대한 자세한 내용을 듣고 싶습니다. MikeToews 훌륭한 답변과 매우 고마운 코드 스 니펫.
Jay Laura

@JayLaura 특별한 것은 없습니다. 풍선으로 친구와 함께 찍은 일부 이미지를 자동 스티치하는 도구를 작성하는 것뿐입니다. Orfeo Toolbox 클래스 사용 orfeo-toolbox.org/SoftwareGuide/…
Ragi Yaser Burhum

2
@whuber이 루틴을 수정하면 FFT를 사용하지 않았지만 지금은 훨씬 빠릅니다.
Mike T

4

너무 길지 않고 너무 복잡하지 않은 경우 MikeT의 훌륭한 답변에 대한 의견이 될 수 있습니다 . 나는 그것을 많이 가지고 놀았고 그의 기능에 따라 FFT 컨볼 루션 필터 ( "실험 단계") 라는 QGIS 플러그인을 만들었습니다 . 스무딩 외에도 플러그인은 원래 래스터에서 스무딩 래스터를 빼서 가장자리를 선명하게 할 수 있습니다.

프로세스에서 Mike의 기능을 약간 업그레이드했습니다.

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())으로 나누기 때문에 정수 배열을 검은 색 (0 만)으로 만들었습니다 .


3

QGIS에서는 Orfeo Toolbox Image 필터링 을 사용하여 쉽게 좋은 결과를 얻었습니다 . 합리적인 속도이며 배치 모드가 정상적으로 작동합니다. 가우스, 평균 또는 이방성 확산이 가능합니다.

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.