5

如何使用 MATLAB 从 2D 图像创建 3D 立体图像?

4

2 回答 2

11

要么我误解了你的问题(人们已经指出它不清楚),要么你误解了 3D 视觉的工作方式。您不会“使用 3D 玻璃查看 2D 图像”。3D 视觉是通过分别为左眼和右眼提供两个不同的图像(左图像和右图像)来实现的。从根本上讲,MATLAB 与它没有任何关系。

因此,在没有易于理解或连贯的问题的情况下,我能做的最好的就是假设您想要这样的东西您拥有的是单个 2D 图像,但您仍然希望“看到 3d 图像格式”。在这种情况下,您需要以某种方式将该单个图像拆分为两个新图像:

  1. 左眼的左图
  2. 右眼的正确图像

这不是微不足道的。通常,您首先推断 2D 图像中每个像素的深度。由于您正在“猜测”深度信息,因此这两个新图像不会完美地表示 3D 场景。

接下来,您使用该深度信息将图像分成层。它基本上看起来像儿童读物中的弹出式剪裁:

替代文字

你能想出的层数越多,你的深度估计就越准确,你的 3D 表示就会越真实。

最后,您将分层表示从两个不同的位置投影回 2D - 一个用于左眼,一个用于右眼。这为您提供了所需的两个不同图像。

编辑

您链接到的第二个视频描述了通常称为立体图像的简化创建。它需要 3D 红青眼镜——这不是他们现在在大多数 3D 影院中使用的偏光眼镜。我说简化的原因是它不区分前景和背景。

为了获得最佳效果,您应该将前景与背景分开,并将该方法仅应用于前景。这是因为背景通常具有无限的深度,并且在从单声道到立体视觉时不会改变。就钢琴而言,一切或多或少都是前景,所以这种方法有效。

视频描述的算法是:

  • 从两个图像开始,im1然后im2. 它们是相同的
  • 将绿色和蓝色通道设置im1为零。这将创建红色图像
  • 将红色通道设置im2为零。这将创建青色图像。
  • 将两个图像偏移一些指定的量(取决于对象的深度),例如im1在左侧和im2右侧。您需要正确获取此顺序,因为 3D 红青色眼镜左侧为红色,右侧为青色。
  • 执行两个移位图像的元素相加。请注意,没有通道会饱和。

这是我写的一些 Python/OpenCV 代码:

import cv
SHIFT=8

if __name__ == '__main__':
    import sys
    _, fname = sys.argv
    im  = cv.LoadImage(fname)

    size = cv.GetSize(im)
    width, height = size
    left  = cv.CreateImage(size, im.depth, im.nChannels)
    right = cv.CreateImage(size, im.depth, im.nChannels)
    anaglyph = cv.CreateImage((width - SHIFT, height), im.depth, im.nChannels)

    #
    # This would be easier if we had COI support for cv.Set, but it doesn't
    # work that way.
    # OpenCV uses BGR order (even if input image is greyscale):
    # http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html
    # red goes on the left, cyan on the right:
    # http://en.wikipedia.org/wiki/Anaglyph_image
    #
    b = cv.CreateImage(size, im.depth, 1)
    g = cv.CreateImage(size, im.depth, 1)
    r = cv.CreateImage(size, im.depth, 1)
    cv.Split(im, b, g, r, None)

    zeros = cv.CreateImage(size, r.depth, 1)
    cv.Merge(zeros, zeros, r, None, left)
    cv.Merge(b, g, zeros, None, right)

    #
    # cvRect is ( x, y, width, height ) and it MUST be a tuple, not a list
    # 
    cv.SetImageROI(left,  ( SHIFT, 0, width - SHIFT, height ))
    cv.SetImageROI(right, ( 0,     0, width - SHIFT, height ))
    cv.Add(left, right, anaglyph, None)

    cv.SaveImage('anaglyph.jpeg', anaglyph)

这是与视频中使用的图像类似的图像:

替代文字

这是输出:

替代文字

不幸的是,我没有 3D 红青色眼镜来验证它是否有效。但它似乎应该,至少在理论上。如果我犯了错误,也许有人可以纠正我。

于 2011-01-18T12:58:24.653 回答
0

如果您有两张从稍微不同的角度拍摄的图像,这会容易得多。您可以通过校正这两个图像来创建立体浮雕。相关功能在计算机视觉系统工具箱中estimateUncalibratedRectifiationstereoAnaglyph请参阅未校准立体图像校正示例。

或者,您可以使用Stereo Camera Calibrator 应用程序校准您的相机,然后使用该recifyStereoImages功能。请参阅立体校准和场景重建

于 2015-01-03T03:12:46.713 回答