矩阵背后的工程
对于普通用户来说,二维码只是一个由黑白像素组成的杂乱方块。但从工程角度来看,Denso Wave 1994 年的发明堪称几何、信号处理和纠错数学领域的大师级作品。
与仅表示沿单个轴的一串数字的标准线性条形码不同,QR 码是一个动态的、自校正的坐标系。以下是它们如何运作、它们的结构标记如何对齐相机以及使它们在恶劣条件下保持可读性的高级数学背后的确切技术逻辑。
1. 方向的几何形状:查找器和对齐模式
QR 码最容易识别的部分是位于角落的三个大嵌套方块。这些在技术上称为查找器模式。
文字 取景器图案比率(跨任何角度): [黑色] [白色] [黑色] [白色] [黑色] 1:1:3:1:1
为什么恰好有三个 Finder 模式?
在二维坐标几何中,需要三个不同的点来定义平面在空间中的比例、旋转和倾斜:
- 旋转(朝上): 由于第四个角(右下角)缺少图案,扫描仪立即知道图像是上下颠倒还是侧向,并以数字方式旋转数据网格。
- 缩放(距离): 三点之间的物理距离告诉相机传感器代码到底有多远,允许软件缩放数字网格以匹配。
- 透视/倾斜(角度): 如果从锐边角度扫描二维码,这三个点会形成一个不均匀的三角形,而不是一个完美的直角三角形。扫描仪在读取数据之前使用扭曲的角度以数学方式“校正歪斜”并使图像变平。
1:1:3:1:1 扫描比例
查找器图案被构造为嵌套的 $7\times7$ 模块方块。无论激光或相机传感器以什么角度扫过这些正方形的中心,黑色、白色和黑色模块的比例在数学上总是恒定的:1 部分黑色,1 部分白色,3 部分黑色,1 部分白色,1 部分黑色。
由于这种特定的几何比例几乎不会自然地出现在文本或图形中,因此相机可以在几毫秒内将三个角从复杂的视觉背景中分离出来。
较小的内部方块有什么用?
随着 QR 码版本大小的增长(从版本 2 到版本 40),它们包含了更小的单嵌套方块,称为 对齐模式。
当二维码打印在弯曲表面(如汽水罐)上或物理扭曲在起皱的纸质传单上时,整个网格会变形。对齐图案充当局部锚点。扫描仪使用它们动态地重新校准扭曲表面上的坐标网格,确保一个角的变形不会破坏代码其余部分的可读性。
2. 数据如何编码:将二进制映射到芯片
从本质上讲,QR 码是二进制代码的物理转换。相机的图像传感器将光吸收暗模块记录为二进制“1”,将光反射光模块记录为二进制“0”。
在渲染之前,输入数据(例如 URL)通过四种编码模式之一进行处理:
- 数字: 最适合原始数字(将 3 位数字映射为 10 位)。
- 字母数字: 支持大写字母、数字和基本符号(将 2 个字符映射为 11 位)。
- 字节: 标准 UTF-8 编码(每个字符都转换为其标准 8 位二进制表示形式)。
- 汉字: 针对双字节日语字符进行了优化。
对于像 https://ez-qr-generator.com 这样的标准 URL,生成器使用字节模式。该字符串被转换为 8 位字节序列,然后从右下角开始物理映射到网格上,向上和向下锯齿形,同时跳过结构模式。
3. Reed-Solomon 纠错:重建损坏的数据
QR 码的显着特征是即使在部分撕裂、脏污或模糊的情况下也能进行扫描。这种可靠性是由 [Reed-Solomon 纠错](https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_ Correction) 驱动的——与用于从深空探测器(如 Voyager)传输数据并保持音乐在有划痕的音频 CD 上播放的完全相同的基于多项式的数学。
生成 QR 码时,系统不仅仅会写入您的 URL。它将二进制数据字节视为复杂数学多项式方程的系数。使用这些系数,生成器计算额外的冗余“奇偶校验字节”并将它们附加到数据的末尾。
根据所选的纠错级别,这些奇偶校验字节占据网格的不同百分比:
- L 级(低): 恢复高达 7% 的丢失数据。
- M 级(中): 恢复高达 15% 的丢失数据。
- Q 级(四分位数): 恢复高达 25% 的丢失数据。
- H 级(高): 恢复高达 30% 的丢失数据(强烈建议用于带有居中徽标的自定义样式代码)。
当手机扫描损坏的代码时,读取软件会将幸存的像素输入多项式公式中。由于 [Reed-Solomon 码](https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_ Correction) 的数学特性,扫描仪可以求解缺失的变量,定位损坏像素的确切坐标,并以数学方式重建原始 URL,而无需干净的视觉图像。
4.隐藏步骤:数学掩码模式
如果 QR 码自然包含大的、不间断的全黑或全白模块块,则光学扫描仪很容易丢失其在网格上的位置。扫描仪需要在暗模块和亮模块之间频繁转换,以保持内部读取时钟同步。
为了防止出现大块单色,QR 码规范采用八种数学屏蔽模式。
文字 掩码公式示例(掩码 0): 如果满足以下条件,则对像素应用 XOR:(行 + 列) % 2 == 0
生成器使用 XOR 运算(根据数学网格公式反转指定像素)通过所有八个屏蔽公式运行原始 QR 代码。
为了决定使用哪个掩码,生成器根据严格的罚分评分系统评估八个结果:
- 罚分1: 行或列中连续五个或更多相同颜色的模块扣分。
- 罚分2: 任何$2\times2$相同颜色的方块都会扣分。
- 罚分 3: 对于类似于 1:1:3:1:1 取景器图案的图案扣分(以避免扫描仪混淆)。
- 罚分 4: 如果黑白模块的整体比例明显偏离完美的 50/50 分割,则扣分。
惩罚分数最低的掩模将永久应用于网格。然后,该特定掩码(0 到 7)的标识符将直接写入查找器模式旁边的元数据模块,准确告诉扫描应用程序使用哪个数学公式来反转掩码并读取底层数据。