二维码与错觉:人眼和摄像头为何看到的不是同一样东西
人眼「读不出」二维码的原因
人看着二维码,是没办法把里面存的数据读出来的。哪怕明白这片黑白图案代表着某种信息,把图案换算成数值、施加纠错、还原出原本的文字或链接,这一连串处理对人脑来说做不到。
这件事乍看理所当然,但从视觉科学的角度看很有意思。人的视觉系统能瞬间认出文字(拉丁字母、汉字、阿拉伯数字),那是几千年文化学习积累下来的结果。而二维码的图案 1994 年才被发明出来,人的视觉系统还没有获得足够的时间被训练成能「读」这种图案。
理论上说,如果把二维码的规格完整背下来,用肉眼把黑白图案换算成二进制,再用心算完成 Reed-Solomon 码的解码,人也是能「读」二维码的。但即便是版本 1(21×21 模块)这种最小的 QR 码,也有 441 个模块,靠肉眼准确判读它们,在实用层面上几乎不可能。换句话说,把数据藏进图案这件事本身,并不是为了瞒住人,而是为了让机器读得快。
摄像头「看见」二维码的机制
手机摄像头识别二维码的过程,和人类视觉在根本上不一样。摄像头把图像取成像素的阵列,把每个像素的亮度值当作数字来处理。
二维码的识别大致分四步。(1)检测定位图案:从图像里找出 3 个套叠的正方形图案,确定二维码是否存在及其位置。(2)几何校正:把拍摄角度造成的畸变(梯形畸变)修正掉,换算成正面看到的状态。(3)模块采样:把校正后的图像切成格子,根据每一格的亮度值判定黑白。(4)数据解码:把黑白图案转成比特串,施加纠错,还原出数据。
这个流程里最有趣的是第(2)步的几何校正。人从斜侧面看二维码,看到的是被压成梯形的样子,但大脑会自动按「它本来应该是正方形」去修正后再识别。摄像头也做同样的修正,只不过它的办法是数学上的投影变换,与人脑的修正机制完全不同。同样一件「修正畸变」的事,生物的神经回路和数字算法各用自己的方式实现了。
利用错觉的设计二维码
反过来利用人类视觉系统的特性,就能做出「在人眼里像是一幅画、在摄像头看来却是一个二维码」的设计。这是把人类视觉与摄像头识别之间的差异用巧的错觉应用。
赫尔曼栅格错觉的应用:白色栅格线的交叉处会看到灰点,这种「赫尔曼栅格错觉」在二维码的模块阵列里同样会发生。人眼有时会觉得白模块的交叉处泛灰,但摄像头是精确测量亮度值的,完全不受这种错觉影响。设计师可以利用这一点,做出在人眼里带有独特视觉效果、而摄像头依然能准确读取的二维码。
利用颜色恒常性:人的视觉系统具备「颜色恒常性」,即照明条件变化时仍把物体的颜色感知为固定的。但摄像头的传感器没有这个功能,同一个物体的颜色会随照明色温不同而被记录成不同的值。利用这个差异,理论上还能设计出只在特定照明条件下才扫得出来的二维码。不过这类花招都建立在「摄像头不会被人的主观修正带偏」这一前提上,一旦超出手机的自动白平衡能应付的范围,读取就会失败,所以实用场合里几乎不会采用。
色觉多样性与二维码的可访问性
日本约有 5% 的男性(约 300 万人)具有与多数人不同的色觉特性,即「色觉多样性」。对于难以区分红与绿的 P 型、D 型色觉者来说,红底配绿色模块构成的二维码,对比度看上去极低,甚至可能「根本没意识到那里有一个二维码」。
要保障二维码的可访问性,关键是做不依赖颜色的对比设计。具体来说,要让深色模块与浅色模块之间保持足够的亮度差(明度对比),不能只靠色相的区别来撑。实务上的目标是让深色模块与浅色模块的对比度达到 4:1 以上。Web 文字可读性里常提到的 WCAG(Web 内容无障碍指南)4.5:1,是给人眼读文字用的另一套标准,不能直接拿来当二维码能否读取的判定线。配色定下来之后,请把「用实机扫一次确认」也纳入设计流程。
可访问性最好的二维码,就是传统的黑白组合。黑与白的对比度为 21:1,对任何色觉特性的人来说都是最容易分辨的搭配。为了追求设计感而牺牲可访问性,是应当避免的做法。
二维码告诉我们的「看」有多奇妙
二维码是一份触手可及的教材,能让人在日常中体会到人类视觉与计算机视觉的差别。看的是同一片黑白图案,人只能认出「花纹」,摄像头却把它读成「数据」。这个差别提醒我们:「看」这件事并不只是接收光线,而是一套高度复杂的信息处理。
人的视觉系统能瞬间完成识别面孔、读出情绪、把握三维空间这些摄像头至今仍感吃力的任务。反过来,摄像头能准确完成二维码解码、细微图案检测、稳定的亮度测量这些人做不到的任务。两者是用完全不同的路径,实现着「看」这同一件事。下次扫码时不妨留意一下:那一瞬间,你和你的手机其实正在看同一样东西,却各自看见了完全不同的内容。