算法架构

二维码纠错原理:Reed-Solomon 数学详解

您是否好奇过,为什么二维码被撕破、沾上咖啡渍、部分弄脏,甚至中间被公司品牌 Logo 盖住,依然能完美识别?秘密就在于 Reed-Solomon 多项式纠错。

同一网址在 L、M、Q、H 四个纠错级别下的四个二维码,分别涂黑了 7%、15%、25% 和 30% 的面积,用来展示每个级别能恢复多大的损坏

1. 什么是 Reed-Solomon 纠错?

Reed-Solomon(RS)纠错由数学家 Irving S. Reed 和 Gustave Solomon 于 1960 年发明,是一种非二进制循环纠错算法,广泛应用于航天通信(NASA 旅行者号)、CD/DVD 光盘、卫星电视,以及二维码所遵循的 ISO/IEC 18004 标准。

Reed-Solomon 码不只是检测错误(像简单的奇偶校验位或 CRC 校验和那样),它会生成冗余的数学校验块,能够精确定位受损字节模块的位置,并重建原始内容数据,无需重新请求传输。

2. 二维码的 4 个纠错等级

ISO/IEC 18004 标准规定了四个可选的纠错码(ECC)等级。每个等级表示在二维码无法识别之前,全部码字中可以被毁坏或遮挡的百分比:

ECC 等级 恢复能力 码点密度 推荐用途
L 级(低) 约 7% 的数据 密度最低(方块最少) 数字屏幕,以及内容数据量大、二维码又必须保持小巧的场合。
M 级(中) 约 15% 的数据 均衡的标准选择 一般网址、包装、传单和营销印刷品的默认选择。
Q 级(四分之一) 约 25% 的数据 中等密度 最适合自定义 Logo、桌牌以及容易磨损的环境。
H 级(高) 约 30% 的数据 密度最高(方块最多) 户外广告牌、工业标签,以及物理损耗严重的环境。

3. 嵌入 Logo 如何利用纠错能力

当您在二维码中央放置 Logo 或图标时,扫描器的光学传感器会把 Logo 当作表面物理损伤或缺失的码点。

由于 Q 级纠错最多可恢复 25% 的损坏数据,H 级最多可恢复 30%,Reed-Solomon 数学解码器能计算出 Logo 下方缺失的码点,并在几毫秒内重建原始网址。

带 Logo 二维码的黄金法则:

  • 最大面积:Logo 占用的面积绝不要超过二维码总面积的 20% 到 25%。
  • 保护 3 个定位角:绝不要让 Logo 遮住或碰到左上、右上和左下角的三个大方形定位角(码眼)。
  • 使用白色留白:始终在 Logo 周围画一圈纯白的保护边距,防止周围的码点与 Logo 图形混在一起。
  • 自动切换到 Q 级或 H 级:每当您上传自定义 Logo,qr-code.love 都会自动把纠错等级提升到 Q 级或 H 级。

4. 伽罗瓦域 GF(256) 中的数学流程

在您浏览器中运行的编码器,在一个包含 256 个元素的有限域中进行运算,记作 GF(28) 或 GF(256)。每个字节都是该域中的一个元素,乘法按以下本原多项式取模定义:

P(x) = x8 + x4 + x3 + x2 + 1   (十六进制为 0x11D)

数据字节被视为多项式 D(x) 的系数。引擎将其乘以 xE(E 为该等级所需的纠错码字数量),再用该等级固定的生成多项式 G(x) 去除。除法的余数就是校验数据:这 E 个字节会放在二维码中数据的后面。

5. ISO 规定的 8 种掩模图案与罚分计算

纠错码字计算完成后,如果把原始二进制字节直接放进网格,可能会意外形成大片全黑或全白的码点,或者形成会迷惑相机光学传感器的假“定位图案”。

为解决这个问题,ISO/IEC 18004 标准会在网格上应用 8 种候选的 XOR 数学掩模图案。引擎用一套严格的罚分公式为每个加掩模后的候选结果打分:

  • 罚分 1(相邻码点连续):同色码点连续 5 个或以上时加 3 分,超过 5 个的部分每多一个再加 1 分。
  • 罚分 2(2x2 码点块):每个同色 2x2 方块加 3 分。
  • 罚分 3(假定位图案):任何符合 1:1:3:1:1 比例的码点序列加 40 分。
  • 罚分 4(深浅比例失衡):偏离 50/50 平衡时按比例加分。

累计罚分最低的掩模图案会被选中,并编码到定位图案周围的格式信息位中。

6. 应对真实环境损耗的能力

对于会受到风吹日晒或磨损的实体物料,选择合适的纠错等级至关重要:

环境条件 推荐 ECC 典型损坏风险
户外广告牌与金属标牌 H 级(30%) 紫外线褪色、雨水痕迹、锈蚀和鸟粪。
餐厅桌牌与菜单 Q 级(25%) 食物洒落、手指污渍和酒精消毒剂。
产品包装与标签 M 级(15%) 轻微的表面摩擦和搬运刮痕。
数字屏幕与电视播放 L 级(7%) 没有物理磨损;优先追求最少的像素数量。

7. 各版本的数据码字与纠错码字

每个版本的码字数量固定,每个码字 8 位,纠错等级决定其中多少承载您的数据、多少承载恢复数据。前三个版本的情况如下。

版本总数L(数据 + 纠错)MQH
12619 + 716 + 1013 + 139 + 17
24434 + 1028 + 1622 + 2216 + 28
37055 + 1544 + 2634 + 3626 + 44

数据码字并不全是内容数据。最前面的几位存放模式指示符和字符计数,在字节模式下,版本 9 及以下占 12 位,版本 10 起占 20 位。这就是为什么 L 级的版本 1 二维码只能容纳 17 个字节而不是 19 个字节的数据。

在 H 级下,从版本 1 开始恢复数据就多于内容数据。这正是 Logo 选项提高等级时所做的取舍:可用字节更少,换来的是即使被部分覆盖也依然能识别的二维码。

参考来源与延伸阅读

生成带纠错的二维码

选择您需要的 Reed-Solomon 等级(L、M、Q、H),嵌入您的品牌 Logo,服务器不做任何记录。

打开全能生成器