क्या रेखापुंज चौरसाई / सामान्यीकरण उपकरण उपलब्ध हैं?


46

मेरे पास एक डीईएम है जिसे मैं स्थलाकृतिक चरम (चोटियों को भरने और घाटियों को भरने के लिए) को चिकना या सामान्य करना चाहूंगा। आदर्श रूप से, मैं "धुंधलापन" की त्रिज्या या स्तर पर नियंत्रण रखना चाहूंगा। अंत में, मुझे उन चूहों के एक समूह की आवश्यकता होगी जो थोड़े धुंधले से लेकर वास्तव में धुंधले होते हैं। (सैद्धांतिक रूप से, धुंधला सबसे अंकगणितीय माध्य सभी मानों का एक निरंतर रेखापुंज होगा)।

क्या कोई उपकरण या विधियाँ हैं जिनका मैं उपयोग कर सकता हूँ (Esri, GDAL, GRASS के आधार पर)? क्या मुझे अपने गॉसियन ब्लर रुटीन को होम करने की ज़रूरत है ? क्या मैं एक कम-पास फिल्टर (जैसे आर्कजीआईएस का फिल्टर ) का उपयोग कर सकता हूं , और यदि हां, तो क्या मुझे एक बड़े दायरे का प्रभाव पाने के लिए इसे कई बार चलाना होगा?


क्या के बारे में सिर्फ एक बड़े सेल आकार को रेखापुंज निर्यात? यह भी चरम सीमा के एक अंकन में परिणाम नहीं होगा?

1
हाँ, यह भी चरम को कम करेगा (यह मानते हुए कि निहित पुनरुत्पादन में औसत के कुछ रूप शामिल हैं) लेकिन यह एक डेम को सुचारू करने का एक भयानक तरीका है : आप बड़ी संख्या में छोटे ब्लॉक बनाएंगे। BTW, एक आम तौर पर ऐसा करने के लिए एक रेखापुंज निर्यात करने की जरूरत नहीं है; एकत्रीकरण के साथ-साथ resampling एक अलग cellsize करने के लिए बुनियादी संचालन आमतौर पर रेखापुंज आधारित सॉफ्टवेयर में पाए जाते हैं।
whuber

जवाबों:


29

गॉसियन ब्लर केवल एक भारित फोकल माध्य है। आप इसे कम दूरी के परिपत्र पड़ोस (अनवीटेड) के अनुक्रम के साथ उच्च सटीकता के लिए फिर से बना सकते हैं, इसका मतलब है: यह केंद्रीय सीमा प्रमेय का एक अनुप्रयोग है ।

आपके पास बहुत सारे विकल्प हैं। "फ़िल्टर" बहुत सीमित है - यह केवल 3 x 3 पड़ोस के लिए है - इसलिए इसके साथ परेशान न करें। बड़े डीईएम के लिए सबसे अच्छा विकल्प आर्कजीआईएस के बाहर की गणना को एक ऐसे वातावरण में ले जाना है जो फास्ट फूरियर ट्रांसफॉर्म का उपयोग करता है: वे एक ही फोकल गणना करते हैं लेकिन (तुलना में) वे इसे धधकते हुए तेजी से करते हैं। (GRASS में एक FFT मॉड्यूल है । यह इमेज प्रोसेसिंग के लिए अभिप्रेत है, लेकिन आप इसे अपने DEM के लिए सेवा में दबाने में सक्षम हो सकते हैं, यदि आप इसे उचित सटीकता के साथ 0..255 रेंज में रिस्केल कर सकते हैं।) इसे छोड़कर, कम से कम दो समाधान । ध्यान देने योग्य:

  1. एक विशाल पड़ोस के लिए एक गाऊसी धब्बा को अनुमानित करने के लिए पड़ोस वज़न का एक सेट बनाएं। इस धब्बा के क्रमिक पास का उपयोग करें, जो कि कभी भी मंद डेम का क्रम बना सकता है।

    (वजन की गणना ऍक्स्प के रूप में की जाती है (-d ^ 2 / (2r)) जहां d दूरी है (यदि आपको पसंद है तो कोशिकाओं में) और r प्रभावी त्रिज्या (कोशिकाओं में भी) है। उन्हें एक सर्कल के भीतर गणना की जानी है। कम से कम 3r तक । ऐसा करने के बाद, प्रत्येक वजन को उन सभी के योग से विभाजित करें, ताकि अंत में वे 1 से योग करें।)

  2. वैकल्पिक रूप से, भार को भूल जाओ; बस एक परिपत्र फोकल मतलब बार बार चलाते हैं। मैंने वास्तव में यह अध्ययन करने के लिए किया है कि व्युत्पन्न ग्रिड (जैसे ढलान और पहलू) एक डेम के संकल्प के साथ कैसे बदलते हैं।

दोनों तरीके अच्छी तरह से काम करेंगे, और पहले कुछ पास होने के बाद दोनों के बीच चयन करने के लिए बहुत कम होगा, लेकिन कम रिटर्न हैं: एन क्रमिक फोकल साधनों का प्रभावी त्रिज्या (सभी एक ही पड़ोस के आकार का उपयोग करके) केवल (लगभग) है n के केंद्र का वर्गमूल फोकल माध्य की त्रिज्या है। इस प्रकार, भारी मात्रा में धुंधलापन के लिए, आप एक बड़े-त्रिज्या पड़ोस के साथ फिर से शुरू करना चाहेंगे। यदि आप अनवील फोकल माध्य का उपयोग करते हैं, तो डेम पर 5-6 पास चलाएं। यदि आप वजन का उपयोग करते हैं जो लगभग गौसियन हैं, तो आपको केवल एक पास की आवश्यकता होती है: लेकिन आपको वजन मैट्रिक्स बनाना होगा।

इस दृष्टिकोण के पास वास्तव में डीईएम के अंकगणितीय माध्य एक सीमित मूल्य के रूप में है।


1
यदि आपके डेटा में स्पाइक्स हैं, तो आप व्हिबर द्वारा सुझाए गए अधिक सामान्य कलंक लगाने से पहले एक मीडियन फ़िल्टर ( en.wikipedia.org/wiki/Median_filter ) आज़मा सकते हैं।
MerseyViking

@ जर्सी यह एक उत्कृष्ट सुझाव है। मैंने कभी भी स्थानीय प्रस्थापकों के साथ एक डीईएम नहीं देखा है, लेकिन फिर मुझे कभी भी एक कच्चे डेम (जैसे कच्चे LIDAR परिणाम) को संसाधित नहीं करना पड़ा। आप FFT के साथ माध्य फ़िल्टर नहीं कर सकते हैं, लेकिन आपको केवल (आमतौर पर) 3 x 3 पड़ोस की आवश्यकता होती है, इसलिए यह एक तेज़ ऑपरेशन है।
whuber

शुक्रिया व्हीबर मुझे स्वीकार करना चाहिए कि मैंने केवल पहले से संसाधित LiDAR डेटा का उपयोग किया है, लेकिन SRTM डेटा में कुछ महत्वपूर्ण स्पाइक्स हैं जो एक माध्य फ़िल्टर से लाभान्वित होंगे। वे हालांकि 2 या 3 नमूने चौड़े होते हैं, इसलिए एक बड़े माध्य फ़िल्टर की आवश्यकता होगी।
MerseyViking

@ जर्सी आप ५ x ५ या 7 x ersey के बड़े माध्य फ़िल्टर के साथ अभी भी ठीक हैं। यदि आप एक १०१ x १०१ फ़िल्टर के बारे में विचार कर रहे हैं (हालांकि), प्रतीक्षा करने के लिए तैयार रहें! आप विस्तार से बताने के लायक एक महत्वपूर्ण बिंदु भी सुझाते हैं: कुछ भी करने से पहले डेम का खोजपूर्ण विश्लेषण करना बहुत अच्छा विचार है। इसमें स्पाइक्स (स्थानीय आउटलेयर) की पहचान करना और उनके आकार और विस्तार को चिह्नित करना शामिल होगा। इससे पहले कि आप उन्हें एक फिल्टर के साथ पोंछने के बारे में सुनिश्चित करें कि आप वास्तव में कलाकृतियां (और कुछ वास्तविक घटना नहीं) चाहते हैं!
whuber

1
एफ़टीपी डेटा के लिए एफएफटी के लिए +1। मैंने वास्तव में द्वि-दिशात्मक स्ट्रिपिंग को हटाने के लिए 32 बिट एनईडी डेटा के लिए घास में काम किया है। अंत में, यह भी समस्याग्रस्त था क्योंकि यह कई अन्य समोच्च व्युत्पन्न डेमों को नुकसान पहुंचाने वाले सीढ़ीदार प्रभाव को फिर से पेश करता था।
जे ग्वारनेरी

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 बाइट को पुनर्विक्रय करने की आवश्यकता नहीं है), और मैं पिक्सेल आकार का प्रयास कर रहा हूं (जैसे, 2, 5, 20) और यह है वास्तव में अच्छा आउटपुट (1: 1 पिक्सेल और निरंतर न्यूनतम / अधिकतम रेंज के साथ ArcGIS में कल्पना की गई है):

गाऊसी डीटीएम

नोट: यह उत्तर बहुत तेजी से FFT- आधारित सिग्नल का उपयोग करने के लिए अद्यतन किया गया था ।fftconvolve प्रोसेसिंग फ़ंक्शन।


1
+1 अच्छा समाधान! मुझे यकीन नहीं है, लेकिन यह एक अच्छी शर्त है कि signal.convolve FFT का उपयोग करता है।
whuber

मैं एक ऑटो-स्टिचिंग टूल के लिए कुछ धुंधला कोड देख रहा था जो मैं लिख रहा हूं और इस पर ठोकर खाई। अच्छी नौकरी @MikeToews!
रागी यशेर बुरहुम

@RagiYaserBurhum अपने टूल के बारे में अधिक सुनना पसंद करेगा। माइकट्यूज़ ग्रेट उत्तर और बहुत सराहना की गई कोड स्निपेट।
जे लौरा

@ जयलौरा कुछ ख़ास नहीं, बस एक टूल लिख रहा हूँ कुछ चित्र जो मैं अपने कुछ दोस्तों के साथ बैलून के साथ ले गया। Orfeo Toolbox classes orfeo-toolbox.org/SoftwareGuide/…
Ragi Yaser Burhum

2
@ इस दिनचर्या को संशोधित करने पर, यह एफएफटी का उपयोग नहीं कर रहा था, लेकिन यह अब है, और इतना तेज है।
माइक टी

4

यह माइकट के उत्कृष्ट उत्तर के लिए एक टिप्पणी हो सकती है , अगर यह बहुत लंबा और बहुत जटिल नहीं था। मैंने इसके साथ बहुत खेला है और अपने फ़ंक्शन के आधार पर एफएफटी कन्वर्सेशन फ़िल्टर्स ("प्रयोगात्मक" चरण में) नाम से एक क्यूजीआईएस प्लगइन बनाया है । चौरसाई के अलावा, प्लगइन भी किनारों को मूल से घटाकर स्मूथ रैस्टर को तेज कर सकता है।

मैंने माइक के कार्य को प्रक्रिया में थोड़ा उन्नत किया है:

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 Image फ़िल्टरिंग का उपयोग करके आसानी से अच्छे परिणाम मिले । यह उचित तेज़ है और बैच मोड ठीक काम करता है। गाऊसी, माध्य या अनिसोट्रोपिक विचलन उपलब्ध हैं।

ध्यान दें कि Radiusकोशिकाओं की संख्या को संदर्भित करता है, दूरी नहीं।

यहाँ एक उदाहरण है स्मूथिंग (गॉसियन) का उपयोग करना :

  • कच्चा:

    कोई फिल्टर नहीं

  • छाना हुआ:

    फिल्टर


1

गाऊसी धब्बा और शांत एनीमेशन के लिए अच्छा समाधान। ऊपर उल्लिखित Esri फ़िल्टर उपकरण के बारे में, जो कि मूल रूप से Esri "फोकल स्टैटिस्टिक्स" टूल है, जो एक 3x3 आकार में हार्ड-कोडेड है। फोकल स्टैटिस्टिक्स टूल आपको आपके चलते हुए फिल्टर के आकार, आकार, और उस आंकड़े पर बहुत अधिक विकल्प देता है जिसे आप चलाना चाहते हैं। http://desktop.arcgis.com/en/arcmap/latest/tools/spatial-analyst-toolbox/focal-statistics.htm

आप एक "अनियमित" फ़िल्टर भी बना सकते हैं, जहाँ आप प्रत्येक सेल के लिए उपयोग करने के लिए वज़न के साथ अपनी स्वयं की टेक्स्ट फ़ाइल में पास होते हैं। पाठ फ़ाइल में आपके फ़िल्टर क्षेत्र में उतनी ही पंक्तियाँ हैं जितनी आप स्तंभों के लिए व्हॉट्सएप-सीमांकित मानों के साथ हैं। मुझे लगता है कि आपको हमेशा विषम संख्या में पंक्तियों और स्तंभों का उपयोग करना चाहिए, इसलिए आपका लक्ष्य सेल मध्य में है।

मैंने अलग-अलग वजन के साथ खेलने के लिए एक एक्सेल स्प्रेडशीट बनाई जिसे मैं इस फाइल में कॉपी / पेस्ट करता हूं। यदि आप फ़ार्मुलों को समायोजित करते हैं तो यह उसी परिणाम को प्राप्त करना चाहिए जैसे कि ऊपर।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.