将XYZ点云转换为灰度图像。

4

大家好,我正在尝试使用Python将点云(X,Y,Z)转换为灰度图像。我了解到可以通过NumPy数组生成灰度图像。但是现在我手头拥有的是一组包含X、Y和高度信息的点集。我想根据X、Y和灰度值(即高度)生成灰度图像。

是否有人能够给我提供一些思路?谢谢!

Rowen


你的点存储在哪种格式中? - filippo
@filippo 我有一个 Pandas 数据框,其维度为 X、Y 和 Height,可以很容易地转换为灰度级别。 实际上,这个数据框是通过 pdal 软件包从 las 文件生成的。 - Yun Zhao
点是否均匀分布在所有的x,y空间上?类似于一个表面吗?还是它们是分散的?如果是后者,我会使用高度为颜色的散点图。 - filippo
1
你可能需要查看scipy.interpolate。使用这个模块,你可以构建一个插值2D函数。在像素坐标处评估这个函数将给你灰度图像。 - Paul Panzer
1
你的点云的X,Y坐标是否按照网格布局排列?如果是,那么Matplotlib中的pcolormesh绘图函数将非常适合你的用例。请参考链接 - tel
显示剩余3条评论
2个回答

6

谢谢大家。我刚刚完成了自己编写插值代码的工作。但我的想法来自你们的建议。感谢@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'之类的方法。这是生成的灰度高程图像。 enter image description here 最后,我的问题基本上已经解决。如果您有任何好想法或疑问,请在评论中发表。感谢所有人!
罗文

3

假设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 - Yun Zhao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接