繁体   English   中英

将XYZ点云转换为灰度图像

[英]Convert XYZ point cloud to grayscale image

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

有人可以给我一个关于这个的想法吗? 先谢谢。

罗文

让我们假设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)

多谢你们。 我刚刚编写了自己的代码来进行插值。 但我的想法来自你的。 感谢@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中,可以根据您的场景应用“线性”,“最近”,“立方”等方法。 这是生成的灰度高程图像。 在此输入图像描述

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

罗文

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM