Які інструменти для згладжування / узагальнення растрових інструментів доступні?


46

У мене є DEM, яку я хотів би згладити або узагальнити, щоб видалити топографічні крайнощі (рубати піки та заповнювати долини). В ідеалі я також хотів би мати контроль над радіусом або рівнем "розмитості". Врешті-решт, мені знадобиться набір растр, які варіюються від трохи розмитих до дійсно розмитих. (Теоретично, найяскравіше було б постійним растром середнього арифметичного всіх значень).

Чи є інструменти чи методи, які я можу використовувати (на основі Esri, GDAL, GRASS)? Чи потрібно мені вдома випікати свою розмиту Гаусса ? Чи можу я використовувати фільтр низьких частот (наприклад, фільтр ArcGIS ), і якщо так, чи потрібно мені запускати його ще чимало разів, щоб отримати ефект великого радіуса?


А що з експортом растру на більший розмір комірки? Чи це також не призведе до приглушення крайнощів?

1
Так, це також зменшить крайнощі (якщо припустити, що неявне перекомплектування передбачає певну форму усереднення), але це жахливий спосіб згладити DEM: ви створили б невелику кількість великих блоків. До речі, для цього зазвичай не потрібно експортувати растр; агрегації , а також передискретизации до іншого cellsize основні операції , зазвичай знаходяться в растровому на основі програмного забезпечення.
whuber

Відповіді:


29

Розмитість Гаусса - це лише зважене фокусне значення. Ви можете відтворити його з високою точністю з послідовністю кругового сусідства на коротких відстанях (не зваженим) означає: це застосування теореми центрального межі .

У вас багато варіантів. "Фільтр" занадто обмежений - він лише для районів 3 х 3, тому не турбуйтеся з цим. Найкращим варіантом для великих DEM є проведення обчислення за межами ArcGIS у середовищі, яке використовує швидкі перетворення Фур'є: вони роблять ті ж фокусні розрахунки, але (порівняно) вони роблять це надзвичайно швидко. (У GRASS є модуль FFT . Він призначений для обробки зображень, але ви, можливо, зможете натиснути його на службу для вашої DEM, якщо зможете з розумною точністю змінити його в діапазон 0..255.) Якщо заборонити це, принаймні два рішення є Варто врахувати:

  1. Створіть набір ваг сусідства, щоб наблизити розмиття Гаусса для значного мікрорайону. Використовуйте послідовні пропуски цього розмиття, щоб створити свою послідовність все більш плавних DEM.

    (Ваги обчислюються як exp (-d ^ 2 / (2r)), де d - відстань (у клітинках, якщо вам подобається) і r - ефективний радіус (також у клітинках). Їх потрібно обчислити в межах кола, що розширюється щонайменше 3 р . Після цього розділіть кожну вагу на суму їх усіх, так що в кінці вони становлять 1).

  2. Як варіант, забудьте про зважування; просто кілька разів запускайте кругову фокусну точку. Я зробив саме це, щоб вивчити, як змінюються отримані сітки (наприклад, нахил і аспект) з роздільною здатністю DEM.

Обидва методи працюватимуть добре, і після перших декількох пропусків між ними буде мало що вибирати, але є зменшувані віддачі: ефективний радіус n послідовних фокусних засобів (усі, що використовують однаковий розмір сусідства), є лише (приблизно) квадратний корінь в n разів перевищує радіус вогнища. Таким чином, для величезної кількості розмиття вам потрібно буде почати заново з сусіднього з великим радіусом. Якщо ви використовуєте незважене фокусне середовище, виконайте 5-6 проходів над DEM. Якщо ви використовуєте ваги, приблизно приблизно гауссові, вам потрібен лише один прохід: але вам потрібно створити вагову матрицю.

Цей підхід дійсно має середнє арифметичне DEM як граничне значення.


1
Якщо у ваших даних є шипи, ви можете спробувати спершу середній фільтр ( en.wikipedia.org/wiki/Median_filter ), перш ніж застосувати більш загальну розмитість, як запропонував whuber.
MerseyViking

@Mersey Це відмінна пропозиція. Я ніколи не бачив DEM з місцевими людьми, але потім мені також ніколи не доводилося обробляти неочищені DEM (наприклад, сировинні результати LIDAR). З FFT не можна робити медіанні фільтри, але вам потрібно (як правило) лише околиці 3 х 3, так що це все одно швидка робота.
whuber

Дякую шубер. Я мушу визнати, що я коли-небудь використовував попередньо оброблені дані LiDAR, але є деякі значні сплески в даних SRTM, які мали б користь від медіанного фільтра. Вони, як правило, мають 2 або 3 зразки завширшки, тому потрібен більший середній фільтр.
MerseyViking

@Mersey Ти все ще гаразд із більшим медіановим фільтром 5 x 5 або 7 x 7. Якщо ви розмірковуєте (скажімо) фільтр 101 x 101, будьте готові чекати! Ви також пропонуєте важливий момент, який варто уточнити: дуже гарна ідея провести дослідний аналіз ДЕМ, перш ніж робити що-небудь. Сюди входить ідентифікація шипів (місцевих людей) та характеристика їх розмірів та розмірів. Ви хочете бути впевнені, що вони справді артефакти (а не якесь справжнє явище), перш ніж ви займетесь тим, як витерти їх з фільтром!
whuber

1
+1 для FFT за даними висоти. Я фактично зробив цю роботу в траві для 32-бітових даних NED для видалення двонаправленої смуги. Врешті-решт, це було також проблематично, оскільки воно знову запровадило ефект терасування, який вражає багато інших контурних ДЕМ.
Джей Гуарнері

43

Я досліджував підхід SciPy's 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')

Я використовую це в іншій функції, яка читає / записує float32 GeoTIFFs через GDAL (не потрібно змінювати масштаб до 0-255 байт для обробки зображень), і я використовую спробу розмірів пікселів (наприклад, 2, 5, 20), і вона має дійсно приємний вихід (візуалізується в ArcGIS з 1: 1 пікселями та постійним діапазоном min / max):

Гауссова ДТМ

Примітка: цю відповідь було оновлено для використання набагато швидшої функції обробки FFT на основі сигналу.fftconvolve .


1
+1 Приємне рішення! Я не знаю точно, але це гарно, що signal.convolve використовує FFT.
whuber

Я шукав якийсь розмитий код для інструменту автоматичного зшивання, про який пишу, і натрапив на це. Приємна робота @MikeToews!
Ragi Yaser Burhum

@RagiYaserBurhum Хотіла б дізнатися більше про ваш інструмент. MikeToews Чудова відповідь та високо оцінений фрагмент коду.
Джей Лора

@JayLaura Нічого особливого, просто написати інструмент для автоматичного наклеювання деяких зображень, які я взяв з друзями на повітряній кулі. Використання класів Orfeo Toolbox orfeo-toolbox.org/SoftwareGuide/…
Ragi Yaser Burhum

2
@whuber, переглянувши цю процедуру, вона не використовувала FFT, але це зараз, і це набагато швидше.
Майк Т

4

Це може бути коментарем до чудової відповіді MikeT , якщо вона не була занадто довгою і надто складною. Я багато грав з цим і створив плагін QGIS під назвою FFT Convolution Filters (ще в "експериментальній" стадії) на основі його функції. Окрім згладжування, плагін також може загострювати краї, віднімаючи згладжений растр від початкового.

Я трохи вдосконалив функцію Майка:

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стосується кількості комірок, а не відстані.

Ось приклад використання згладжування (гаусса) :

  • Сире:

    Без фільтра

  • Відфільтровано:

    фільтр


1

Приємне рішення для розмитості Гаусса та прикольної анімації. Щодо згаданого вище інструменту «Фільтр Esri», то це в основному лише інструмент Esri «Фокальна статистика», жорстко кодований до розміру 3x3. Інструмент "Фокусна статистика" дає вам набагато більше варіантів щодо форми вашого фільтра, що рухається, розміру та статистики, яку ви хочете запустити. http://desktop.arcgis.com/en/arcmap/latest/tools/spatial-analyst-toolbox/focal-statistics.htm

Ви також можете зробити "неправильний" фільтр, куди ви переходите у свій власний текстовий файл із вагами для використання для кожної комірки. Текстовий файл має стільки рядків, скільки вам потрібно у вашому полі фільтра, з розділеними пробілами значеннями для стовпців. Я думаю, ви завжди повинні використовувати непарні числа рядків і стовпців, тому ваша цільова клітина знаходиться посередині.

Я створив таблицю Excel для гри з різною вагою, яку я просто копіюю та вставляю в цей файл. Якщо ви коригуєте формули, він повинен досягти тих же результатів, що і вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.