【问题标题】:Convert XYZ point cloud to grayscale image将 XYZ 点云转换为灰度图像
【发布时间】:2018-12-18 06:13:13
【问题描述】:

每个人 我正在尝试使用 python 将点云(X、Y、Z)转换为灰度图像。我了解到灰度图像可以由 Numpy 数组生成。但我现在拥有的是一组包含 X、Y 和高度的点。我想根据 X、Y 和灰度值(即高度)生成灰度图像。

有人可以给我一个想法吗? 先谢谢了。

罗文

【问题讨论】:

  • 您将积分存储到哪种格式?
  • @filippo 我有一个熊猫数据框,其尺寸为 X、Y 和高度,可以轻松转换为灰度级。实际上,数据框是由 las 文件中的 pdal 包生成的。
  • 点在所有 x,y 空间上是否均匀分布?像表面的东西?或者他们是分散的?如果是后者,我会使用高度为颜色的散点图
  • 您可能需要查看scipy.interpolate。使用此模块,您可以构建一个插值 2D 函数。在像素坐标处评估此函数将为您提供灰度图像。
  • 您的点云的 X、Y 坐标是否布置在网格上?如果是这样,pcolormesh plotting function from Matplotlib 将非常适合您的用例。

标签: python numpy point-clouds lidar


【解决方案1】:

谢谢,伙计们。我刚写完自己的代码来做插值。但我的想法来自你的。感谢@asaflotz 和@Paul Panzer。

事情是在我的场景中,点云中的点排列得不好。两个相邻点之间的间隔不均匀。直接使用网格是不可能的。所以我在Scipy.Interpolate 中选择了一个非结构化方法,它有很多实用的方法可以根据不同的用例使用。我下面的代码是来自Scipy.Interpolate.griddata 的示例的修改版本。

x_range=((df.X.max()-df.X.min()))
y_range=((df.Y.max()-df.Y.min()))
grid_x, grid_y = np.mgrid[df.X.min():df.X.max():(x_range*1j), df.Y.min():df.Y.max():(y_range*1j)]
points = df[['X','Y']].values
values = df['new'].values
grid_z0 = griddata(points, values, (grid_x, grid_y), method='linear').astype(np.uint8)
im=Image.fromarray(grid_z0,'L')
im.show()

注意到在 griddata 中,可以根据您的场景应用 'linear'、'nearest'、'cubic' 等方法。 这是生成的灰度高程图像。

最后,我的问题基本解决了。如果您有任何好的想法或困惑,请在这篇文章中发表评论。谢谢大家!

罗文

【讨论】:

    【解决方案2】:

    让我们假设 X、Y 排列成一个网格(这是构建矩形图像所必需的)。从那里这很容易:

    import numpy as np
    import matplotlib.pyplot as plt
    
    # generate some data
    ax = np.arange(-9, 10)
    X, Y = np.meshgrid(ax, ax)
    Z = X ** 2 + Y ** 2
    
    # normalize the data and convert to uint8 (grayscale conventions)
    zNorm = (Z - Z.min()) / (Z.max() - Z.min()) * 255
    zNormUint8 = zNorm.astype(np.uint8)
    
    # plot result
    plt.figure()
    plt.imshow(zNormUint8)
    

    【讨论】:

    • 感谢您的想法。我的问题已经按照你的想法解决了。--Rowen
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多