มีเครื่องมือปรับให้เรียบแบบ raster ใดบ้าง?


46

ฉันมี DEM ที่ฉันต้องการเรียบหรือพูดคุยทั่วไปเพื่อลบความสุดขั้วภูมิประเทศ (ตัดออกจากยอดเขาและหุบเขาเติม) เป็นการดีที่ฉันต้องการควบคุมรัศมีหรือระดับของ "ความพร่ามัว" ในท้ายที่สุดฉันจะต้องมีชุดแรสเตอร์ที่มีตั้งแต่เล็กน้อยเบลอไปจนถึงเบลอจริงๆ (ในทางทฤษฎีความเบลอจะเป็น raster คงที่ของค่าเฉลี่ยเลขคณิตของค่าทั้งหมด)

มีเครื่องมือหรือวิธีการใดบ้างที่ฉันสามารถใช้ได้ (อิงจาก Esri, GDAL, GRASS) ฉันต้องกลับบ้านอบรูสัวแบบเกาส์ของตัวเองหรือไม่? ฉันสามารถใช้ฟิลเตอร์ low-pass (เช่นฟิลเตอร์ของ ArcGIS ) ได้หรือไม่และถ้าเป็นเช่นนั้นฉันต้องรันหลายครั้งเพื่อให้ได้ผลของรัศมีขนาดใหญ่หรือไม่?


แล้วแค่ส่งออกแรสเตอร์ไปยังขนาดเซลล์ที่ใหญ่ขึ้นล่ะ สิ่งนี้จะไม่ส่งผลให้เกิดการเปลี่ยนแปลงอย่างรุนแรงหรือไม่?

1
ใช่ว่าจะช่วยลดความสุดขั้ว (สมมติว่าการ resampling โดยนัยเกี่ยวข้องกับรูปแบบเฉลี่ย) แต่มันเป็นวิธีที่แย่มากที่จะทำให้ DEM ราบรื่น : คุณจะสร้างบล็อกขนาดใหญ่จำนวนเล็กน้อย BTW หนึ่งมักจะไม่จำเป็นต้องส่งออกแรสเตอร์เพื่อทำเช่นนี้ การรวมตัวและการสุ่มใหม่ให้เป็นเซลลูล่าร์ที่ต่างกันเป็นการดำเนินการขั้นพื้นฐานที่มักพบในซอฟต์แวร์ที่ใช้ raster
whuber

คำตอบ:


29

Gaussian Blur เป็นเพียงค่าเฉลี่ยถ่วงน้ำหนัก คุณสามารถสร้างมันจะมีความแม่นยำสูงที่มีลำดับของระยะสั้นกลมเขต (ชั่ง) หมายถึง: นี่คือการประยุกต์ใช้ทฤษฎีขีด จำกัด กลาง

คุณมีทางเลือกมากมาย "ตัวกรอง" มี จำกัด เกินไป - สำหรับย่านที่มีขนาด 3 x 3 เท่านั้นดังนั้นอย่าไปสนใจมัน ตัวเลือกที่ดีที่สุดสำหรับ DEM ขนาดใหญ่คือการคำนวณนอก ArcGIS สู่สภาพแวดล้อมที่ใช้การแปลงฟูริเยร์เร็ว: พวกเขาทำการคำนวณโฟกัสเดียวกัน แต่ (เมื่อเปรียบเทียบ) พวกเขาทำมันเร็วอย่างเห็นได้ชัด (GRASS มีโมดูล FFTมันมีไว้สำหรับการประมวลผลภาพ แต่คุณอาจกดเพื่อให้บริการสำหรับ DEM ของคุณถ้าคุณสามารถ rescale มันด้วยความแม่นยำที่เหมาะสมในช่วง 0..255) ยกเว้นว่าอย่างน้อยสองโซลูชั่นควรค่าแก่การพิจารณา:

  1. สร้างชุดตุ้มน้ำหนักใกล้เคียงเพื่อประมาณเบลอของเกาส์เซียนสำหรับพื้นที่ใกล้เคียงขนาดใหญ่ ใช้ความต่อเนื่องของความพร่ามัวนี้เพื่อสร้างลำดับของ DEM ที่นุ่มนวลกว่าเดิม

    (น้ำหนักถูกคำนวณเป็น exp (-d ^ 2 / (2r)) โดยที่dคือระยะทาง (ในเซลล์ถ้าคุณต้องการ) และrคือรัศมีที่มีประสิทธิภาพ (เช่นในเซลล์) พวกเขาจะต้องคำนวณภายในวงกลมที่ขยาย ออกไปอย่างน้อย3rหลังจากทำเช่นนั้นให้หารน้ำหนักแต่ละตัวด้วยผลรวมของพวกเขาทั้งหมดเมื่อสิ้นสุดพวกเขาจะรวมเป็น 1)

  2. หรือลืมลืมน้ำหนัก; เพียงเรียกใช้ค่าเฉลี่ยของโฟกัสแบบวนซ้ำ ๆ ฉันทำสิ่งนี้อย่างถี่ถ้วนเพื่อศึกษาการเปลี่ยนแปลงของกริด (เช่นความชันและมุมมอง) ที่เปลี่ยนแปลงไปตามความละเอียดของ DEM

ทั้งสองวิธีนี้จะทำงานได้ดีและหลังจากผ่านไปสองสามครั้งแรกจะมีให้เลือกเล็กน้อยระหว่างทั้งสอง แต่มีผลตอบแทนลดลง: รัศมีที่มีประสิทธิภาพของnโฟกัสต่อเนื่อง (ทั้งหมดที่ใช้ขนาดพื้นที่ใกล้เคียงเดียวกัน) เท่านั้น (โดยประมาณ) สแควร์รูทของnคูณรัศมีของค่าโฟกัส ดังนั้นสำหรับการเบลอจำนวนมากคุณจะต้องเริ่มต้นใหม่อีกครั้งด้วยย่านรัศมีขนาดใหญ่ หากคุณใช้ค่าเฉลี่ยของจุดโฟกัสที่ไม่ถ่วงน้ำหนักให้วิ่ง 5-6 ผ่าน DEM หากคุณใช้ตุ้มน้ำหนักที่มีค่าประมาณเกาส์เซียนคุณต้องผ่านการผ่านครั้งเดียวเท่านั้น แต่คุณต้องสร้างเมทริกซ์น้ำหนัก

วิธีการนี้มีค่าเฉลี่ยเลขคณิตของ DEM เป็นค่า จำกัด


1
หากข้อมูลของคุณมีหนามแหลมคุณสามารถลองใช้ตัวกรองแบบมัธยฐาน ( en.wikipedia.org/wiki/Median_filter ) ก่อนที่จะใช้การเบลอทั่วไปที่มากขึ้นตามที่ whuber แนะนำ
MerseyViking

@Mersey นั้นเป็นคำแนะนำที่ยอดเยี่ยม ฉันไม่เคยเห็น DEM กับผู้ผิดกฎหมายในท้องถิ่น แต่จากนั้นอีกครั้งฉันไม่เคยต้องดำเนินการ DEM แบบดิบ (เช่นผลลัพธ์ LIDAR แบบดิบ) เช่นกัน คุณไม่สามารถใช้ตัวกรองค่ามัธยฐานด้วย FFT แต่คุณ (ปกติแล้ว) จะต้องมีพื้นที่ใกล้เคียง 3 x 3 ดังนั้นจึงเป็นการทำงานที่รวดเร็ว
whuber

ขอบคุณมาก ฉันต้องยอมรับว่าฉันเคยใช้ข้อมูล LiDAR ที่ประมวลผลล่วงหน้าแล้วเท่านั้น แต่มีข้อมูลสำคัญบางอย่างในข้อมูล SRTM ที่จะได้รับประโยชน์จากตัวกรองมัธยฐาน พวกเขามักจะมีความกว้าง 2 หรือ 3 ตัวอย่างดังนั้นจึงจำเป็นต้องใช้ตัวกรองขนาดใหญ่ขึ้น
MerseyViking

@ เมอร์สลีย์คุณยังคงโอเคกับตัวกรองมัธยฐานขนาดใหญ่กว่า 5 x 5 หรือ 7 x 7 ถ้าคุณคิดว่าตัวกรอง 101 x 101 ควรเตรียมตัวให้พร้อม! คุณควรแนะนำประเด็นสำคัญที่ควรค่าแก่การอธิบาย: เป็นความคิดที่ดีมากที่จะทำการวิเคราะห์เชิงสำรวจของ DEM ก่อนที่จะทำอะไร ซึ่งจะรวมถึงการระบุ spikes (ค่าผิดปกติท้องถิ่น) และลักษณะขนาดและขอบเขตของพวกเขา คุณต้องการให้แน่ใจว่าพวกเขาเป็นสิ่งประดิษฐ์จริง ๆ (และไม่ใช่ปรากฏการณ์ที่แท้จริง) ก่อนที่คุณจะกำจัดพวกมันด้วยฟิลเตอร์!
whuber

1
+1 สำหรับ FFT กับข้อมูลระดับความสูง จริง ๆ แล้วฉันได้ทำให้มันทำงานบนหญ้าสำหรับข้อมูล 32 บิต NED เพื่อลบแถบสองทิศทาง ในท้ายที่สุดสิ่งนี้ก็เป็นปัญหาเช่นกันเพราะมันได้นำเสนอเอฟเฟ็กต์ลดหลั่นอีกครั้งที่ทำให้เกิดภัยพิบัติอื่น ๆ
Jay Guarneri

42

ฉันได้สำรวจวิธีการส่งสัญญาณของ SciPy (ตามตำรานี้ ) และฉันประสบความสำเร็จเป็นอย่างดีด้วยตัวอย่างต่อไปนี้:

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

ฉันใช้สิ่งนี้ในฟังก์ชั่นอื่นซึ่งอ่าน / เขียน float32 GeoTIFFs ผ่าน GDAL (ไม่จำเป็นต้อง rescale ถึง 0-255 byte สำหรับการประมวลผลภาพ) และฉันใช้ความพยายามขนาดพิกเซล (เช่น 2, 5, 20) และมี ผลลัพธ์ที่ดีจริงๆ (แสดงให้เห็นใน ArcGIS ด้วย 1: 1 พิกเซลและช่วง min / max คงที่):

เสียน DTM

หมายเหตุ: คำตอบนี้ได้รับการปรับปรุงให้ใช้ฟังก์ชั่นการประมวลผลสัญญาณเร็วขึ้นมากFFTconvolve


1
+1 ทางออกที่ดี! ฉันไม่รู้แน่นอน แต่มันเป็นทางออกที่ดีที่ signal.convolve ใช้ FFTs
whuber

ฉันกำลังมองหาโค้ดเบลอสำหรับเครื่องมือเย็บอัตโนมัติที่ฉันกำลังเขียนและสะดุดกับสิ่งนี้ ทำได้ดีมาก @MikeToews!
Ragi Yaser Burhum

@RagiYaserBurhum ชอบที่จะได้ยินเพิ่มเติมเกี่ยวกับเครื่องมือของคุณ MikeToews คำตอบที่ยอดเยี่ยมและตัวอย่างโค้ดที่ได้รับการชื่นชมอย่างมาก
Jay Laura

@ JayLaura ไม่มีอะไรพิเศษเพียงแค่เขียนเครื่องมือเพื่อบันทึกภาพอัตโนมัติที่ฉันถ่ายกับเพื่อนบางคนพร้อมบอลลูน การใช้คลาสกล่องเครื่องมือ Orfeo orfeo-toolbox.org/SoftwareGuide/…
Ragi Yaser Burhum

2
@ เมื่อมีการแก้ไขรูทีนนี้มันไม่ได้ใช้ FFT แต่เป็นตอนนี้และเร็วขึ้นมาก
Mike T

4

นี่อาจเป็นความเห็นต่อคำตอบที่ยอดเยี่ยมของ MikeTถ้ามันไม่ยาวเกินไปและซับซ้อนเกินไป ฉันได้เล่นกับมันมากและสร้างปลั๊กอิน QGIS ชื่อFFT Convolution Filters (ในระยะ "ทดลอง") ตามฟังก์ชั่นของเขา นอกจากการปรับให้เรียบแล้วปลั๊กอินยังสามารถปรับความคมชัดของขอบได้โดยการลบแรสเตอร์แบบปรับให้เรียบจากเดิม

ฉันได้อัปเกรดฟังก์ชั่นของ 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())


3

ใน QGIS ฉันได้ผลลัพธ์ที่ดีอย่างง่ายดายโดยใช้การกรองรูปภาพOrfeo Toolbox มันสมเหตุสมผลอย่างรวดเร็วและโหมดแบทช์ทำงานได้ดี มีการกระจายแบบเกาส์ค่าเฉลี่ยหรือ anisotropic

โปรดทราบว่าRadiusหมายถึงจำนวนเซลล์ไม่ใช่ระยะทาง

นี่คือตัวอย่างการใช้Smoothing (Gaussian) :

  • ดิบ:

    ไม่มีตัวกรอง

  • กรอง:

    กรอง


1

ทางออกที่ดีสำหรับการเกาส์เบลอและภาพเคลื่อนไหวที่ยอดเยี่ยม สำหรับเครื่องมือตัวกรอง Esri ที่กล่าวถึงข้างต้นนั้นเป็นเพียงเครื่องมือ Esri "Focal Statistics" ซึ่งมีขนาดเป็น 3x3 เครื่องมือสถิติโฟกัสช่วยให้คุณมีตัวเลือกเพิ่มเติมมากมายเกี่ยวกับรูปร่างของฟิลเตอร์ที่เคลื่อนไหวขนาดและสถิติที่คุณต้องการเรียกใช้ 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.