Витяг ділянок крони дерева з даних дистанційного зондування (візуальні зображення та LiDAR)


13

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

У мене є як зорові зображення ареалу довжини хвилі, так і дані лідара з області. Розташування, про яке йде мова, є пустельною областю, тому покрив дерева не такий густий, як лісова територія. Дозвіл повітряних знімків становить 0,5 фута на 0,5 фута. Роздільна здатність lidar становить приблизно 1 х 1 фут. Візуальні дані та lidar надходять із набору даних у графстві Піма, штат Арізона. Зразок типу аерофотознімання у мене є в кінці цієї публікації.

Це питання Виявлення одного дерева в ArcMap? здається, це те саме питання, але там, здається, немає гарної відповіді.

Я можу отримати розумну класифікацію типів рослинності (та інформацію про загальний відсотковий покрив) у цьому районі, використовуючи класифікацію Ізо кластера в Arcmap, але це дає мало інформації про окремі дерева. Найближчими до мене, що я хочу, є результати передачі виводу класифікації ізокластерів за допомогою функції Raster to Polygon в Arcmap. Проблема полягає в тому, що цей метод зливається поблизу дерев в єдиний багатокутник.

Редагувати: я, мабуть, мав би включити ще детальну інформацію про те, що я маю. Неотримані набори даних у мене є:

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

З цього я створив:

  1. Класифікація ґрунту / рослинності.
  2. Растери DEM / DSM.

зразкові аерофотознімки


У вас більше даних, ніж посилання. Чи є у вас класифіковані лас-файли або просто растр DEM / DSM (який?)? Це дійсно непросто зробити з просто візуальними довжинами хвиль з будь-яким ступенем точності.
Майкл Стимсон

Я, мабуть, мав би включити дещо детальніше про те, що у мене є. У моїх необроблених наборах даних є: 1.Повні дані лас і тифрний растр, сформований з них 2. Візуальні зображення (як показане зразкове зображення, але охоплює значно ширшу область) 3. Ручне пряме вимірювання підмножини дерев у площа. На основі цього я створив: 1. класифікацію ґрунту / рослинності 2. растри DEM / DSM
Теодор Джонс

Чи маєте ви доступ до електронного пізнання? Якщо ні, то до якого програмного забезпечення для обробки зображень чи мов програмування ви маєте доступ чи знаєте?
Аарон

У мене немає копії електронного пізнання, але я перевірю, чи є у когось, кого я знаю, в моїй лабораторії / університеті, оскільки вона здається популярною для цього типу речей. Я обізнаний у Python, C та Java. У мене є копія Matlab, але я майже noob у цьому. У мене є доступ до будь-якого програмного забезпечення в цьому списку softwarelicense.arizona.edu/students , а також, звичайно, ArcGIS.
Теодор Джонс

Трохи детальніше в комерційних програмах, які я маю. Деякі з цього списку програмного забезпечення, з яким я пов’язаний, - це Matlab, Mathematica, JMP та інші інструменти статистики, а також засоби розробки програмного забезпечення, такі як Visual Studio.
Теодор Джонс

Відповіді:


10

Існує значна кількість літератури про індивідуальне виявлення корони у спектральних та лідарних даних. Методи розумні, можливо, починаються з:

Фальковський, MJ, AMS Smith, PE Gessler, AT Hudak, LA Vierling та JS Evans. (2008). Вплив кришків хвойних лісів на точність двох алгоритмів вимірювання дерев за допомогою даних лідарів. Канадський журнал дистанційного зондування 34 (2): 338-350.

Smith AMS, EK Strand, CM Steele, DB Hann, SR Garrity, MJ Falkowski, JS Evans (2008) Виготовлення карт просторової структури рослинності методом аналізу об'єктів ялівцю на багатохоронних аерофотознімках. Канадський журнал дистанційного зондування 34 (2): 268-285

Якщо вас цікавить метод Wavelet (Smith et al., 2008), у мене він закодований в Python, але це дуже повільно. Якщо у вас є досвід Matlab, саме тут він реалізований у виробничому режимі. У нас є два документи, де ми визначили ~ 6 мільйонів акрів посягання на ялівець у східному штаті Орегону, використовуючи метод вейвлетів із зображеннями NAIP RGB-NIR, так що це добре доведено.

Барух-Мордо, С., Дж. Еванс, Дж. Северсон, Дж. Д. Наугле, Дж. Кізекер, Дж. Маестас та М. Дж. Фальковський (2013) Збереження шавлії з дерев: проактивне рішення щодо зменшення ключової загрози для кандидата види біологічного збереження 167: 233-241

Познанович, AJ, MJ Falkowski, AL Maclean, JS Evans (2014) Оцінка точності алгоритмів виявлення дерев у ялівецьких лісах. Фотограмметрична інженерія та дистанційне зондування 80 (5): 627–637

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

Gramacy, RB та HKH Lee (2008) Bayesian впорядкували гауссові моделі процесів із застосуванням до комп'ютерного моделювання. Журнал Американської статистичної асоціації, 103 (483): 1119–1130

Kim, HM, BK Mallick, CC Holmes (2005) Аналіз нестаціонарних просторових даних за допомогою кускових процесів Гаусса. Журнал Американської статистичної асоціації, 100 (470): 653–668


+1 Спеціально для варіанту 4; Оскільки ОП має лідарні дані, варто було б застосувати вейвлет-метод на моделі поверхні навісу. Хоча, як відомо, метод вейвлетів ще не є головним (або, можливо, коли-небудь).
Аарон

В оді ідеалу, що відповідає всім розмірам, я почну посилатися на комерційне програмне забезпечення (наприклад, ESRI, ERDAS) як програмне забезпечення Big-box. Часто найкраще рішення, або яке-небудь взагалі, не доступне в "програмному забезпеченні для великого ящика". Часто доводиться шукати розвиток або академічні спільноти, щоб знайти відповіді на складні просторові аналітичні проблеми. Це вас дуже поспішає з мейнстріму. На щастя, ці громади люблять ділитися. Ось чому також аналітику важливо не покладатися на кнопкові рішення.
Джефрі Еванс

2
Я схильний погоджуватися щодо BBS для складних просторових проблем. Однак видобуток одного типу рослинності в посушливому середовищі - особливо якщо у вас є доступ до даних лідарів - є досить мейнстрімом. У цьому випадку немає необхідності переосмислювати колесо, розробляючи новий підхід до простої ідентифікації дерева. Думаю, чому б не скористатися заздалегідь встановленим підходом, особливо в такому пакеті, як eCognition, який дуже підходить для автоматизації?
Аарон

1
Варто додати, що eCognition має можливість індивідуального ідентифікатора корони. Як приклад, ви можете знайти зразковий набір правил у спільноті eCog, який використовує підхід для вирощування насіння - шукайте "Набір правил для встановлення зразків пальмового дерева в олійному середовищі". Інтеграція нового алгоритму відповідності шаблонів eCog та такого підходу для вирощування насіння потенційно може бути дуже потужним методом.
Аарон

1
Мене цікавить код python, який ви згадуєте для методу Smith (2008) Wavelet. Чи є вона де-небудь?
Алфей

3

Щоб створити DHM відняти DEM від DEM, це можна зробити в Esri Raster Calculator або GDAL_CALC . Це поставить усі ваші висоти на "рівне ігрове поле".

Синтаксис (Замініть повний шлях для DEM, DSM та DHM):

GDAL_CALC.py -A DSM -B DEM --outfile=DHM --CALC "A-B"

DHM буде здебільшого 0 (або достатньо близьким), що ви зробите своїм значенням нодату. За допомогою Raster Calculator або GDAL_CALC ви можете отримати значення, що перевищують довільне значення, залежно від кількості шуму, який ви спостерігаєте в DHM. Завданням цього є зменшення шуму та виділення лише крони рослинності - у випадку, коли два «дерева» є сусідніми, це повинно розділитися на дві чіткі краплі.

Синтаксис (Замініть повний шлях для двійкових та DHM та спостережуване значення для значення):

GDAL_CALC.py -A DHM --outfile=Binary --calc "A*(A>Value)"

Тепер за допомогою GDAL_CALC або Esri IsNull створіть бінарний растр, який можна полігонізувати за допомогою GDAL_Polygonize або Esri Raster to Polygon .

Щоб уточнити багатокутники, видаліть надмірно маленькі багатокутники, а потім порівняйте їх із смугами RGB, які шукають підписи, в Esri допоможе інструмент Zonal Statistics . Тоді ви можете відкинути багатокутники, які явно не мають правильної статистики (на основі експерименту та ваших даних, я не можу дати вам значення).

Це повинно отримати приблизно 80% точності при побудові окремих коронок.


Дякую. Я побачу, якщо я отримаю хороші результати від цього методу.
Теодор Джонс

Вам потрібно буде провести експерименти, щоб отримати відповідні значення, я пропоную вирізати невеликі ділянки як зразки, які вказують на (схожі на) найкращі / найгірші області ваших даних. Для отримання параметрів може знадобитися півдюжини проб, але це все-таки має бути краще, ніж побудувати їх вручну.
Майкл Стімсон

3

eCognition - це найкраще програмне забезпечення для цього, я це робив, використовуючи інше програмне забезпечення, але eCognition - це краще. Ось посилання на літературу на цю тему:

Karlson, M., Reese, H., & Ostwald, M. (2014). Картографування крони дерев в керованих лісових масивах (паркові ділянки) напівзасушливої ​​Західної Африки з використанням зображень WorldView-2 та аналізу зображень на основі географічних об'єктів. Датчики, 14 (12), 22643-22669.

наприклад, http://www.mdpi.com/1424-8220/14/12/22643

Додатково:

Загаликіс, Г., Камерон, AD, & Miller, DR (2005). Застосування цифрової фотограмметрії та методів аналізу зображень для отримання характеристик дерев та насаджень. Канадський журнал лісових досліджень, 35 (5), 1224-1237.

наприклад, http://www.nrcresearchpress.com/doi/abs/10.1139/x05-030#.VJmMb14gAA


Чи можете ви, будь ласка, розширити, чому електронне пізнання краще? Відповіді лише на посилання стають непрацездатними, коли посилання припиняється.
Аарон

1
eCognition - це об'єктне програмне забезпечення для аналізу зображень, інше - ще не я. Я використовував подібний підхід. Застосування цифрової фотограметрії та методів аналізу зображень для отримання характеристик дерев та насаджень G Загаликіс, А. Д. Камерон, ДР Міллер, Канадський журнал лісових досліджень, 2005, 35 (5): 1224-1237, 10.1139 / x05-030 nrcresearchpress.com/doi /abs/10.1139/x05-030#.VJmMb14gAA
Giorgos Zagalikis

1
Дякую за довідку Giorgos. Я думаю, що ці коментарі будуть добре працювати як редакція вашої відповіді.
Аарон

3

У мене був такий самий випуск пару років тому. У мене є рішення, яке не вимагає відфільтрованих даних LAS або інших допоміжних даних. Якщо у вас є доступ до даних LiDAR і ви можете генерувати DEM / DSM / DHM (далі DEM, я не обговорюю семантику номенклатури поверхневої моделі) з різних повернень, наступний сценарій може бути корисним.

Скрипт arcpy сприймає 3 DEM і випилює форму лісового полігону та дерева. 3 DEM повинні мати однакову просторову роздільну здатність (тобто 1 метр) і розширення і представляти першу віддачу, останню віддачу та оголену землю. У мене були дуже конкретні параметри для вилучення овочів, але параметри можуть бути змінені відповідно до інших потреб. Я впевнений, що процес можна вдосконалити, оскільки це була моя перша серйозна спроба сценаріїв пітона.

# Name:         Veg_Extractor.py
# Date:         2013-07-16
# Usage:        ArcMap 10.0; Spatial Analyst
# Input:        1 meter DEMs for first returns (DEM1), last returns (DEM2), and bare earth (BE)
# Output:       forest polygon (veg with height > 4m) shapefile with holes > 500m removed;
#               tree point (veg with height > 4m, crown radius of 9 cells) shapefile
# Notes:        Raises error if input raster cell sizes differ

import arcpy, os
from arcpy import env
from arcpy.sa import *

# Check out any necessary licenses
arcpy.CheckOutExtension("spatial")

# Script arguments
dem1 = arcpy.GetParameterAsText(0) #input Raster Layer, First Return DEM
dem2 = arcpy.GetParameterAsText(1) #input Raster Layer, Last Return DEM
bare_earth = arcpy.GetParameterAsText(2) #input Raster Layer, Bare Earth DEM
outForest = arcpy.GetParameterAsText(3) #shapefile
outTree = arcpy.GetParameterAsText(4) #shapefile

# Make sure cell size of input rasters are same
arcpy.AddMessage("Checking cell sizes...")
dem1Xresult = arcpy.GetRasterProperties_management(dem1, "CELLSIZEX")
dem1Yresult = arcpy.GetRasterProperties_management(dem1, "CELLSIZEY")
dem2Xresult = arcpy.GetRasterProperties_management(dem2, "CELLSIZEX")
dem2Yresult = arcpy.GetRasterProperties_management(dem2, "CELLSIZEY")
beXresult = arcpy.GetRasterProperties_management(bare_earth, "CELLSIZEX")
beYresult = arcpy.GetRasterProperties_management(bare_earth, "CELLSIZEY")
dem1X = round(float(dem1Xresult.getOutput(0)),4)
dem1Y = round(float(dem1Yresult.getOutput(0)),4)
dem2X = round(float(dem2Xresult.getOutput(0)),4)
dem2Y = round(float(dem2Yresult.getOutput(0)),4)
beX = round(float(beXresult.getOutput(0)),4)
beY = round(float(beYresult.getOutput(0)),4)
if (dem1X == dem1Y == dem2X == dem2Y == beX == beY) == True:
    arcpy.AddMessage("Cell sizes match.")
else:
    arcpy.AddMessage("Input Raster Cell Sizes:")
    arcpy.AddMessage("DEM1: (" + str(dem1X) + "," + str(dem1Y) + ")")
    arcpy.AddMessage("DEM2: (" + str(dem2X) + "," + str(dem2Y) + ")")
    arcpy.AddMessage("  BE: (" + str(beX) + "," + str(beY) + ")")
    raise Exception("Cell sizes do not match.")

# Check map units
dem1_spatial_ref = arcpy.Describe(dem1).spatialReference
dem1_units = dem1_spatial_ref.linearUnitName
dem2_spatial_ref = arcpy.Describe(dem2).spatialReference
dem2_units = dem2_spatial_ref.linearUnitName
bare_earth_spatial_ref = arcpy.Describe(bare_earth).spatialReference
bare_earth_units = bare_earth_spatial_ref.linearUnitName
if (dem1_units == dem2_units == bare_earth_units) == True:
    if dem1_units == "Meter":
        area = "500 SquareMeters" #Area variable for meter
        unit = 1 #meter
    elif (dem1_units == "Foot_US") or (dem1_units == "Foot"):
        area = "5382 SquareFeet" #Area variable for feet
        unit = 3.28084 #feet in meter
    else:
        raise Exception("Units are not 'Meter', 'Foot_US', or 'Foot'.")
else:
    raise Exception("Linear units do not match.  Check spatial reference.")

# Local variables:
(workspace, filename) = os.path.split(outForest)
arcpy.env.workspace = workspace
arcpy.env.overwriteOutput = True
dem1 = Raster(dem1)
dem2 = Raster(dem2)
bare_earth = Raster(bare_earth)
nbr1 = NbrRectangle(3, 3, "CELL")
nbr2 = NbrRectangle(5, 5, "CELL")
nbr3 = NbrCircle(5, "CELL")

# Give units and multiplier
arcpy.AddMessage("Linear units are " + dem1_units + ". Using multiplier of " + str(unit) + "...")

arcpy.AddMessage("Processing DEMs...")
# Process: Raster Calculator (DEM1 - BE)
ndsm_dem1 = dem1 - bare_earth

# Process: Raster Calculator (DEM1 - DEM2)
d1_d2 = dem1 - dem2

# Process: Raster Calculator
threshold_d1d2 = (d1_d2 > (0.1 * unit))  &  (ndsm_dem1 >= (4.0 * unit))

# Process: Focal Statistics (max 3x3)
focal_max1 = FocalStatistics(threshold_d1d2, nbr1, "MAXIMUM", "DATA")

# Process: Focal Statistics (majority 5x5)
focal_majority = FocalStatistics(focal_max1, nbr2, "MAJORITY", "DATA")

# Process: Con
con_ndsm_dem1 = Con(ndsm_dem1 >= (4.0 * unit), focal_majority, focal_max1)
focal_majority = None
focal_max1 = None

# Process: Focal Statistics (min 3x3)
focal_min1 = FocalStatistics(con_ndsm_dem1, nbr1, "MINIMUM", "DATA")
con_ndsm_dem1 = None

# Process: Focal Statistics (min 3x3)
veg_mask = FocalStatistics(focal_min1, nbr1, "MINIMUM", "DATA")

# Process: Focal Statistics (max R5)
focal_max2 = FocalStatistics(ndsm_dem1, nbr3, "MAXIMUM", "DATA")

arcpy.AddMessage("Calculating tree points...")
# Process: Raster Calculator
tree_points = (veg_mask == 1) & (ndsm_dem1 == focal_max2) & (ndsm_dem1 >= (4.0 * unit))
ndsm_dem1 = None
focal_max2 = None

# Process: Raster Calculator
tree_pick = Pick(tree_points == 1, 1)
tree_points = None

# Process: Raster to Polygon
arcpy.RasterToPolygon_conversion(tree_pick, workspace + "\\tree_poly.shp", "SIMPLIFY", "Value")
tree_pick = None

# Process: Feature To Point
arcpy.AddMessage("Writing tree points...")
arcpy.env.workspace = workspace #reset workspace
arcpy.env.overwriteOutput = True #reset overwrite permission
arcpy.FeatureToPoint_management(workspace + "\\tree_poly.shp", outTree, "CENTROID")

arcpy.AddMessage("Calculating forest polygons...")
# Process: Focal Statistics (max 3x3)
forests = FocalStatistics(veg_mask, nbr1, "MAXIMUM", "DATA")
veg_mask = None

# Process: Raster Calculator
forest_pick = Pick(forests == 1, 1)

# Process: Raster to Polygon
arcpy.RasterToPolygon_conversion(forest_pick, workspace + "\\forest_poly.shp", "SIMPLIFY", "Value")

# Process: Eliminate Holes > 500 sq m (5382 sq ft)
arcpy.AddMessage("Writing forest polygons...")
arcpy.EliminatePolygonPart_management(workspace + "\\forest_poly.shp", outForest, "AREA", area, "0", "CONTAINED_ONLY")

# Clean up
arcpy.AddMessage("Cleaing up...")
arcpy.Delete_management(workspace + "\\tree_poly.shp")
arcpy.Delete_management(workspace + "\\forest_poly.shp")

2

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

  1. Витяг DEM для окремих багатокутників до дем.
  2. Визначте крайні висоти дем
  3. Встановити zCur + = - zStep. Заздалегідь слід знайти ітерації, наприклад, розумні перепади між висотою верхівки дерева та сусідами
  4. Нижче = Con (dem => zCur, int (1))
  5. Згрупуйте регіони внизу. Порахуйте досить великі, це «дерева». Визначення, необхідне тут візуальним оглядом, попередніми дослідженнями?
  6. Перейдіть до кроку 3, якщо zCur> zMin, інший крок 1.

Максимальна кількість груп у процесі = кількість дерев всередині окремого багатокутника. Додаткові критерії, наприклад, відстань між "деревами" всередині полігонів, можуть допомогти ... Згладжування DEM з використанням ядра також є можливим.


Я вважаю, ви посилаєтесь на DSM, а не на DEM ... Зазвичай дерева, структури та інші сміття не перетворюють його на DEM, але функцію в DSM (мінусові класи шуму). DSM - DEM = DHM (модель висоти). Все це може бути витягнуто розумно з даних LiDAR, навіть якщо це класифіковано лише наземний / неземний, але якщо у вас є DEM, а не LAS, ви піднімаєтесь до кривиці без весла, тому що функції, які ви шукаєте , не є там !
Майкл Стімсон

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