Những công cụ làm mịn / khái quát hóa raster có sẵn?


46

Tôi có một DEM mà tôi muốn làm mịn hoặc khái quát hóa để loại bỏ các cực trị địa hình (cắt bỏ các đỉnh và thung lũng lấp đầy). Lý tưởng nhất, tôi cũng muốn có quyền kiểm soát bán kính hoặc mức độ "mờ". Cuối cùng, tôi sẽ cần một bộ raster có phạm vi từ hơi mờ đến thực sự mờ. (Về mặt lý thuyết, mờ nhất sẽ là một raster không đổi của trung bình số học của tất cả các giá trị).

Có bất kỳ công cụ hoặc phương pháp nào tôi có thể sử dụng (dựa trên Esri, GDAL, GRASS) không? Tôi có cần phải tự nướng bánh Gaussian thường xuyên không? Tôi có thể sử dụng bộ lọc thông thấp (ví dụ: bộ lọc của ArcGIS ) không và nếu có, tôi có cần chạy nó nhiều lần để có được hiệu ứng của bán kính lớn không?


Còn việc xuất khẩu raster sang kích thước ô lớn hơn thì sao? Điều này cũng không dẫn đến sự tắt tiếng của thái cực?

1
Vâng, điều đó cũng sẽ làm giảm các thái cực (giả sử rằng việc lấy lại ngầm định liên quan đến một số hình thức trung bình) nhưng đó là một cách khủng khiếp để làm mịn DEM: bạn sẽ tạo ra một số lượng nhỏ các khối lớn. BTW, người ta thường không cần xuất raster để làm điều này; tập hợp cũng như lấy mẫu lại cho một ô khác nhau là các thao tác cơ bản thường được tìm thấy trong phần mềm dựa trên raster.
whuber

Câu trả lời:


29

Gaussian Blur chỉ là một trung tâm trọng tâm. Bạn có thể tạo lại nó với độ chính xác cao với một chuỗi các vùng lân cận vòng tròn ngắn (không có trọng số) có nghĩa là: đây là một ứng dụng của Định lý giới hạn trung tâm .

Bạn có rất nhiều sự lựa chọn. "Bộ lọc" quá hạn chế - nó chỉ dành cho 3 x 3 vùng lân cận - vì vậy đừng bận tâm đến nó. Tùy chọn tốt nhất cho các DEM lớn là đưa phép tính bên ngoài ArcGIS vào một môi trường sử dụng Biến đổi Fourier nhanh: chúng thực hiện các phép tính tiêu cự tương tự nhưng (so sánh) chúng thực hiện rất nhanh. (GRASS có mô-đun FFT . Nó được dùng để xử lý hình ảnh nhưng bạn có thể nhấn nó vào dịch vụ cho DEM của mình nếu bạn có thể điều chỉnh lại nó với độ chính xác hợp lý trong phạm vi 0..255.) Chặn rằng, ít nhất hai giải pháp là đáng xem xét:

  1. Tạo một tập hợp các trọng số lân cận để ước tính độ mờ Gaussian cho một vùng lân cận khá lớn. Sử dụng các lần chuyển tiếp mờ này để tạo ra chuỗi DEM mượt mà hơn bao giờ hết.

    (Các trọng số được tính là exp (-d ^ 2 / (2r)) trong đó d là khoảng cách (trong các ô nếu bạn muốn) và r là bán kính hiệu dụng (cũng trong các ô). Chúng phải được tính trong một vòng tròn kéo dài ra ít nhất 3r . Sau khi làm như vậy, chia mỗi trọng số cho tổng của tất cả chúng để cuối cùng chúng tổng hợp thành 1.)

  2. Ngoài ra, hãy quên trọng số; chỉ cần chạy một tiêu cự tròn lặp đi lặp lại. Tôi đã thực hiện chính xác điều này để nghiên cứu cách các lưới dẫn xuất (như độ dốc và khía cạnh) thay đổi với độ phân giải của DEM.

Cả hai phương pháp sẽ hoạt động tốt và sau vài lần đầu tiên sẽ có rất ít lựa chọn giữa hai phương thức, nhưng có lợi nhuận giảm dần: bán kính hiệu quả của n phương tiện tiêu cự liên tiếp (tất cả sử dụng cùng một kích thước lân cận) chỉ (xấp xỉ) căn bậc hai của n lần bán kính trung bình của tiêu điểm. Do đó, đối với số lượng lớn làm mờ, bạn sẽ muốn bắt đầu lại với một vùng lân cận bán kính lớn. Nếu bạn sử dụng trung bình tiêu cự không trọng số, hãy chạy 5-6 lần qua DEM. Nếu bạn sử dụng các trọng số xấp xỉ Gaussian, bạn chỉ cần một lần vượt qua: nhưng bạn phải tạo ma trận trọng số.

Cách tiếp cận này thực sự có ý nghĩa số học của DEM như là một giá trị giới hạn.


1
Nếu dữ liệu của bạn tăng đột biến, trước tiên bạn có thể thử bộ lọc trung vị ( en.wikipedia.org/wiki/Median_filter ) trước khi áp dụng độ mờ tổng quát hơn theo đề xuất của whuber.
MerseyViking

@Mersey Đó là một gợi ý tuyệt vời. Tôi chưa bao giờ thấy một DEM với các ngoại lệ cục bộ, nhưng một lần nữa tôi chưa bao giờ phải xử lý một DEM thô (chẳng hạn như kết quả LIDAR thô). Bạn không thể thực hiện các bộ lọc trung bình với FFT, nhưng bạn chỉ (thường) cần một vùng lân cận 3 x 3 để nó hoạt động nhanh chóng.
whuber

Cảm ơn ai. Tôi phải thừa nhận rằng tôi chỉ từng sử dụng dữ liệu LiDAR được xử lý trước, nhưng có một số đột biến đáng kể trong dữ liệu SRTM sẽ được hưởng lợi từ bộ lọc trung bình. Chúng thường có xu hướng rộng 2 hoặc 3 mẫu, do đó cần có bộ lọc trung bình lớn hơn.
MerseyViking

@Mersey Bạn vẫn ổn với bộ lọc trung bình lớn hơn 5 x 5 hoặc 7 x 7. Tuy nhiên, nếu bạn đang suy nghĩ (giả sử) bộ lọc 101 x 101, hãy chuẩn bị chờ! Bạn cũng đề xuất một điểm quan trọng đáng để xây dựng: đó là một ý tưởng rất tốt để thực hiện phân tích khám phá về DEM trước khi làm bất cứ điều gì. Điều này sẽ bao gồm xác định các gai (ngoại lệ cục bộ) và mô tả kích thước và phạm vi của chúng. Bạn muốn chắc chắn rằng chúng thực sự là đồ tạo tác (và không phải là một hiện tượng thực sự) trước khi bạn bắt đầu xóa sạch chúng bằng bộ lọc!
whuber

1
+1 cho FFT trên dữ liệu độ cao. Tôi thực sự đã thực hiện công việc đó trên cỏ cho dữ liệu NED 32 bit để loại bỏ phân chia hai chiều. Cuối cùng, điều này cũng có vấn đề bởi vì nó đã giới thiệu lại hiệu ứng ruộng bậc thang gây ra nhiều bệnh DEM có nguồn gốc đường viền khác.
Jay Guarneri

43

Tôi đã khám phá phương pháp signal.convolve của SciPy (dựa trên cuốn sách nấu ăn này ) và đang có một số thành công thực sự tốt đẹp với đoạn trích sau:

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

Tôi sử dụng chức năng này trong một chức năng khác đọc / ghi float32 GeoTIFF thông qua GDAL (không cần phải chuyển về 0-255 byte để xử lý hình ảnh) và tôi đã sử dụng các kích thước pixel (ví dụ: 2, 5, 20) và nó có đầu ra thực sự đẹp (được hiển thị trong ArcGIS với 1: 1 pixel và phạm vi tối thiểu / tối đa không đổi):

Gaussian DTM

Lưu ý: câu trả lời này đã được cập nhật để sử dụng chức năng xử lý signal.fftconvolve dựa trên FFT nhanh hơn nhiều .


1
+1 giải pháp tốt đẹp! Tôi không biết chắc chắn, nhưng đó là một sự đánh cược tốt mà signal.convolve sử dụng FFT.
whuber

Tôi đang tìm kiếm một số mã làm mờ cho một công cụ tự động khâu tôi đang viết và tình cờ thấy điều này. Làm tốt lắm @MikeToews!
Ragi Yaser Burhum

@RagiYaserBurhum Rất muốn nghe thêm về công cụ của bạn. MikeToews Câu trả lời tuyệt vời và nhiều đoạn mã được đánh giá cao.
Jay Laura

@JayLaura Không có gì đặc biệt, chỉ cần viết một công cụ để tự động chỉnh sửa một số hình ảnh tôi chụp với một số người bạn bằng khinh khí cầu. Sử dụng các lớp Hộp công cụ Orfeo orfeo-toolbox.org/SoftwareGuide/,
Ragi Yaser Burhum

2
@whuber khi sửa đổi thói quen này, nó không sử dụng FFT, nhưng bây giờ, và nhanh hơn rất nhiều.
Mike T

4

Đây có thể là một nhận xét cho câu trả lời tuyệt vời của MikeT , nếu nó quá dài và quá phức tạp. Tôi đã chơi với nó rất nhiều và tạo ra một plugin QGIS có tên FFT Convolution Filter (trong giai đoạn "thử nghiệm") dựa trên chức năng của anh ấy. Bên cạnh việc làm mịn, plugin cũng có thể làm sắc nét các cạnh bằng cách trừ raster được làm mịn từ bản gốc.

Tôi đã nâng cấp chức năng của Mike một chút trong quá trình:

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)

Việc kiểm tra tính hợp lệ là khá rõ ràng, nhưng điều quan trọng là truyền để nổi và quay lại. Trước đó, hàm tạo các mảng số nguyên màu đen (chỉ số không), do chia cho tổng các giá trị ( g / g.sum()).


3

Trong QGIS, tôi đã có được kết quả tốt một cách dễ dàng bằng cách sử dụng tính năng lọc hình ảnh của hộp công cụ Orfeo . Đó là chế độ hàng loạt nhanh và hợp lý hoạt động tốt. Có sẵn khuếch tán Gaussian, trung bình hoặc dị hướng.

Lưu ý rằng Radiusđề cập đến số lượng tế bào, không phải khoảng cách.

Dưới đây là một ví dụ sử dụng Smoothing (gaussian) :

  • Nguyên:

    Không có bộ lọc

  • Đã lọc:

    bộ lọc


1

Giải pháp tốt đẹp cho mờ Gaussian và hình ảnh động mát mẻ. Về công cụ Bộ lọc Esri đã đề cập ở trên, về cơ bản đó chỉ là công cụ "Thống kê tiêu điểm" của Esri được mã hóa cứng với kích thước 3x3. Công cụ thống kê tiêu điểm cung cấp cho bạn nhiều tùy chọn hơn về hình dạng của bộ lọc di chuyển, kích thước và thống kê bạn muốn chạy. http://desktop.arcgis.com/en/arcmap/latest/tools/spatial-analyst-toolbox/focal-statistic.htmlm

Bạn cũng có thể tạo bộ lọc "không thường xuyên" trong đó bạn chuyển vào tệp văn bản của riêng mình với trọng số để sử dụng cho từng ô. Tệp văn bản có nhiều hàng như bạn muốn trong vùng lọc của bạn, với các giá trị được phân tách bằng khoảng trắng cho các cột. Tôi đoán bạn nên luôn luôn sử dụng một số lượng hàng và cột lẻ, vì vậy ô mục tiêu của bạn nằm ở giữa.

Tôi đã tạo một bảng tính excel để chơi với các trọng lượng khác nhau mà tôi chỉ cần sao chép / dán vào tệp này. Nó sẽ đạt được kết quả tương tự như trên nếu bạn điều chỉnh các công thức.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.