大家好,我正在尝试使用Python将点云(X,Y,Z)转换为灰度图像。我了解到可以通过NumPy数组生成灰度图像。但是现在我手头拥有的是一组包含X、Y和高度信息的点集。我想根据X、Y和灰度值(即高度)生成灰度图像。
是否有人能够给我提供一些思路?谢谢!
Rowen
大家好,我正在尝试使用Python将点云(X,Y,Z)转换为灰度图像。我了解到可以通过NumPy数组生成灰度图像。但是现在我手头拥有的是一组包含X、Y和高度信息的点集。我想根据X、Y和灰度值(即高度)生成灰度图像。
是否有人能够给我提供一些思路?谢谢!
Rowen
谢谢大家。我刚刚完成了自己编写插值代码的工作。但我的想法来自你们的建议。感谢@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()
假设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)
pcolormesh
绘图函数将非常适合你的用例。请参考链接。 - tel