Estrazione delle aree della corona dell'albero dai dati di telerilevamento (immagini visive e LiDAR)


13

Sto cercando un metodo per elaborare un'immagine di telerilevamento ed estrarre dall'immagine le aree della corona dei singoli alberi.

Ho sia immagini di lunghezza d'onda visiva sia dati lidar dell'area. La posizione in questione è un'area desertica, quindi la copertura dell'albero non è fitta come una foresta. La risoluzione delle immagini aeree è di 0,5 piedi per 0,5 piedi. La risoluzione del lidar è di circa 1 x 1 piedi. Sia i dati visivi che il lidar provengono da un set di dati di Pima County, in Arizona. Un esempio del tipo di immagini aeree che ho è alla fine di questo post.

Questa domanda Rilevamento albero singolo in ArcMap? sembra essere lo stesso problema, ma non sembra esserci una buona risposta lì.

Posso ottenere una classificazione ragionevole dei tipi di vegetazione (e informazioni sulla copertura percentuale complessiva) nell'area usando la classificazione Iso Cluster in Arcmap, ma ciò fornisce poche informazioni sui singoli alberi. Il più vicino a ciò che voglio sono i risultati del passaggio dell'output della classificazione isocluster attraverso la funzione Raster a Polygon in Arcmap. Il problema è che questo metodo si fonde vicino agli alberi in un singolo poligono.

Modifica: probabilmente avrei dovuto includere qualche dettaglio in più su ciò che ho. I set di dati grezzi che ho sono:

  • Dati las completi e un tiff raster generato da esso.
  • Immagini visive (come l'immagine di esempio mostrata, ma che copre un'area molto più ampia)
  • Misurazioni dirette manuali di un sottoinsieme di alberi nell'area.

Da questi ho generato:

  1. Le classificazioni terreno / vegetazione.
  2. I raster DEM / DSM.

immagini aeree di esempio


Hai più dati del link. Hai i file las classificati o solo il raster DEM / DSM (quale?)? Non è davvero facile farlo con lunghezze d'onda visive con qualsiasi grado di precisione.
Michael Stimson,

Probabilmente avrei dovuto includere qualche dettaglio in più su ciò che ho. I set di dati grezzi che ho sono: 1. Dati Las completi e un tiff raster generato da esso 2. Immagini visive (come l'immagine di esempio mostrata, ma che copre un'area molto più ampia) 3. Misurazioni dirette manuali di un sottoinsieme degli alberi in l'area. Da questi ho generato: 1. le classificazioni del terreno / della vegetazione 2. i raster DEM / DSM
Theodore Jones

Hai accesso a eCognition? In caso contrario, a quali software di elaborazione delle immagini o linguaggi di programmazione hai accesso o conosci?
Aaron

Non ho una copia di eCognition, ma controllerò se qualcuno che conosco nel mio laboratorio / università ce l'ha perché sembra popolare per questo tipo di cose. Sono esperto in Python, C e Java. Ho una copia di Matlab ma sono praticamente un noob. Ho accesso a qualsiasi software presente in questo elenco softwarelicense.arizona.edu/students , oltre ovviamente a ArcGIS.
Theodore Jones il

Un po 'più di dettaglio nelle applicazioni commerciali che ho. Alcuni di quelli in quell'elenco di software che ho collegato sono Matlab, Mathematica, JMP e altri strumenti statistici e strumenti di sviluppo software come Visual Studio.
Theodore Jones,

Risposte:


10

Esiste una notevole mole di letteratura sul rilevamento di singole corone nei dati spettrali e lidar. Metodi saggi, forse iniziano con:

Falkowski, MJ, AMS Smith, PE Gessler, AT Hudak, LA Vierling e JS Evans. (2008). L'influenza della copertura del baldacchino della foresta di conifere sull'accuratezza di due singoli algoritmi di misurazione dell'albero utilizzando i dati lidar. Canadian Journal of Remote Sensing 34 (2): 338-350.

Smith AMS, EK Strand, CM Steele, DB Hann, SR Garrity, MJ Falkowski, JS Evans (2008) Produzione di mappe della struttura spaziale della vegetazione mediante analisi per oggetto di invasione di ginepro in fotografie aeree multi-temporali. Canadian Journal Remote Sensing 34 (2): 268-285

Se sei interessato al metodo Wavelet (Smith et al., 2008), l'ho codificato in Python ma è molto lento. Se hai esperienza con Matlab, è qui che viene implementato in modalità di produzione. Abbiamo due articoli in cui abbiamo identificato ~ 6 milioni di acri di invasione di ginepro nell'Oregon orientale usando il metodo wavelet con immagini NAIP RGB-NIR, quindi è ben provato.

Baruch-Mordo, S., JS Evans, J. Severson, JD Naugle, J. Kiesecker, J. Maestas e MJ Falkowski (2013) Salvataggio di salvia dagli alberi: una soluzione proattiva per ridurre una minaccia chiave per un candidato specie Conservazione biologica 167: 233-241

Poznanovic, AJ, MJ Falkowski, AL Maclean e JS Evans (2014) Una valutazione di precisione degli algoritmi di rilevamento degli alberi nei boschi di Juniper. Ingegneria fotogrammetrica e telerilevamento 80 (5): 627–637

Ci sono alcuni approcci interessanti, in generale la decomposizione degli oggetti, dalla letteratura spaziale sulla matematica dello stato di stato applicata che utilizza processi gaussiani multirisoluzione per scomporre le caratteristiche dell'oggetto su scala. Uso questi tipi di modelli per descrivere il processo su più scale nei modelli ecologici, ma potrebbe essere adattato per scomporre le caratteristiche degli oggetti immagine. Divertente, ma un po 'esoterico.

Gramacy, RB e HKH Lee (2008) modelli di processo gaussiani a tre punte bayesiani con un'applicazione alla modellazione al computer. Journal of American Statistical Association, 103 (483): 1119-1130

Kim, HM, BK Mallick e CC Holmes (2005) Analisi dei dati spaziali non stazionari usando processi gaussiani a tratti. Journal of American Statistical Association, 100 (470): 653–668


+1 Soprattutto per l'opzione 4; Poiché l'OP ha dati lidar, varrebbe la pena eseguire il metodo wavelet su un modello di superficie del baldacchino. Sebbene, come sapete, il metodo wavelet non è ancora veramente mainstream (o forse mai).
Aaron

In un inno all'ideale "taglia unica", inizierò a fare riferimento al software commerciale (ad es. ESRI, ERDAS) come software Big-box. Spesso la soluzione migliore, o nessuna, non è disponibile nel "software Big-box". Spesso si deve guardare allo sviluppo o alle comunità accademiche per trovare risposte a complessi problemi analitici spaziali. Questo ti porta fuori dal mainstream in grande fretta. Fortunatamente, a queste comunità piace condividere. Questo è anche il motivo per cui è importante che un analista non faccia affidamento su soluzioni a pulsante.
Jeffrey Evans,

2
Tendo ad essere d'accordo su BBS per problemi spaziali complessi. Tuttavia, l'estrazione di un singolo tipo di vegetazione in un ambiente arido, specialmente se si ha accesso ai dati lidar, è piuttosto mainstream. In questo caso, non è necessario reinventare la ruota sviluppando un nuovo approccio alla semplice identificazione dell'albero. I miei pensieri sono: perché non usare un approccio a pulsante prestabilito, specialmente in un pacchetto come eCognition, che è molto adatto per l'automazione?
Aaron

1
Vorrei aggiungere che eCognition ha la capacità di ID corona individuale. Ad esempio, è possibile trovare un set di regole di esempio nella comunità di eCog che utilizza un approccio di coltivazione di semi: cercare "Set di regole di esempio per la delineazione della palma da olio". L'integrazione del nuovo algoritmo di corrispondenza dei modelli di eCog e questo approccio di coltivazione dei semi potrebbe essere potenzialmente un metodo molto potente.
Aaron

1
Sono interessato al codice Python che menzioni per il metodo Wavelet di Smith (2008). È disponibile ovunque?
Alpheus,

3

Per creare un DHM sottrarre il DEM dal DEM, questo può essere fatto in Esri Raster Calculator o GDAL_CALC . Questo metterà tutte le tue elevazioni su una "parità di condizioni".

Sintassi (sostituisci percorsi completi per DEM, DSM e DHM):

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

Il DHM sarà principalmente 0 (o abbastanza vicino), il che rendi il tuo valore di nodata. Con Raster Calculator o GDAL_CALC è possibile estrarre valori più di un valore arbitrario in base alla quantità di rumore osservata nel DHM. Lo scopo è ridurre il rumore ed evidenziare solo le corone della vegetazione - nel caso in cui due "alberi" siano adiacenti, questo dovrebbe essere diviso in due chiazze distinte.

Sintassi (sostituisci percorsi completi per binario e DHM e valore osservato per valore):

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

Ora con GDAL_CALC o Esri IsNull creare un raster binario, che può essere poligonizzato con GDAL_Polygonize o Esri Raster in poligono .

Per perfezionare i poligoni rimuovere poligoni eccessivamente piccoli e quindi confrontarli con le bande RGB in cerca di firme, in Esri lo strumento Zonal Statistics aiuterà. Quindi puoi scartare i poligoni che chiaramente non hanno le statistiche giuste (in base alla sperimentazione e ai tuoi dati, non posso darti i valori).

Ciò dovrebbe garantire una precisione dell'80% circa nella stampa di singole corone.


Grazie. Vedrò se ottengo buoni risultati da questo metodo.
Theodore Jones il

Dovrai fare un po 'di sperimentazione per ottenere i valori appropriati, suggerisco di ritagliare piccole aree come campioni che sono indicativi (simili a) delle aree migliori / peggiori nei tuoi dati. Potrebbero essere necessarie mezza dozzina di esecuzioni di campioni per ottenere i parametri, ma è comunque meglio che tracciarli manualmente.
Michael Stimson,

3

eCognition è il miglior software per questo, l'ho fatto usando altri software ma eCognition è meglio. Ecco il riferimento alla letteratura sull'argomento:

Karlson, M., Reese, H., & Ostwald, M. (2014). Mappatura delle corone degli alberi nei boschi gestiti (parchi) dell'Africa occidentale semi-arida usando le immagini WorldView-2 e l'analisi delle immagini basata su oggetti geografici. Sensori, 14 (12), 22643-22669.

ad es. http://www.mdpi.com/1424-8220/14/12/22643

Inoltre:

Zagalikis, G., Cameron, AD e Miller, DR (2005). L'applicazione della fotogrammetria digitale e delle tecniche di analisi delle immagini per derivare le caratteristiche dell'albero e degli stand. Rivista canadese di ricerca forestale, 35 (5), 1224-1237.

ad es. http://www.nrcresearchpress.com/doi/abs/10.1139/x05-030#.VJmMb14gAA


Potresti ampliare il motivo per cui l'eCognition è migliore? Link solo le risposte tendono a diventare defunte quando il link scompare.
Aaron

1
eCognition è un software di analisi delle immagini basato su oggetti che non lo sono da adesso. Ho usato un approccio simile. L'applicazione di fotogrammetria digitale e tecniche di analisi delle immagini per ricavare le caratteristiche dell'albero e degli stand G Zagalikis, AD Cameron, DR Miller Canadian Journal of Forest Research, 2005, 35 (5): 1224-1237, 10.1139 / x05-030 nrcresearchpress.com/doi /abs/10.1139/x05-030#.VJmMb14gAA
Giorgos Zagalikis,

1
Grazie per il riferimento Giorgos. Penso che questi commenti funzionerebbero bene come modifica alla tua risposta.
Aaron

3

Ho avuto lo stesso problema un paio d'anni fa. Ho una soluzione che non richiede dati LAS filtrati o altri dati accessori. Se hai accesso ai dati LiDAR e puoi generare DEM / DSM / DHM (di seguito DEM, non sto discutendo la semantica della nomenclatura del modello di superficie) da diversi ritorni, il seguente script può essere utile.

Lo script arcpy ingerisce 3 DEM e sputa un poligono della foresta e gli shapefile dei punti degli alberi. I 3 DEM dovrebbero avere la stessa risoluzione spaziale (ovvero 1 metro) ed estensioni e rappresentare i primi ritorni, gli ultimi ritorni e la terra nuda. Avevo parametri molto specifici per l'estrazione di verdure, ma i parametri possono essere modificati per soddisfare altre esigenze. Sono sicuro che il processo può essere migliorato, poiché questo è stato il mio primo serio tentativo di scripting Python.

# 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

Sto pubblicando questo come risposta a causa del limite di lunghezza nel commento, nessuna speranza per i crediti :). Pennello molto ampio, a condizione che tu abbia DEM.

  1. Estrai DEM per singolo poligono in dem.
  2. Definisci gli estremi di elevazione del dem
  3. Imposta zCur + = - zStep. Passaggio da ricercare preventivamente nelle iterazioni, ad es. Calo ragionevole tra l'elevazione della "cella superiore dell'albero" e i vicini
  4. Below = Con (dem => zCur, int (1))
  5. Raggruppa le regioni di sotto. Conta abbastanza grande, cioè "alberi". Definizione richiesta qui da ispezione visiva, ricerca preliminare?
  6. Andare al passaggio 3 se zCur> zMin, passaggio 1 altrimenti.

Numero massimo di gruppi nel processo = conteggio degli alberi all'interno del singolo poligono. Criteri aggiuntivi, ad esempio la distanza tra 'alberi' all'interno di poligoni, potrebbero aiutare ... Il livellamento DEM usando anche il kernel è un'opzione.


Credo che ti riferisci a un DSM e non a un DEM ... In genere alberi, strutture e altre cianfrusaglie non lo trasformano in un DEM ma sono presenti nel DSM (meno le classi di rumore). DSM - DEM = DHM (modello altezza). Tutti questi possono essere estratti ragionevolmente dai dati LiDAR, anche se sono classificati solo terra / non terra, ma se hai il DEM e non il LAS sei nel fiume senza una paletta perché le caratteristiche che stai cercando non lo sono ecco !
Michael Stimson,

Sì, DHM come descritto farà. So poco di Lidar.
FelixIP,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.