Ekstraksi area mahkota pohon dari data penginderaan jauh (gambar visual dan LiDAR)

13

Saya mencari metode untuk memproses gambar penginderaan jauh dan mengekstrak area mahkota pohon individu dari gambar.

Saya memiliki citra areal panjang gelombang visual, dan data Lidar dari daerah tersebut. Lokasi yang dimaksud adalah daerah gurun, jadi tutupan pohonnya tidak sepadat hutan. Resolusi citra udara adalah 0,5 kaki kali 0,5 kaki. Resolusi Lidar adalah sekitar 1 x 1 kaki. Baik data visual dan lidar berasal dari dataset Pima County, Arizona. Contoh tipe citra udara yang saya miliki ada di akhir tulisan ini.

Pertanyaan ini deteksi Single Tree di ArcMap? tampaknya menjadi masalah yang sama, tetapi tampaknya tidak ada jawaban yang bagus di sana.

Saya dapat memperoleh klasifikasi yang wajar dari tipe-tipe vegetasi (dan informasi tentang persentase tutupan keseluruhan) di area tersebut dengan menggunakan klasifikasi Iso Cluster di Arcmap, tetapi ini memberikan sedikit informasi tentang masing-masing pohon. Yang paling dekat saya dengan apa yang saya inginkan adalah hasil melewati keluaran klasifikasi isocluster melalui fitur Raster ke Polygon di Arcmap. Masalahnya adalah bahwa metode ini bergabung dekat oleh pohon menjadi satu poligon.

Sunting: Saya mungkin harus memasukkan beberapa detail tentang apa yang saya miliki. Kumpulan data mentah yang saya miliki adalah:

  • Data las lengkap, dan taster raster dihasilkan darinya.
  • Citra visual (seperti contoh gambar yang ditampilkan, tetapi mencakup area yang jauh lebih luas)
  • Pengukuran langsung secara manual terhadap sebagian pohon di daerah tersebut

Dari ini saya telah menghasilkan:

  1. Klasifikasi tanah / vegetasi.
  2. DEM / DSM raster.

contoh citra udara

Theodore Jones
sumber
Anda mendapat lebih banyak data daripada tautan. Apakah Anda memiliki file las rahasia atau hanya raster DEM / DSM (yang mana?)? Ini benar - benar tidak mudah untuk melakukan ini hanya dengan panjang gelombang visual dengan tingkat akurasi apa pun.
Michael Stimson
Saya mungkin harus memasukkan beberapa detail tentang apa yang saya miliki. Dataset mentah yang saya miliki adalah: 1.Full data las, dan raster tiff dihasilkan dari itu 2. Citra visual (seperti gambar sampel yang ditunjukkan, tetapi mencakup area yang jauh lebih luas) 3. pengukuran langsung manual dari subset pohon di daerah. Dari sini saya telah menghasilkan: 1. klasifikasi tanah / vegetasi 2. raster DEM / DSM
Theodore Jones
Apakah Anda memiliki akses ke eCognition? Jika tidak, perangkat lunak pengolah gambar atau bahasa pemrograman apa yang Anda akses atau ketahui?
Harun
Saya tidak memiliki salinan eCognition, tetapi saya akan memeriksa apakah ada orang yang saya kenal di lab / universitas saya memilikinya karena tampaknya populer untuk hal semacam ini. Saya berpengetahuan luas dalam Python, C dan Java. Saya memiliki salinan Matlab, tetapi saya tidak tahu apa-apa. Saya memiliki akses ke salah satu perangkat lunak pada daftar ini softwarelicense.arizona.edu/students , plus, tentu saja ArcGIS.
Theodore Jones
Sedikit lebih detail dalam aplikasi komersial yang saya miliki. Beberapa yang ada dalam daftar perangkat lunak yang saya tautkan adalah Matlab, Mathematica, JMP dan alat statistik lainnya, dan alat pengembangan perangkat lunak seperti Visual Studio.
Theodore Jones

Jawaban:

10

Ada banyak literatur tentang deteksi mahkota individu dalam data spektral dan lidar. Metode bijak, mungkin mulai dengan:

Falkowski, MJ, AMS Smith, PE Gessler, AT Hudak, LA Vierling dan JS Evans. (2008). Pengaruh tutupan kanopi hutan konifer pada akurasi dua algoritma pengukuran pohon individu menggunakan data 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) Produksi peta struktur-spasial vegetasi dengan analisis per objek perambahan juniper dalam foto udara multi-temporal. Canadian Journal Remote Sensing 34 (2): 268-285

Jika Anda tertarik pada metode Wavelet (Smith et al., 2008), saya memilikinya dengan kode Python tetapi, ini sangat lambat. Jika Anda memiliki pengalaman Matlab, ini adalah tempat penerapannya dalam mode produksi. Kami memiliki dua makalah di mana kami mengidentifikasi ~ 6 juta hektar perambahan juniper di Oregon bagian timur menggunakan metode wavelet dengan citra NAIP RGB-NIR sehingga, terbukti dengan baik.

Baruch-Mordo, S., JS Evans, J. Severson, JD Naugle, J. Kiesecker, J. Maestas, dan MJ Falkowski (2013) Menghemat belibis bijak dari pohon: Solusi proaktif untuk mengurangi ancaman utama terhadap kandidat spesies Konservasi Biologis 167: 233-241

Poznanovic, AJ, MJ Falkowski, AL Maclean, dan JS Evans (2014) Penilaian Akurasi Algoritma Deteksi Pohon di Juniper Woodlands. Rekayasa Fotogrametri & Penginderaan Jauh 80 (5): 627–637

Ada beberapa pendekatan yang menarik, dalam dekomposisi objek umum, dari literatur ruang matematika keadaan terapan menggunakan proses Gaussian multiresolusi untuk mendekomposisi karakteristik objek lintas skala. Saya menggunakan tipe-tipe model ini untuk menggambarkan proses multi-skala dalam model ekologis tetapi bisa diadaptasi untuk mendekomposisi karakteristik objek gambar. Menyenangkan, tetapi sedikit esoteris.

Gramacy, RB, dan HKH Lee (2008) Bayesian mengamati model proses Gaussian dengan aplikasi untuk pemodelan komputer. Jurnal Asosiasi Statistik Amerika, 103 (483): 1119–1130

Kim, HM, BK Mallick, dan CC Holmes (2005) Menganalisis data spasial non-stasioner menggunakan proses Gaussian piecewise. Jurnal Asosiasi Statistik Amerika, 100 (470): 653-668

Jeffrey Evans
sumber
+1 Khusus untuk opsi 4; Karena OP memiliki data lidar, ada baiknya menjalankan metode wavelet pada model permukaan kanopi. Meskipun, seperti yang Anda tahu, metode wavelet belum benar-benar mainstream (atau mungkin pernah).
Aaron
Dalam suatu ode ke ideal satu ukuran untuk semua, saya akan mulai merujuk pada perangkat lunak komersial (mis., ESRI, ERDAS) sebagai perangkat lunak Big-box. Seringkali solusi terbaik, atau tidak ada sama sekali, tidak tersedia di "Perangkat lunak kotak besar". Seringkali kita harus melihat ke arah komunitas pengembangan atau akademis untuk mendapatkan jawaban atas masalah analitis spasial yang kompleks. Ini akan membawa Anda keluar dari arus utama dengan terburu-buru. Untungnya, komunitas ini suka berbagi. Inilah sebabnya mengapa penting bagi seorang analis untuk tidak mengandalkan solusi tombol-tekan.
Jeffrey Evans
2
Saya cenderung setuju tentang BBS untuk masalah spasial yang kompleks. Namun, mengekstraksi satu jenis vegetasi di lingkungan yang gersang - terutama jika Anda memiliki akses ke data Lidar - cukup umum. Dalam hal ini, tidak perlu menemukan kembali roda dengan mengembangkan pendekatan baru untuk identifikasi pohon sederhana. Pikiranku mengapa tidak menggunakan pendekatan tombol-tekan yang telah ditetapkan, terutama dalam paket seperti eCognition, yang sangat cocok untuk otomatisasi?
Aaron
1
Saya harus menambahkan bahwa eCognition memiliki kapasitas untuk ID mahkota individu. Sebagai contoh, Anda dapat menemukan contoh aturan di komunitas eCog yang menggunakan pendekatan penanaman benih - cari "Kumpulan Contoh Aturan Delineasi Pohon Kelapa Sawit". Mengintegrasikan algoritma pencocokan templat baru eCog dan pendekatan penanaman benih ini berpotensi menjadi metode yang sangat kuat.
Aaron
1
Saya tertarik pada kode python yang Anda sebutkan untuk metode Wavelet Smith (2008). Apakah tersedia di mana saja?
Alpheus
3

Untuk membuat DHM, kurangi DEM dari DEM, ini bisa dilakukan di Esri Raster Calculator atau GDAL_CALC . Ini akan menempatkan semua ketinggian Anda di 'bidang permainan level'.

Sintaks (Pengganti jalur lengkap untuk DEM, DSM & DHM):

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

DHM sebagian besar adalah 0 (atau cukup dekat), yang Anda nilai dari nodata Anda. Dengan Raster Calculator atau GDAL_CALC Anda dapat mengekstraksi nilai lebih dari nilai arbitrer berdasarkan jumlah kebisingan yang Anda amati dalam DHM. Tujuan dari ini adalah untuk mengurangi kebisingan dan menyoroti hanya mahkota vegetasi - dalam contoh di mana dua 'pohon' berdekatan ini harus dibagi menjadi dua gumpalan yang berbeda.

Sintaks (Pengganti jalur penuh untuk Binary & DHM dan nilai yang diamati untuk Nilai):

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

Sekarang dengan baik GDAL_CALC atau Esri IsNull membuat raster biner, yang dapat dipoligonisasi dengan GDAL_Polygonize atau Esri Raster to Polygon .

Untuk memperbaiki poligon menghapus poligon terlalu kecil dan kemudian membandingkannya dengan band RGB mencari tanda tangan, di Esri alat Statistik Zonal akan membantu. Kemudian Anda dapat membuang poligon yang jelas tidak memiliki statistik yang benar (berdasarkan eksperimen dan data Anda, saya tidak bisa memberi Anda nilai).

Ini akan membuat Anda mencapai akurasi sekitar 80% dalam merencanakan setiap mahkota.

Michael Stimson
sumber
Terima kasih. Saya akan melihat apakah saya mendapatkan hasil yang baik dari metode ini.
Theodore Jones
Anda harus melakukan beberapa eksperimen untuk mendapatkan nilai yang sesuai, saya sarankan memotong area kecil sebagai sampel yang menunjukkan (mirip dengan) area terbaik / terburuk dalam data Anda. Mungkin perlu setengah lusin sampel berjalan untuk mendapatkan parameter Anda, tetapi itu masih harus lebih baik daripada memplotnya secara manual.
Michael Stimson
3

eCognition adalah perangkat lunak terbaik untuk itu, saya melakukan itu dengan menggunakan perangkat lunak lain tetapi eCognition lebih baik. Berikut ini referensi literatur tentang subjek:

Karlson, M., Reese, H., & Ostwald, M. (2014). Pemetaan Mahkota Pohon di Hutan yang Dikelola (Parklands) di Afrika Barat Semi-Arid Menggunakan Citra WorldView-2 dan Analisis Gambar Berbasis Objek Geografis. Sensor, 14 (12), 22643-22669.

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

Selain itu:

Zagalikis, G., Cameron, AD, & Miller, DR (2005). Penerapan teknik fotogrametri digital dan analisis gambar untuk mendapatkan karakteristik pohon dan tegakan. Jurnal penelitian hutan Kanada, 35 (5), 1224-1237.

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

Giorgos Zagalikis
sumber
Bisakah Anda memperluas mengapa eCognition lebih baik? Jawaban hanya tautan cenderung menjadi tidak berfungsi saat tautan hilang.
Aaron
1
eCognition adalah perangkat lunak analisis gambar berbasis objek lain yang tidak sejak saya sekarang. Saya menggunakan pendekatan serupa. Penerapan teknik fotogrametri digital dan analisis gambar untuk memperoleh karakteristik pohon dan tegakan G Zagalikis, AD Cameron, DR Miller Jurnal Penelitian Hutan Kanada, 2005, 35 (5): 1224-1237, 10.1139 / x05-030 nrcresearchpress.com/doi /abs/10.1139/x05-030#.VJmMb14gAA
Giorgos Zagalikis
1
Terima kasih untuk referensi Giorgos. Saya pikir komentar ini akan berfungsi dengan baik sebagai edit untuk jawaban Anda.
Aaron
3

Saya memiliki masalah yang sama beberapa tahun yang lalu. Saya punya solusi yang tidak memerlukan data LAS yang difilter atau data tambahan lainnya. Jika Anda memiliki akses ke data LiDAR, dan dapat menghasilkan DEMs / DSMs / DHMs (DEM selanjutnya, saya tidak memperdebatkan semantik nomenklatur model permukaan) dari hasil yang berbeda, skrip berikut mungkin berguna.

Script arcpy menelan 3 DEM dan mengeluarkan poligon hutan dan titik pohon. 3 DEM harus memiliki resolusi spasial yang sama (yaitu 1 meter) dan luasan, dan mewakili pengembalian pertama, pengembalian terakhir, dan tanah kosong. Saya memiliki parameter yang sangat spesifik untuk ekstraksi sayuran, tetapi parameternya dapat diubah sesuai dengan kebutuhan lainnya. Saya yakin prosesnya dapat ditingkatkan, karena ini adalah upaya serius pertama saya pada skrip 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")
Barbarossa
sumber
2

Saya memposting ini sebagai jawaban karena batas panjang dalam komentar, tidak ada harapan untuk kredit :). Kuas yang sangat luas, asalkan Anda punya DEM.

  1. Ekstrak DEM untuk setiap poligon ke dem.
  2. Tetapkan ketinggian dem yang ekstrem
  3. Set zCur + = - zStep. Langkah yang harus ditemukan oleh iterasi sebelumnya, misalnya penurunan yang wajar antara ketinggian 'sel atas pohon' dan tetangga
  4. Di bawah = Con (dem => zCur, int (1))
  5. Grup wilayah di bawah ini. Hitung cukup besar, yaitu 'pohon'. Definisi diperlukan di sini oleh inspeksi visual, penelitian pendahuluan?
  6. Ikuti langkah 3 jika zCur> zMin, langkah 1 sebaliknya.

Jumlah maksimum grup dalam proses = jumlah pohon di dalam setiap poligon. Kriteria tambahan, misalnya jarak antara 'pohon' di dalam poligon mungkin membantu ... Perataan DEM menggunakan kernel juga merupakan opsi.

FelixIP
sumber
Saya percaya Anda mengacu pada DSM dan bukan DEM ... Biasanya pohon, struktur dan sampah lainnya tidak membuatnya menjadi DEM tetapi fitur dalam DSM (minus kelas kebisingan). DSM - DEM = DHM (model ketinggian). Semua ini dapat diekstraksi secara wajar dari data LiDAR, bahkan jika itu hanya digolongkan ground / nonground, tetapi jika Anda memiliki DEM dan bukan LAS Anda berada di atas sungai tanpa dayung karena fitur yang Anda cari tidak di sana !
Michael Stimson
Ya, DHM seperti yang Anda jelaskan akan lakukan. Saya tahu sedikit tentang Lidar.
FelixIP