1、双眼效应

我们通过双眼观察世界最大的好处就是可以重构三维空间。虽然我们每只眼睛看到的画面都是二维的,但是由于两只眼睛所处位置不同,看到的图像也有所差异,大脑根据经验以及这小小的差异(双眼离被观察物体越远,差异越小)瞬间就可以重构周围的三维世界!这不是人类特有的技能,而几乎是所有捕食动物都具备的技能(由于捕食动物需要追逐猎物,一般双眼都生长在头部的前方,利用双眼效应就可以确定猎物的空间位置了;而被捕食动物需要躲避天敌,一般双眼生长在头部的两侧,即便不转动脑袋也可以观察周围的一切,虽然这样双眼无法定位天敌空间位置,但它们更需要的是提前观察到天敌的靠近;此外,在生物链中,捕食者和被捕食者的角色也不是一成不变的,所以以上结论只适用于大多数情况,也有例外)。这么重要的技能,在智能化越来越高的现代显得尤为重要。比如,三维重建,立体电影和今天要说的三维立体画等,都是对双眼效应的利用。

实际上双耳也有类似的功能。不多说了,好像扯得有点远了。

2、三维立体画

2.1、闲话

第一次看到三维立体画是在90年代的某个周末,记得花了近一个小时才算基本掌握了一种观看方法(平行法)。那时才十岁左右,感觉无比地神奇,无比的兴奋。

前段时间在维基百科上玩耍时,看到此词条,又勾起了童年的回忆……

于是,有了此文。

2.2、三维立体画的原理

引子

利用双眼效应在二维图像上构建三维物体,方法不同就出现了不同的形式的结果:红蓝立体电影,左右立体电影,三维立体画等。

实际上,三维立体画只记录了图像上每点的空间高度。

其基本原理很简单,仅需要初中几何知识就够用了,下面以平行观测法为例作简要介绍。如下图(俯视,即一行像素)所示,$ABCDEFG$是由7个点组成的等距点列,当双眼定焦在图中的“视觉平面”上时,$AB$两点将重合组成一个$H$点,$BC$两点将组成一个I点……

根据相似三角形的性质(或平行线截线段性质),可知$HIJKLM$这6个点在共线,即它们到图像所在平面的距离相等。

Autostereogram11

如果将$EFG$三点向左平移相同的一段距离,则$DE$两点组成的像$K$点将会向双眼靠近,给人的感觉是$K$点从视觉平面上凸起来了,而且移动的距离越大凸起得就越多,但移动距离不能超过点列间距的一半,见下图:

Autostereogram33

虽然这时$LM$两点也向左平移了,但它们并没凸起或凹下,而是仍在视觉平面。

如果只平移$E$点,而不移动$FG$两点,则不是我们想要的效果了。如下图所示:

Autostereogram22

原理

根据上面的介绍, 选择$n+1$个颜色一样的点列${{\left\{ {{P}_{1i}} \right\}}_{n+1}}$,以相同的距离$d$水平排列在纸上,每点占一个像素位置。再在每点右侧一个像素的位置设置另一种相同颜色的点列${{\left\{ {{P}_{2i}} \right\}}_{n+1}}$,直至${{\left\{ {{P}_{di}} \right\}}_{n+1}}$。这样一行像素便设置完了,实际上还可以理解为:选择$d$个颜色不同的一组点,然后将其复制$n$份,依次排列在右侧。

之后每一行像素的设置和上面的相同,这样就得到了一张“母板”图。实际上最简单的方法就是:随机生成一个若干行$d$列的图像,将其复制$n$份,依次排列在右侧,得到一张若干行$\left( n+1 \right)d$列的图像。

把图像想像成$XOY$平面,找一个三维物体的表面位置数据,计算出在点$\left( x,y \right)$处物体的最大高度$z$,以此推算出图像中对应的点列需要如何平移。

另外,需要注意两点:

  1. 对应的点及其所在点列中右侧的点都要平移;
  2. 由于是向左平移,所以要先处理完左侧的像素后再处理它右侧的;
  3.  在编写程序时,很多方面是可以删简的。比如母板,并不需要将每一个像素复制出${n+1}$份。详见程序。

2.3、三维立体画的制作

作为 Mathematica 的爱好者,这里还是用此神器。程序和所需素材已经放在 GitHub 中了,欢迎大家一起改进它,或点此直接下载

2.4、一些小作品(单击放大)

随机点三维立体画

Autostereogram

图像三维立体画

Autostereogram_picture

随机点动态三维立体画

Autostereogram


2016-04-14

文字版

方法类似不多介绍,下面是代码和结果:

Remove["Global`*"]; width = 12;(*单幅宽度*)nw = 6;(*单幅列数*)height = \
50;(*单幅高度*)nh = 1;(*单幅行数*)hxyData = 
 ImageData[
  ColorNegate@
   Binarize[
    Rasterize["闲", RasterSize -> height, 
     ImageSize -> {width nw, height nh}, 
     Background -> White]]];(*在r行c列处点的高度函数*)pm0 = 
 Range[width];(*初始化点的位置信息*)r = nh height; 
Dynamic[Row[{ProgressIndicator[r/nh/height], "\t已完成:", 
     Floor[100 r/nh/height], "%"}]](*显示进度*) randomPoint = 
 RandomChoice[
  CharacterRange["A", "Z"], {height nh, 
   width}];(*随机生成单幅母板*)picString = 
 Table[If[c == 1, pm = pm0]; 
  randomPoint[[Mod[r, height, 1], 
    pm[[Mod[c, width, 1]]] = 
     pm[[Mod[c + hxyData[[r, c]], width, 1]]]]], {r, nh height}, {c, 
   nw width}]; picString = 
 ArrayFlatten[{{randomPoint, picString}}];(*在字符块左侧加一列*)blankStr = 
 StringJoin[
  ConstantArray[" ", 
   Floor[width (nw + 1)/2 - width/2]]];(*空白字符串*)firstLine = 
 blankStr <> "O" <> StringJoin[ConstantArray[" ", width - 1]] <> "O" <>
   blankStr <> "\n";(*首行字符串*)firstLine <> 
 StringRiffle[picString, "\n", ""](*文字三维立体画*)

现在你也可以这样加密了

O           O
WBBPKFAWDDDHWBBPKFAWDDDHWBBPKFWDDDDHWBBPKFWDDDDHWBBPKFWDDDDHWBBPKFWDDDDHWBBPKFWDDDDH
NZFUIGRASUMVNZFUIGRASUMVNZFUIGRSUMVVNZFUIGRSUMVVNZFUIGRSUMVVNZFUIGRSUMVVNZFUIGRSUMVV
CWFGDXDJZOXJCWFGDXDJZOXJCWFGDXDJOXJCWWFGDXDJOXJCWWFGDXDJOXJCWWFGDXJOOXJCWWFGDXJOOXJC
ZKGLCGOUYOXYZKGLCGOUYOXYZKGLCGOUYXYZKGGLCGUYXYZKGGLCGUYXYZKGGLCGUYXYZKGGGLCGUYXYZKGG
IDWICBBTKPGGIDWICBBTKPGGIDWICBBTKGGIDWWICBTKGGIDWWICBTKGGIDWWICBTKGGIDWWWICBTKGGIDWW
LSAQRLBTKRMJLSAQRLBTKRMJLSAQRLBTKRJLSAAQRLBKRRJLSAAQRLBKRRJLSAAQRLKRRJJLSAAQRLKRRJJL
YQKNAYOSEBWUYQKNAYOSEBWUYQKNAYOSEBUYQKKNAYOSEBUYQKKNAYOSEBUYQKKNAYSEEBUYQKKNAYSEEBUY
HMRLDMNPFBHNHMRLDMNPFBHNHMLDDMNPFBHHMMLDDMNPFBHHMMLDDMNPFBHHMMLDDMPFFBHHMMLDDMPFFBHH
YJSJOPKKNXEMYJSJOPKKNXEMYJJOPKKKNXEMYJJOPKKKNXEMYJJOPKKKNXEMYJJOPKKNNXEMYJJOPKKNNXEM
CXKPOSJBDJIUCXKPOSJBDJIUCXPOSJJBDJIUCXPOSJJBDJUCXPOOSJJBDJUCXPOOSJBDDJUCXPOOSJBDDJUC
LSLFWVFBXWBELSLFWVFBXWBELSFWVFFBXWBELSFWVFFBXWELSFFWVFFBXWELSFFWVFBXXWELSFFWVFBXXWEL
YVXTFCSONSHHYVXTFCSONSHHYVTFCSSONSHHYVTFCSSONSHYVVTFCSSONSHYVVTFCSONNSHYVVTFCSONNSHY
OQOQFXNZMQCUOQOQFXNZMQCUOQQFXNNZMQCUOQQFXNNZMQUOQQQFXNNZMQUOQQQFXNZMMQUOQQQFXNZMMQUO
XDGECFZVMBMOXDGECFZVMBMOXDECFZZVMBMOXDECFZZVMBOXDDECFZZVMBOXDDECFZVMMBOXDDECFZVMMBOX
FTFRBCBWHHYAFTFRBCBWHHYAFTRBCBBWHHYAFTRBCBBWHHYFTTRBCBBWHHYFTTRBCBWHHHYFTTRBCBWHHHYF
SAKYMGMTKMPGSAKYMGMTKMPGSAYMGMMTKMPGSAYMGMMTKMPSAAYMGMMTKMSAAAYMGMTKKMSAAAYMGMTKKMSA
FKWGKVDKBMUPFKWGKVDKBMUPFKGKVDDKBUUPFKGKVDDKBUUFKKGKVDDKBUFKKGKKVDKBBUFKKGKKVDKBBUFK
DFRRMRMQRTQADFRRMRMQRTQADFRMRMMQRTADFRMRMMQRTADFRMRMMQRTADFRMRMMMQTAADFRMRMMMQTAADFR
WFLGBOOUAYHLWFLGBOOUAYHLWFGBOOOUAYHLWFGBOOOAYHLWFFGBOOOAYHLWFFGBOOAYYHLWFFGBOOAYYHLW
UBLYSALPXDZNUBLYSALPXDZNUBYSALLPXDZNUBYSALLXDZNUBBYSALLXDZNUBBYSALXDDZNUBBYSALXDDZNU
PWZNHPEKWHKAPWZNHPEKWHKAPWNHPEEKWHKAPWNHPEKWHKAPWWNHPEKWHKAPWWNHPEWHHKAPWWNHPEWHHKAP
GOXBFQAJCCEBGOXBFQAJCCEBGOBFQAAJCCEBGOBFQAJCCEBGOOBFQAJCCEBGOOBFQACCCEBGOOBFQACCCEBG
RIPCWBAWGCWFRIPCWBAWGCWFRICWBAAWGCWFRICWBAWGCCWRICWWBAWGCCWRICWWBAGCCCWRICWWBAGCCCWR
HGTPLJEWDBYFHGTPLJEWDBYFHGPLJEEWDBYFHGPLJEWDBBYHGGLJEWWDBBYHGGLJEWDBBBYHGGLJEWDBBBYH
ANNJFNGCLWMSANNJFNGCLWMSANJFNGGCLWMSANJFGGCCLWMANNJFGCCLLWMANNJFGCLLLWMANNJFGCLLLWMA
XVHQBYEYPGPVXVHQBYEYPGPVXVQBYEEYPGPVXVQYEEEYPGPXVVQYEEYPGPPXVVQYEEPGGPPXVVQYEEPGGPPX
LCUMEQIFBJMCLCUMEQIFBJMCLCMEQIIFBJMCLCEQIIIFBJMLCCEQIIIBJMLCCCEQIIBJJMLCCCEQIIBJJMLC
DOLGWFHMULIXDOLGWFHMULIXDOGWFHHMULIXDOWFFHHMULIDOOWFFHHMLIDOOWWFFHMLLIDOOWWFFHMLLIDO
RQYWXKGTJGGQRQYWXKGTJGGQRQWXKGGTJGGQRWXXKGGTJGQRWWXXKGGTJQRWWXXXKGTJJQRWWXXXKGTJJQRW
EHQYCARIYQSBEHQYCARIYQSBEHYCARRIYQSBEYCCARRIYQBEYYCCARRIYBEYYCCCARIYYBEYYCCCARIYYBEY
RYOYISEZUBCZRYOYISEZUBCZRYYISEEZUBCRYYYISEEZUBRYYYYISEEZUBYYYYYISEZUUBYYYYYISEZUUBYY
VBCSXWUZKCRHVBCSXWUZKCRHVBSXWUUZKCHVBBSXWUUZKCVBBBSXWUUZKCVBBSSXWUZKKCVBBSSXWUZKKCVB
KLMUOGRRSLJXKLMUOGRRSLJXKLUOGRRRSJJXKLUOGRRRSJXKLLUOGRRRSJXKLLUOGRRSSJXKLLUOGRRSSJXK
TGDHVWLTJODSTGDHVWLTJODSTGHVWLLJOODSTGHVWLLJOOSTGGHVWLLJOOSTGGHVWLJOOOSTGGHVWLJOOOST
HAEANJLVPWAQHAEANJLVPWAQHAANJLLVPWAQHAANJLLVPWQHAAANJLLVPWQHAAANJLVPPWQHAAANJLVPPWQH
GCRGEZEEIPVGGCRGEZEEIPVGGCGEZEEEIPVGGCGEZEEEIPGGCCGEZEEEIPGGCCGEZEEIIPGGCCGEZEEIIPGG
OKFDROVSOFALOKFDROVSOFALOKDROVVSOFALOKDROVVSOFLOKKDROVVSOLOOKKDROVSOOLOOKKDROVSOOLOO
LFSDRNGWTDBELFSDRNGWTDBELFDRNGGWTDBELFDRNGGWTDELLFDRNGGWTDELFDRNGGWTTDELFDRNGGWTTDEL
CRFUPDUCXQJGCRFUPDUCXQJGCRUPDUUCXQJGCRUPDUUCXQGCCRUPDUUCXQGCRUPDUUCXXQGCRUPDUUCXXQGC
LTHVSZEGIXFCLTHVSZEGIXFCLTVSZEEGIXFCLTVSZEEGIXFCLTVSZEEGIXFCLTVZEEGIIXFCLTVZEEGIIXFC
YPFSTKUBKRLZYPFSTKUBKRLZYPSTKKUBKRLZYPSTKKUBKRLZYPSTKKUBKRLZYPSTKUUBKRLZYPSTKUUBKRLZ
SLZJZOLRLSMKSLZJZOLRLSMKSLZJZOLRLSMKSLZJZOLRLSMKSLZJZOLRLSMKSLZJZOLRLSMKSLZJZOLRLSMK
ZZKRVAHAQLCUZZKRVAHAQLCUZZKRVAHAQLCUZZKRVAHAQLCUZZKRVAHAQLCUZZKRVAHAQLCUZZKRVAHAQLCU
NUBMRXWNMYJWNUBMRXWNMYJWNUBMRXWNMYJWNUBMRXWNMYJWNUBMRXWNMYJWNUBMRXWNMYJWNUBMRXWNMYJW
BZBQNZKLPGFSBZBQNZKLPGFSBZBQNZKLPGFSBZBQNZKLPGFSBZBQNZKLPGFSBZBQNZKLPGFSBZBQNZKLPGFS
OZNFHRVKXCYSOZNFHRVKXCYSOZNFHRVKXCYSOZNFHRVKXCYSOZNFHRVKXCYSOZNFHRVKXCYSOZNFHRVKXCYS
VHBBZSVPJWGOVHBBZSVPJWGOVHBBZSVPJWGOVHBBZSVPJWGOVHBBZSVPJWGOVHBBZSVPJWGOVHBBZSVPJWGO
IDTSKSEJOTCEIDTSKSEJOTCEIDTSKSEJOTCEIDTSKSEJOTCEIDTSKSEJOTCEIDTSKSEJOTCEIDTSKSEJOTCE
LTJXMMGVMIRHLTJXMMGVMIRHLTJXMMGVMIRHLTJXMMGVMIRHLTJXMMGVMIRHLTJXMMGVMIRHLTJXMMGVMIRH
XGTNEIGETZKTXGTNEIGETZKTXGTNEIGETZKTXGTNEIGETZKTXGTNEIGETZKTXGTNEIGETZKTXGTNEIGETZKT