如何在python中绘制XYZ数据点以在RGB中创建深度图像

如何在python中绘制XYZ数据点以在RGB中创建深度图像,python,numpy,matplotlib,python-imaging-library,open3d,Python,Numpy,Matplotlib,Python Imaging Library,Open3d,我正在做一个小项目,在那里我得到了一个XYZ数据的2D数组。以这种方式: a = [[1,7,13,3,4], [6,21,32,11,2]] 其中x表示数组的列,y表示数组的行,z表示数组的内容,即距离。我试图完成的是使用2d阵列并以RGB绘制深度图像。更详细地说,距离z值越近,我希望将点绘制为红色。随着距离z值的增加,我想根据距离的大小绘制黄色、绿色或蓝色 为了更好的澄清,我添加了一个示例图片。 我正试图用python实现这一点。我试图研究它,但大多数时候我发现如何从深度图像或

我正在做一个小项目,在那里我得到了一个XYZ数据的2D数组。以这种方式:

a = [[1,7,13,3,4],
     [6,21,32,11,2]]
其中x表示数组的列,y表示数组的行,z表示数组的内容,即距离。我试图完成的是使用2d阵列并以RGB绘制深度图像。更详细地说,距离z值越近,我希望将点绘制为红色。随着距离z值的增加,我想根据距离的大小绘制黄色、绿色或蓝色

为了更好的澄清,我添加了一个示例图片。

我正试图用python实现这一点。我试图研究它,但大多数时候我发现如何从深度图像或点云提取XYZ数据,而不是使用XYZ数据绘制深度图像

请让我知道这是否可行,或者有哪些python库可以实现这一点

多谢各位


编辑:我相信它可能有助于注意到2D阵列由测距仪传感器生成的点云数据组成。我希望能够使用数据点构建扫描区域的静态2d图像。我还想利用彩色贴图来可视化图像的深度。

这是怎么回事

from matplotlib.pylab import plt
a = [[1,7,13,3,4],
     [6,21,32,11,2]]
plt.matshow(a, cmap=plt.cm.viridis)
plt.colorbar()
您可以传递大型数组,例如图像。在这里,我使用matplotlib中的一个示例图像,我剪辑颜色以获得120560而不是1205603数组,并显示它:

from matplotlib.pylab import plt
from matplotlib.cbook import get_sample_data
fn = get_sample_data("logo2.png", asfileobj=False)
img = plt.imread(fn, format='png')[...,0] #get single color channel
plt.matshow(img,cmap=plt.cm.jet,interpolation='bicubic')#see imshow for more arguments
plt.colorbar()

如果我没有弄错的话,plt.matshow是plt.imshow的一个子类,与此类似吗

from matplotlib.pylab import plt
a = [[1,7,13,3,4],
     [6,21,32,11,2]]
plt.matshow(a, cmap=plt.cm.viridis)
plt.colorbar()
您可以传递大型数组,例如图像。在这里,我使用matplotlib中的一个示例图像,我剪辑颜色以获得120560而不是1205603数组,并显示它:

from matplotlib.pylab import plt
from matplotlib.cbook import get_sample_data
fn = get_sample_data("logo2.png", asfileobj=False)
img = plt.imread(fn, format='png')[...,0] #get single color channel
plt.matshow(img,cmap=plt.cm.jet,interpolation='bicubic')#see imshow for more arguments
plt.colorbar()
如果我没有弄错的话,plt.matshow是plt.imshow的一个子类,这里有一个使用seaborn的示例:

生成示例数据:

def func(x, y):
    return np.exp(-x**2-y**2)

xaxis = np.linspace(-1, 1, 100)
yaxis = np.linspace(-1, 1, 200)
result = func(xaxis[:,None], yaxis[None,:])
绘图:

sns.heatmap(result, cmap=sns.color_palette("Spectral_r", as_cmap=True))
plt.yticks([],[])
plt.xticks([],[])
结果: 以下是使用seaborn的示例:

生成示例数据:

def func(x, y):
    return np.exp(-x**2-y**2)

xaxis = np.linspace(-1, 1, 100)
yaxis = np.linspace(-1, 1, 200)
result = func(xaxis[:,None], yaxis[None,:])
绘图:

sns.heatmap(result, cmap=sns.color_palette("Spectral_r", as_cmap=True))
plt.yticks([],[])
plt.xticks([],[])
结果:

您是否知道每个图像点的距离,只需查找,还是必须根据坐标计算距离?有关的知识也会派上用场。一个非常有趣的工具是查看器。如果你觉得它有用,我可以帮你做一个脚本示例。@T先生我不知道每个点之间的距离应该是多少,但我假设它大约是1毫米左右。谢谢你给我指点彩色地图。发现它很有用。@mathfux-pptk看起来很有希望。我感谢你的帮助。我目前正在调查,看看是否能找到答案。谢谢。我投票反对pptk@Han显然是个初学者,这个问题在matplotlib中使用imshow有一个简单而标准的解决方案。现在不是被一个晦涩难懂的0.1.1库和薄弱的文档所包围的时候。你知道每个图像点的距离,只是寻找,还是必须根据坐标计算距离?有关的知识也会派上用场。一个非常有趣的工具是查看器。如果你觉得它有用,我可以帮你做一个脚本示例。@T先生我不知道每个点之间的距离应该是多少,但我假设它大约是1毫米左右。谢谢你给我指点彩色地图。发现它很有用。@mathfux-pptk看起来很有希望。我感谢你的帮助。我目前正在调查,看看是否能找到答案。谢谢。我投票反对pptk@Han显然是个初学者,这个问题在matplotlib中使用imshow有一个简单而标准的解决方案。现在不是陷入一个晦涩难懂的0.1.1库、文档不足的时候。@Mecgrad是的,你是对的。然而,我将使用的数据可能包含10000多个数据点,当一起构建时,将给我一个图像。因此,我不确定这是否是可行的方法,因为每个像素的大小都很大,但颜色映射表示对我来说是正确的。谢谢。@Han像素的大小很大,因为数组只由几个值组成。我增加了一个更高的分辨率example@QuangHoang我认为matshow是imshow的一个子类。imshow可能有不同的预设,否则它应该是相同的。@Mecgrad是的,你是对的。然而,我将使用的数据可能包含10000多个数据点,当一起构建时,将给我一个图像。因此,我不确定这是否是可行的方法,因为每个像素的大小都很大,但颜色映射表示对我来说是正确的。谢谢。@Han像素的大小很大,因为数组只由几个值组成。我增加了一个更高的分辨率example@QuangHoang我认为matshow是imshow的一个子类。imshow可能有不同的预设,否则应该相同。