这张图片里藏着一个立体的鲨鱼,你能看出来吗?图片来源:Fredhsu/Wikipedia
为了写这篇文章,小编眼睛差点废了。

撰文 | 王昱
审校 | 冬鸢

如果你一直有看科普杂志的习惯,那么你一定见到过一类密密麻麻的图片。杂志往往会告诉你,经过适当的练习,你可以从这些平面图片中看到明显的立体图像

将左眼视野中左边的点,和右眼视野中右边的点重合,你应该能看出一个骑着扫把的魔女(bad apple)。图片来源:Matoi647

并非所有人都能从这样的图像中看出立体的形状,小编也曾是其中的一员。小编一度认为自己被骗了,但实际上当年的杂志并没有说谎,这真的是一种立体图像。掌握好观察方法后,大多数人都能从中看出立体图像。



双目立体视觉

人是通过双目视觉建立立体感的。我们在观察外界时,远处近处的物体在两只眼睛中的视角有轻微差别,我们的大脑会将一只眼睛中的一组点,和另一只眼睛中的一组点相匹配,从两组点的视差推测出远近关系,从而形成立体视觉。

左侧为正常观察方式,右侧为立体图的观察方式,也叫平行眼。图片来源:Hyacinth/wikipedia

一些最基础的平面立体图(Stereogram)就利用了这种原理。这种图片往往是左右并排的两张图片,在观察这种图片时需要放松眼睛,两眼平行向前看,让左右两张图片分别在左右眼中处在同样的位置——也就是平行眼。当你成功做到这一点时,视野中心就会出现一幅非常立体的画面,并且在它左右会分别有一张图像,总计三张图像。左右轻晃手机,立体感可能会更明显。不过千万记得不要去看左右两侧的图像,因为一旦主动看两侧的图像,你很可能不由自主地将两只眼睛再次锁定到平面上——也就看不到所谓的立体感了。

传统立体图,可以用平行眼观看。图片来源:public domain

当然,就算是这种最基础的立体图像,想要看出立体的感觉也并不容易。所以可以用两只目镜隔开眼睛的视野——今天的虚拟现实(VR)也不过只是把目镜背后的相片换成了显示器而已。

还有很多类似的获得立体视觉的方式,例如3D电影会用不同偏振光投射两幅视角不同的电影画面,我们再用偏振镜片让左右眼分别看到视角不同的电影内容。如果你在观影途中摘下3D眼镜,就会发现荧幕上的画面是两幅画面形成的重影。

不过,这些从一个平面上获得立体视觉的方式都还算好理解,我们仍没有解开文章开头时提出的问题,那些花花绿绿,密密麻麻的图片,怎么才能从中看出立体的感觉?



随机立体点图

1959年,美国贝尔实验室的视觉神经科学家Bela Julesz在此前立体图的基础上,开发出了一种使用随机点的新的立体图。在此前的立体图中,左右两幅画面几乎都是实拍,或者是仿照现实世界绘制的内容。但在他构建的立体图中,左右两幅画面中只有随机分布的点。但如果你用之前观察正常立体图的方法来观察这样的随机点立体图(Random dot stereogram),就能从中看到一个凸起的方块。

你可以用平行眼从这张图中看出一个凸起的方块。图片来源:Otuyama/wikipedia

Bela Julesz制作立体图的过程分为以下几步:

首先,先随机生成一张点图,然后将其左右复制一份。

图片来源:Otuyama/wikipedia

接着,选中立体图中的一个方形区域,将其向水平偏移1或2个点的距离。

图片来源:Otuyama/wikipedia

最后,再用随机点填充空出来的像素,图片便制作完成。

这样,就能通过像素点的偏移来模拟双眼视察,从而产生立体视觉。随机点立体图没有传统立体图中的现实物体,随机分布的点图中也没有明确的边界。当时,许多视觉科学家认为立体视觉需要每只眼睛对图像的可见轮廓进行预先分析,但随机点立体图则证明,就算图像中没有任何可见轮廓,也可以产生立体视觉。间谍飞机在高空侦察时,地面目标往往会盖上迷彩伪装网,而间谍飞机只需要在飞行路线上连续拍摄同一处的照片,就能利用与随机点立体图相同的原理识别地面上的起伏。

随机点立体图已经很接近我们印象中那些花花绿绿无法理解的立体图了,然还有一个关键的问题没有解决:这些随机立体图都是左右两张图像,而我们之前看到的立体图,都只有单一的一张图像。



自动立体图

接下来,让我们用刚才的平行眼看下面这张图。

图片来源:flolian’s blog

如果是用之前的平行眼观察,就会发现中间一排的硬币更深。因为中间一排的间距更大,就会被我们的平行眼识别成更远的物体。也就是说,在立体图中,想要让一个东西变得更远,我们只需要让它偏移更远的距离。

上世纪70年代,Bela Julesz的两名学生,利用这个原理,再结合Bela Julesz提出的随机点立体图,制作了自动立体图(Autostereogram,或许“自立体图”是更贴切的译名)。1989年,他们在还制作出了生成自动立体图的程序,并将其原理整理成论文发表。

为了制作立体图,我们首先要知道你想呈现怎样的立体效果,而立体效果可以用深度图(depth map)表示。深度图是一种单色的图片,图片中单个像素的数值就表示该点距离的远近,程序也就可以根据立体图中每个像素的数值,决定随机底图偏移的程度。

立体图制作时,需要用下方的深度图决定上方底图的偏移距离。图片来源:Fredhsu/Wikipedia

如果你看到这里,仍然看不出来立体图中鲨鱼的样子,可以参考这张动图中的样子。它就是交错显示两张不同偏移量的自动立体图,让你更直观的感受到立体的感觉。

动起来总能看清楚了吧。图片来源:Fredhsu/Wikipedia

不过,就算你还是看不出来文章开头的立体图,也不必太过沮丧。小编也是经过几天的突击,猜终于学会了立体图的看法,但仍算不上熟练,又时也会感到眼花缭乱……说到底这也不是什么大不了的技能,只是了解这些能给生活增添更多乐趣。


参考链接:
https://en.wikipedia.org/wiki/Autostereogram
https://link.springer.com/article/10.3758/BF03202884
https://zhuanlan.zhihu.com/p/24992977
https://en.wikipedia.org/wiki/Béla_Julesz
https://flothesof.github.io/making-stereograms-Python.html
https://github.com/Matoi647/autostereogram

作者 环球科学

《环球科学》杂志