【问题标题】:Detect tree height and crown width in numpy array检测 numpy 数组中的树高和树冠宽度
【发布时间】:2017-07-02 15:26:35
【问题描述】:

我有一个 3D-LiDAR pointcoud 代表一棵树,它使用 laspy 包加载到 python 中。它现在存储为一个 numpy 数组。我的目的是通过找到具有最高 z 值的点来计算树的高度,并计算到其下方最低 z 值的距离。 所以我通过以下方式导入数据:

inFile = laspy.file.File("~/DATA/tree.las", mode='r')
point_records = inFile.points

目前,我通过以下方式计算高度:

min = inFile.header.min
max = inFile.header.max
zdist = max[2] -min[2]

问题是这样,我没有考虑地形的坡度。如何索引恰好低于最高点的点?

【问题讨论】:

  • 只用两点之间的欧式距离?
  • 这就是我想做的,但我很难找到这些点。我更新了问题。
  • 所以,基本上这不是一个 numpy 问题,而是一个问题,你的数据是什么样子的。你能解释一下格式吗?
  • 还有:“下面”是什么意思?垂直于世界坐标还是沿最高点下平面的表面法线?
  • 数据存储为一个 numpy 数组,三列分别代表经度、纬度和海拔米 (xyz)。下面我的意思是最低 z 点与最高 z 点具有相同的 long/lat 值,以确保我只计算树的实际高度。

标签: python numpy lidar laspy


【解决方案1】:

这只是一个盲目的猜测,因为对于一个好的答案,缺少很多信息。

假设我们有一个由 (x,y,z) 组成的 3 个点的数组

A = [1,2,3]

B = [1,2,4]

C = [0,1,2]。

我们已将 A 点确定为 z 中的最大值,并且其经纬度为

lat = 1
long = 2

基本上,您会遍历点列表并过滤掉所有要查看的点,然后取最小的点。下面是一种直接的方法,使用 for 循环。这对于速度来说并不理想。 np.where() 和花哨的索引可以使用,更容易更快地做到这一点,但这更具可读性和可调整性:

import numpy as np
# This is some test data, with three data points
a = np.array([[1,2,3],[1,2,4],[0,1,2]])
# Now we define the lat and long we want to get
filter_x = 1
filter_y = 2
filtered_points = []
for i in range(a.shape[0]): # iterating through all points
    if a[i][0] == filter_x and a[i][1] == filter_y: 
        filtered_points.append(a[i][2]) # Append z of point to list
print min(filtered_points) # print minimum

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多