Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-14, 20:13   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 如何使用带有图像工具的MATLAB创建3D立体图像?

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



回答:

我是在误解您的问题(人们已经指出这一点尚不清楚),或者您是在误解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/le...ncv-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红青色眼镜来验证它是否有效。但似乎至少在理论上应该如此。如果我犯了一个错误,也许有人可以纠正我。



更多&回答...
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 03:21


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.