Uzaktan algılama verilerinden ağaç taç alanlarını çıkarma (görsel görüntüler ve LiDAR)


13

Uzaktan algılama görüntüsünü işlemek ve tek tek ağaçların taç alanlarını görüntüden çıkarmak için bir yöntem arıyorum.

Hem görsel dalga boyu alansal görüntülerim hem de bölgeden lidar verilerim var. Söz konusu konum bir çöl alanıdır, bu nedenle ağaç örtüsü bir orman alanı kadar yoğun değildir. Hava görüntülerinin çözünürlüğü 0,5 feet x 0,5 feet'dir. Lidar çözünürlüğü yaklaşık 1 x 1 ayaktır. Hem görsel veriler hem de lidar, bir Pima County, Arizona veri kümesinden geliyor. Sahip olduğum hava görüntüleri türünün bir örneği bu yazının sonunda.

Bu soru ArcMap'te Tek Ağaç algılama? aynı konu gibi görünüyor, ama orada iyi bir cevap yok gibi görünüyor.

Arcmap'taki Iso Cluster sınıflandırmasını kullanarak bölgedeki bitki örtüsü türlerinin makul bir sınıflandırmasını (ve toplam örtü yüzdesi hakkında bilgi) edinebilirim, ancak bu bireysel ağaçlar hakkında çok az bilgi sağlar. İstediğim şeye en yakın olanım, izokluster sınıflamasının çıktısını Rasterden Arcmap'ta Çokgene özelliğinden geçirmenin sonuçlarıdır. Sorun, bu yöntemin ağaçların yanında tek bir çokgene birleştirilmesidir.

Düzenleme: Muhtemelen sahip olduğum şeyler hakkında biraz daha detay eklemeliydim. Sahip olduğum ham veri setleri:

  • Tam las verisi ve ondan bir tiff raster üretildi.
  • Görsel görüntüler (gösterilen örnek görüntü gibi, ancak çok daha geniş bir alanı kaplar)
  • Alandaki ağaçların bir alt kümesinin manuel doğrudan ölçümleri.

Bunlardan oluşturduk:

  1. Zemin / bitki örtüsü sınıflandırmaları.
  2. DEM / DSM rasterleri.

havadan görüntü örnekleri


Bağlantıdan daha fazla veriniz var. Sınıflandırılmış las dosyalarınız mı yoksa sadece DEM / DSM rasteriniz mi (hangisi?)? Bunu herhangi bir doğruluk derecesinde sadece görsel dalga boylarıyla yapmak gerçekten kolay değil.
Michael Stimson

Muhtemelen sahip olduğum şeyler hakkında biraz daha detay eklemeliydim. Sahip olduğum ham veri setleri şunlardır: 1. Tam las veri ve ondan oluşturulan bir tiff raster 2. Görsel görüntüler (gösterilen örnek görüntü gibi, ancak çok daha geniş bir alanı kaplayan) 3. Ağaçların bir alt kümesinin manuel doğrudan ölçümleri alan. Bunlardan ürettim: 1. zemin / bitki örtüsü sınıflandırmaları 2. DEM / DSM rasters
Theodore Jones

ECognition'a erişiminiz var mı? Değilse, hangi görüntü işleme yazılımına veya programlama dillerine erişiminiz var veya biliyor musunuz?
Aaron

ECognition'ın bir kopyasına sahip değilim, ancak laboratuvarımda / üniversitede tanıdığım birinin buna sahip olup olmadığını kontrol edeceğim çünkü bu tür şeyler için popüler görünüyor. Python, C ve Java konusunda bilgiliyim. Matlab'ın bir kopyası var ama ben hemen hemen bir çaylağım. Bu listedeki yazılımların herhangi birine softwarelicense.arizona.edu/students ve ayrıca ArcGIS'e erişebiliyorum .
Theodore Jones

Ticari uygulamalarda biraz daha detay var. Bağlantı verdiğim yazılım listesinde yer alanlardan bazıları Matlab, Mathematica, JMP ve diğer istatistik araçları ve Visual Studio gibi yazılım geliştirme araçlarıdır.
Theodore Jones

Yanıtlar:


10

Spektral ve lidar verilerinde bireysel taç tespiti hakkında önemli bir literatür vardır. Yöntemler akıllıca, belki de:

Falkowski, MJ, AMS Smith, PE Gessler, AT Hudak, LA Vierling ve JS Evans. (2008). Kozalaklı orman gölgelik kapağının, lidar verileri kullanarak iki ayrı ağaç ölçüm algoritmasının doğruluğu üzerindeki etkisi. Kanada Uzaktan Algılama Dergisi 34 (2): 338-350.

Smith AMS, EK Strand, CM Steele, DB Hann, SR Garrity, MJ Falkowski, JS Evans (2008) Çok zamansal hava fotoğraflarında ardıç tecavüzünün nesne başına analizi ile bitki örtüsü mekansal yapı haritalarının üretilmesi. Kanada Dergisi Uzaktan Algılama 34 (2): 268-285

Wavelet yöntemiyle ilgileniyorsanız (Smith ve ark., 2008), Python'da kodladım ama çok yavaş. Matlab deneyiminiz varsa, üretim modunda uygulandığı yer burasıdır. NAIP RGB-NIR görüntüleri ile dalgacık yöntemini kullanarak doğu Oregon'da ~ 6 milyon dönümlük ardıç tecavüzünü belirlediğimiz iki makalemiz var, bu kanıtlanmıştır.

Baruch-Mordo, S., JS Evans, J. Severson, JD Naugle, J. Kiesecker, J. Maestas ve MJ Falkowski (2013) Ağaçlardan adaçayı yetiştiriciliği: Aday için önemli bir tehdidi azaltmak için proaktif bir çözüm Biyolojik Koruma 167: 233-241

Poznanovic, AJ, MJ Falkowski, AL Maclean ve JS Evans (2014) Ardıç Ormanlık Alanlarında Ağaç Tespit Algoritmalarının Doğruluk Değerlendirmesi. Fotogrametrik Mühendisliği ve Uzaktan Algılama 80 (5): 627–637

Ölçeğinde nesne özelliklerini ayrıştırmak için çoklu çözümleme Gauss süreçlerini kullanarak uygulanan matematik durum uzay literatüründen genel nesne ayrışmasında bazı ilginç yaklaşımlar vardır. Bu tip modelleri ekolojik modellerde çok ölçekli süreci tanımlamak için kullanıyorum, ancak görüntü nesnesi özelliklerini ayrıştırmak için uyarlanabilir. Eğlenceli, ama biraz ezoterik.

Gramacy, RB ve HKH Lee (2008) Bayesian, bilgisayar modellemesine bir uygulama ile Gauss süreç modellerini üç katına çıkardı. Amerikan İstatistik Derneği Dergisi, 103 (483): 1119–1130

Kim, HM, BK Mallick ve CC Holmes (2005) Durağan olmayan mekansal verilerin parçalı Gauss süreçlerini kullanarak analizi. Amerikan İstatistik Derneği Dergisi, 100 (470): 653–668


+1 Özellikle seçenek 4 için; OP'nin lidar verilerine sahip olması nedeniyle, dalgacık yöntemini bir kanopi yüzey modelinde çalıştırmaya değer. Bildiğiniz gibi, dalgacık yöntemi henüz gerçekten yaygın değil (veya belki de).
Aaron

Her şeye uyan tek beden idealinin bir örneğinde, ticari yazılıma (ör. ESRI, ERDAS) Big-box yazılımı olarak başvurmaya başlayacağım. Çoğu zaman en iyi çözüm ya da herhangi biri, "Big-box yazılımı" nda mevcut değildir. Genellikle karmaşık mekansal analitik sorunlara cevaplar için kalkınma veya akademik topluluklara bakmalıdır. Bu sizi büyük bir acele ile ana akımdan çıkarır. Neyse ki, bu topluluklar paylaşmaktan hoşlanıyor. Bu nedenle analistin basma düğmesi çözümlerine güvenmemesi de önemlidir.
Jeffrey Evans

2
Karmaşık mekansal problemler için BBS konusunda hemfikirim. Bununla birlikte, kurak bir ortamda tek bir bitki örtüsünün çıkarılması - özellikle de lidar verilerine erişiminiz varsa - oldukça yaygındır. Bu durumda, basit ağaç tanımlama için yeni bir yaklaşım geliştirerek tekerleği yeniden icat etmeye gerek yoktur. Düşüncelerim, neden özellikle otomasyon için çok uygun olan eCognition gibi bir pakette önceden belirlenmiş, bir düğme yaklaşımını kullanmıyorsunuz?
Aaron

1
ECognition'ın bireysel taç kimliği için kapasiteye sahip olduğunu eklemeliyim. Örnek olarak, eCog topluluğunda bir tohum yetiştirme yaklaşımı kullanan örnek bir kural kümesi bulabilirsiniz - "Palmiye Ağacı Ağaç Tanımı örneği Kural Seti" ni arayın. ECog'un yeni şablon eşleştirme algoritmasını ve bu tohum yetiştirme yaklaşımını entegre etmek potansiyel olarak çok güçlü bir yöntem olabilir.
Aaron

1
Smith (2008) Wavelet yöntemi için bahsettiğiniz python koduyla ilgileniyorum. Herhangi bir yerde mevcut mu?
Alpheus

3

Bir DHM oluşturmak için DEM'i DEM'den çıkarın , bu Esri Raster Calculator veya GDAL_CALC'de yapılabilir . Bu, tüm yüksekliklerinizi 'düz bir oyun alanına' koyacaktır.

Sözdizimi (DEM, DSM ve DHM için tam yolları değiştirin):

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

DHM çoğunlukla nodata değerinizi yaptığınız 0 (veya yeterince yakın) olacaktır. Raster Hesaplayıcı veya GDAL_CALC ile DHM'de gözlemlediğiniz parazit miktarına bağlı olarak keyfi bir değerden daha fazla değer elde edebilirsiniz. Bunun amacı gürültüyü azaltmak ve sadece bitki örtüsünün kronlarını vurgulamaktır - iki 'ağacın' bitişik olduğu durumda, bunun iki ayrı lekeye bölünmesi gerekir.

Sözdizimi (İkili ve DHM için tam yolları ve Değer için gözlenen değeri değiştirin):

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

Şimdi GDAL_CALC veya Esri IsNull ile GDAL_Polygonize veya Esri Raster to Polygon ile çokgenleştirilebilen bir ikili tarama oluşturun .

Çokgenleri rafine etmek için çok küçük çokgenleri çıkarın ve bunları imza arayan RGB bantlarıyla karşılaştırın, Esri Bölgesel İstatistik aracında yardımcı olacaktır. O zaman açıkça doğru istatistiklere sahip olmayan çokgenleri atabilirsiniz (deneylere ve verilerinize dayanarak size değerleri veremem).

Bu, bireysel kuronları çizerken sizi yaklaşık% 80 doğruluk oranına getirmelidir.


Teşekkürler. Bu yöntemden iyi sonuçlar alıp alamayacağımı göreceğim.
Theodore Jones

Uygun değerleri elde etmek için bazı deneyler yapmanız gerekecek, verilerinizdeki en iyi / en kötü alanları gösteren (benzer) örnekler olarak küçük alanları kırpmanızı öneririm. Parametrelerinizi almak için yarım düzine örnek çalışması gerekebilir, ancak yine de bunları elle çizmekten daha iyi olmalıdır.
Michael Stimson

3

eCognition bunun için en iyi yazılım, bunu başka bir yazılım kullanarak yaptım ama eCognition daha iyi. İşte bu konuda literatüre referans:

Karlson, M., Reese, H. ve Ostwald, M. (2014). WorldView-2 Görüntüleri ve Coğrafi Nesne Tabanlı Görüntü Analizi Kullanarak Yarı Kurak Batı Afrika'nın Yönetilen Ormanlık Alanlarında (Parklands) Ağaç Kronu Eşleme. Sensörler, 14 (12), 22643-22669.

örneğin http://www.mdpi.com/1424-8220/14/12/22643

Bunlara ek olarak:

Zagalikis, G., Cameron, AD ve Miller, DR (2005). Dijital fotogrametri ve görüntü analiz tekniklerinin ağaç ve stant özelliklerini elde etmek için uygulanması. Kanada orman araştırmaları dergisi, 35 (5), 1224-1237.

örn. http://www.nrcresearchpress.com/doi/abs/10.1139/x05-030#.VJmMb14gAA


ECognition'ın neden daha iyi olduğunu açıklar mısınız? Link sadece cevaplar link koptuğunda geçersiz olma eğilimindedir.
Aaron

1
eCognition diğerlerinden beri ben şimdi değil nesne tabanlı görüntü analiz yazılımı. Benzer bir yaklaşım kullandım. Ağaç ve stant özelliklerini elde etmek için dijital fotogrametri ve görüntü analiz tekniklerinin uygulanması G Zagalikis, AD Cameron, DR Miller Kanada Orman Araştırmaları Dergisi, 2005, 35 (5): 1224-1237, 10.1139 / x05-030 nrcresearchpress.com/doi /abs/10.1139/x05-030#.VJmMb14gAA
Giorgos Zagalikis

1
Referans Giorgos için teşekkürler. Bu yorumların cevabınızda bir düzenleme olarak iyi çalışacağını düşünüyorum.
Aaron

3

Birkaç yıl önce de aynı sorunu yaşadım. Filtrelenmiş LAS verileri veya diğer yardımcı verileri gerektirmeyen bir çözüm var. LiDAR verilerine erişiminiz varsa ve DEM'ler / DSM'ler / DHM'ler (bundan sonra DEM olarak anılacaktır, farklı modellerden yüzey modeli adlandırma semantiğini tartışmıyorum) farklı dönüşlerden kaynaklanabilirse, aşağıdaki komut dosyası yararlı olabilir.

Arcpy betiği 3 DEM alır ve bir orman çokgenini ve ağaç noktası şekil dosyalarını tükürür. 3 DEM aynı uzamsal çözünürlüğe (yani 1 metre) ve genişlemeye sahip olmalı ve ilk dönüşleri, son dönüşleri ve çıplak toprağı temsil etmelidir. Sebze ekstraksiyonu için çok spesifik parametrelerim vardı, ancak parametreler diğer ihtiyaçlara uyacak şekilde değiştirilebilir. Eminim bu süreç geliştirilebilir, çünkü bu benim python betiklemedeki ilk ciddi girişimimdi.

# 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

Ben yorumda uzunluk sınırı, kredi umutları nedeniyle bu cevap olarak gönderiyorum :). Çok geniş bir fırça, DEM'iniz olması koşuluyla.

  1. Dem için bireysel çokgen için DEM ayıklayın.
  2. Dem'in yükselme uçlarını tanımlayın
  3. ZCur + = - zStep'i ayarlayın. Önceden yineleme ile bulunacak adım, örneğin 'ağaç üst hücresi' yüksekliği ile komşular arasında makul düşüş
  4. Aşağıda = Con (dem => zCur, int (1))
  5. Aşağıdaki grup bölgeleri. Yeterince büyük sayın, bunlar 'ağaçlar'. Görsel inceleme, ön araştırma için burada tanım gerekli mi?
  6. ZCur> zMin ise 3. adıma geçin, aksi takdirde 1. adım.

İşlemdeki maksimum grup sayısı = her bir çokgenin içindeki ağaç sayısı. Ek kriterler, örneğin çokgenler içindeki 'ağaçlar' arasındaki mesafe yardımcı olabilir ... Çekirdek kullanarak DEM yumuşatma da bir seçenek.


DEM değil DSM'den bahsettiğinize inanıyorum ... Tipik olarak ağaçlar, yapılar ve diğer önemsizler onu bir DEM değil, DSM'de (eksi gürültü sınıfları) bir özellik haline getirir. DSM - DEM = DHM (yükseklik modeli). Bunların hepsi LiDAR verilerinden makul bir şekilde çıkarılabilir, ancak yalnızca topraklanmış / topraklanmamış olarak sınıflandırılmış olsa da, LEM'e sahip değilseniz ve LAS'a sahip değilseniz, küreksiz dere üzerindesiniz çünkü daha sonra olduğunuz özellikler değil İşte !
Michael Stimson

Yeap, DHM açıkladığınız gibi. Lidar hakkında çok az şey biliyorum.
FelixIP
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.