원격 감지 데이터 (시각적 이미지 및 LiDAR)에서 트리 크라운 영역 추출


13

원격 감지 이미지를 처리하고 이미지에서 개별 트리의 크라운 영역을 추출하는 방법을 찾고 있습니다.

시각 파장 영역 이미지와 해당 지역의 라이더 데이터가 있습니다. 문제의 위치는 사막 지역이므로 나무 덮개는 숲 지역만큼 조밀하지 않습니다. 항공 사진의 해상도는 0.5 피트 x 0.5 피트입니다. 라이다 해상도는 약 1 x 1 피트입니다. 시각적 데이터와 라이더는 모두 애리조나 주 피마 카운티에서 왔습니다. 내가 보유한 항공 사진 유형의 샘플은이 게시물의 끝에 있습니다.

이 질문 은 ArcMap에서 단일 트리 감지? 같은 문제인 것 같지만 좋은 대답은없는 것 같습니다.

Arcmap에서 Iso Cluster 분류를 사용하여 해당 지역의 식생 유형 (및 전체 퍼센트 덮개에 대한 정보)의 합리적인 분류를 얻을 수 있지만 개별 트리에 대한 정보는 거의 제공하지 않습니다. 내가 원하는 것에 가장 가까운 것은 Arcmap의 Raster to Polygon 피처를 통해 isocluster 분류의 결과를 전달한 결과입니다. 문제는이 방법이 나무 근처에서 단일 다각형으로 병합된다는 것입니다.

편집 : 아마도 내가 가진 것에 대해 더 자세히 설명했을 것입니다. 내가 가진 원시 데이터 세트는 다음과 같습니다.

  • 완전한 las 데이터와 그로부터 생성 된 tiff raster
  • 시각적 이미지 (표시된 샘플 이미지와 같지만 훨씬 넓은 영역을 덮음)
  • 해당 지역의 나무 하위 집합을 직접 측정합니다.

이것들로부터 나는 생성했다 :

  1. 지면 / 식물 분류.
  2. DEM / DSM 래스터

항공 사진 샘플


링크보다 더 많은 데이터가 있습니다. 분류 된 las 파일 또는 DEM / DSM 래스터 (어느 파일이 있습니까?)가 있습니까? 그건 정말 정확성의 정도와 단지 시각적 파장이 작업을 수행하는 것은 쉽지 않다.
Michael Stimson

아마도 내가 가진 것에 대해 더 자세한 내용을 포함했을 것입니다. 내가 가지고있는 원시 데이터 세트는 다음과 같습니다 : 1. 전체 라스 데이터 및 그로부터 생성 된 강성 래스터 2. 시각적 이미지 (표시된 샘플 이미지와 같지만 더 넓은 영역을 덮음) 3. 나무의 하위 집합을 수동으로 직접 측정 지역. 이것들로부터 나는 : 1. 땅 / 식물 분류 2. DEM / DSM 래스터
시어 도어 존스

eCognition에 액세스 할 수 있습니까? 그렇지 않은 경우 어떤 이미지 처리 소프트웨어 또는 프로그래밍 언어에 액세스하거나 알고 있습니까?
Aaron

eCognition의 사본이 없지만 실험실 / 대학에서 아는 사람이이 유형의 물건에 인기가있는 것으로 보이는지 확인할 것입니다. 저는 Python, C 및 Java에 대해 잘 알고 있습니다. 나는 Matlab의 사본을 가지고 있지만 나는 그것에 꽤 멍청하다. 이 목록의 softwarelicense.arizona.edu/students 와 ArcGIS 에 액세스 할 수 있습니다.
Theodore Jones

내가 가지고있는 상용 응용 프로그램에서 조금 더 자세히 설명합니다. 내가 링크 한 소프트웨어 목록에있는 일부는 Matlab, Mathematica, JMP 및 기타 통계 도구 및 Visual Studio와 같은 소프트웨어 개발 도구입니다.
Theodore Jones

답변:


10

스펙트럼 및 라이더 데이터의 개별 크라운 검출에 관한 상당한 문헌이 있습니다. 현명한 방법은 아마도 다음과 같이 시작하십시오.

Falkowski, MJ, AMS Smith, PE Gessler, AT Hudak, LA Vierling 및 JS Evans. (2008). 침엽수 림 캐노피가 lidar 데이터를 사용하는 두 개의 개별 트리 측정 알고리즘의 정확도에 미치는 영향. 원격 감지의 캐나다 저널 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), 파이썬으로 코딩했지만 매우 느립니다. Matlab 경험이있는 경우 프로덕션 모드에서 구현됩니다. NAIP RGB-NIR 이미지를 사용한 웨이블릿 방법을 사용하여 오리건 동부에서 약 6 백만 에이커의 주니퍼 침식을 확인한 두 개의 논문이 있습니다.

Baruch-Mordo, S., JS Evans, J. Severson, JD Naugle, J. Kiesecker, J. Maestas 및 MJ Falkowski (2013) 나무에서 현자 구루 저장 : 후보자의 주요 위협을 줄이기위한 사전 예방 적 솔루션 생물 보존 167 : 233-241

Poznanovic, AJ, MJ Falkowski, AL Maclean 및 JS Evans (2014) 주니퍼 우드랜드의 트리 탐지 알고리즘의 정확도 평가. 사진 측량 및 원격 감지 80 (5) : 627–637

다중 분해능 가우시안 프로세스를 사용하여 응용 수학 상태 공간 문헌에서 일반적인 객체 분해에 대한 몇 가지 흥미로운 접근법이 있으며, 규모에 따라 객체 특성을 분해합니다. 나는 이러한 유형의 모델을 사용하여 생태 학적 모델에서 멀티 스케일 프로세스를 설명하지만 이미지 객체 특성을 분해하도록 조정할 수 있습니다. 재미 있지만 약간 난해합니다.

Gramacy, RB 및 HKH Lee (2008) Bayesian treed Gaussian 프로세스 모델은 컴퓨터 모델링에 적용됩니다. 미국 통계 협회 저널, 103 (483) : 1119–1130

Kim, HM, BK Mallick 및 CC Holmes (2005)는 조각 별 가우스 프로세스를 사용하여 정지되지 않은 공간 데이터를 분석합니다. 미국 통계 협회 저널, 100 (470) : 653–668


+1 옵션 4의 경우 특히; OP에는 lidar 데이터가 있으므로 캐노피 표면 모델에서 웨이블릿 방법을 실행하는 것이 좋습니다. 아시다시피, 웨이블릿 방법은 아직 주류가 아닙니다.
Aaron

원-사이즈-적합한 이상에 대한 대가로, 상용 소프트웨어 (예 : ESRI, ERDAS)를 Big-box 소프트웨어로 언급 할 것입니다. 종종 "빅 박스 소프트웨어"에서 최상의 솔루션을 구할 수 없습니다. 복잡한 공간 분석 문제에 대한 답을 찾기 위해 개발 또는 학계에 관심을 가져야하는 경우가 종종 있습니다. 이것은 급히 주류에서 당신을 데리고 간다. 다행히도 이러한 커뮤니티는 공유하는 것을 좋아합니다. 따라서 분석가가 푸쉬 버튼 솔루션에 의존하지 않는 것이 중요합니다.
Jeffrey Evans

2
복잡한 공간 문제에 대해서는 BBS에 동의하는 경향이 있습니다. 그러나 건조한 환경, 특히 라이더 데이터에 액세스 할 수있는 경우 단일 유형의 초목을 추출하는 것이 꽤 주류입니다. 이 경우 간단한 트리 식별에 대한 새로운 접근 방식을 개발하여 휠을 다시 발명 할 필요가 없습니다. 제 생각에는 미리 설정된 푸시 버튼 방식, 특히 자동화에 매우 적합한 eCognition과 같은 패키지를 사용하지 않는 이유는 무엇입니까?
Aaron

1
eCognition에 개별 크라운 ID를 수용 할 수있는 용량을 추가해야합니다. 예를 들어, eCog 커뮤니티에서 종자 재배 접근 방식을 사용하는 샘플 규칙 세트를 찾을 수 있습니다. "오일 팜 트리 묘사 샘플 규칙 세트"를 검색하십시오. eCog의 새로운 템플릿 매칭 알고리즘과이 시드 증가 접근 방식을 통합하는 것은 잠재적으로 매우 강력한 방법 일 수 있습니다.
Aaron

1
Smith (2008) Wavelet 방법에 대해 언급 한 파이썬 코드에 관심이 있습니다. 어디서나 사용할 수 있습니까?
Alpheus

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 (또는 거의 근접)이므로 nodata 값을 만듭니다. 래스터 계산기 또는 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 밴드와 비교하면 영역 통계 도구 가 도움이됩니다. 그런 다음 정확한 통계가없는 다각형을 버릴 수 있습니다 (실험과 데이터를 바탕으로 값을 줄 수는 없습니다).

이를 통해 개별 크라운을 플롯 할 때 약 80 %의 정확도를 얻을 수 있습니다.


감사. 이 방법으로 좋은 결과를 얻을 수 있는지 살펴 보겠습니다.
Theodore Jones

적절한 값을 얻으려면 약간의 실험을 수행해야합니다. 작은 영역을 데이터에서 가장 우수하거나 가장 나쁜 영역을 나타내는 샘플로 클리핑하는 것이 좋습니다. 매개 변수를 가져 오는 데에는 샘플 실행이 6 십 회가 걸릴 수 있지만 수동으로 플롯하는 것보다 여전히 낫습니다.
Michael Stimson

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

또한 :

Zagalikis, G., Cameron, AD 및 Miller, DR (2005). 트리 및 스탠드 특성을 도출하기 위해 디지털 사진 측량 및 이미지 분석 기술을 적용합니다. 캐나다 산림 연구 저널, 35 (5), 1224-1237.

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


왜 eCognition이 더 나은지에 대해 확장 해 주시겠습니까? 링크가 사라지면 링크 만 응답하지 않는 경향이 있습니다.
Aaron

1
eCognition은 객체 기반 이미지 분석 소프트웨어입니다. 나는 비슷한 접근법을 사용했다. 나무 사진 및 특성 분석을위한 디지털 사진 측량 및 이미지 분석 기법 적용 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
참조 Giorgos 주셔서 감사합니다. 이 의견은 귀하의 답변을 편집하는 데 효과적이라고 생각합니다.
Aaron

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. dem의 고도 극한을 정의하십시오
  3. zCur + =-zStep을 설정하십시오. 사전에 반복에 의해 발견되는 단계, 예를 들어 'tree top cell'고도와 이웃 사이의 합리적인 하락
  4. 아래 = Con (dem => zCur, int (1))
  5. 아래의 그룹 지역. 충분히 나무, 즉 '나무'를 세십시오. 육안 검사, 예비 연구에 필요한 정의?
  6. zCur> zMin이면 3 단계로, 그렇지 않으면 1 단계로 이동하십시오.

프로세스의 최대 그룹 수 = 개별 다각형 내부의 트리 수 추가 기준, 예를 들어 다각형 내에서 '트리'사이의 거리가 도움이 될 수 있습니다 ... 커널을 사용한 DEM 스무딩도 옵션입니다.


나는 당신이 DEM이 아닌 DSM을 언급한다고 생각합니다 ... 일반적으로 나무, 구조 및 기타 쓰레기는 그것을 DEM으로 만들지 않지만 DSM (마이너스 노이즈 클래스)의 기능입니다. DSM-DEM = DHM (높이 모델). 지상 / 비 지상으로 만 분류 된 경우에도 LiDAR 데이터에서이 모든 것을 합리적으로 추출 할 수 있지만, DEM이 있고 LAS 가 아닌 경우 뒤 따르는 기능이 없기 때문에 패들없이 크릭입니다 거기 !
Michael Stimson

그래, DHM은 당신이 설명한대로 할 것입니다. 나는 Lidar에 대해 거의 알지 못한다.
FelixIP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.