将2D深度图像/热图转换为3D高度场?

时间:2019-10-10 00:39:53

标签: python python-3.x

我想知道如何将2D深度图像/热图转换为3D高度场。 Z值是2D图像的值。

我有一个RGB图像:

enter image description here

我也有相应的深度图/热图:

enter image description here

我想将它们组合成一个高度字段,其中Z值是深度图像/热图的值:

enter image description here

除了将RGB图像中的RGB值保留在3D高度字段中。

1 个答案:

答案 0 :(得分:0)

您所描述的实际上是向数据集添加另一个维度。有几种方法可以实现这一目标,但请注意,有些方法可能会使其他人感到困惑。您要导出到的其他程序也可能对数据的形状等有很高的期望,因此请检查一下。接下来就是对您要执行的操作的一些想法...

基本上,您要描述的是具有2个数据“属性”:彩色图像(3通道属性)和高度字段(单个“通道”)。一些选项:

  • 将它们保留为2个单独的ndarray。即,图像的3D数组和height字段的2D数组。适当命名它们,并将它们保存在合理的文件结构中。如果我很着急,这就是我会做的事(基本上什么也不做)。
  • 使用h5py将它们都放入HDF5文件中。这种格式本质上类似于带有嵌套“文件夹”的小文件系统,并且允许任意数量的文档和元数据。它还提供了压缩,任意数组访问和其他有用的功能。因此,这对于组织很多(或两个)ndarray非常有用,尤其是当它们很大时。
  • 使用xarray这基本上是n维pandas,可让您将两个数组存储在单个数据结构中。对于这种用例来说,它不是理想的选择,但它至少可以让您标记轴,因此您可以清楚地知道4个“通道”是什么。
  • 为数据制作一个Python class这样,您可以准确记录两个数组的含义,并编写一些方法来将它们绘制在一起。可以对类实例进行腌制并将其保存到磁盘,或者您可以编写方法以任意方式保存它们(例如HDF5)。如果我要做很多事情,并且需要一个健壮的,可持续的解决方案,那我将要做。

这是课程的外观:

class BumpImage():
    """
    An image with a 3d height field attached.
    """
    def __init__(self, photo, height):
        if photo.ndim == 2:
            # Make greyscale image into RGB.
            photo = np.repeat(photo[:, :, None], 3, axis=-1)
        self.photo = photo
        if height.shape == photo.shape[:2]:
            self.height = height
        else:
            raise TypeError("Height must be 2d array")

    def size(self):
        return self.height.shape

    def plot(self, ax=None):
        # Make a 3d plot with matplotlib or whatever.
        return ax

    def save(self, fname):
        # Make HDF5 file called fname.
        return

我不会做的事情:

  • 将高度通道堆叠到NumPy中的其他3个通道上,以制作单个4通道“图像”。我想说这是个坏主意,因为没有方便的方法来记录您在NumPy中所做的事情。
  • 尝试以某种方式(例如,例如以高度场表示为山影或以3D视图等形式绘制的图。再次很难分开这两个数据集。