将XYZ点云转换为灰度图像

时间:2018-12-10 05:44:40

标签: python numpy point-clouds lidar

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

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

罗文

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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()

注意到在网格数据中,可以根据您的情况应用诸如'linear','nearest','cubic'之类的方法。 这是生成的灰度高程图像。 enter image description here

最后,我的问题已基本解决。如果您有任何好主意或困惑,请对此信息发表评论。谢谢大家!

罗文

相关问题