QR码原理详解

整篇文章中所有截图插入进来的表和图片都用黄色文本做了标记,其他没有直接插入进来的表和图片请在下方链接资源中查找:
资源一:QRCode国家标准.doc
资源二:QRCode 二维码编码解码标准附录.pdf

简介:QR 码是二维码的一种,QR来自英文 “Quick Response” 的缩写,即快速反应的意思,源自发明者希望 QR 码可让其内容快速被解码。它是在1994年由日本的原昌宏研究小组发明的,最初应用在汽车生产、追溯方面,如今已成为众多二维码种类中应用最为广泛的一种。

QR码的显著优点
1.存储内容大
QR码存储内容的多少与其版本有关,版本越高其可存储的内容也就越多,看上去也就越复杂。
有关QR版本与存储量可参考链接资源一中的表7~11

2.存储内容类型丰富
QR码支持存储多种语言和数字、字母,如中文、英文、德文、韩文等,由于QR码是日本研发的二维码,因此更适合处理日文字母和汉字。在日语处理方面,每一个全角字母和汉字都用13bit的数据处理,效率较高,与其他二维码相比,可以多存储20%以上的信息。

3.占用空间小
QR码在二维空间中处理数据,在处理相同信息量的条件下,QR码所占空间为条形码的十分之一左右。另外QR码还有一种类型叫Micro QR码,可以在更小空间内处理存储数据。

4.抗污损能力强
QR码具有“纠错功能”。即使编码变脏或破损,也可在一定程度上恢复数据。它提供了4种纠错等级,随着纠错等级的提高,可恢复的码字比例也随之增加。有关QR码纠错特性可参考链接资源一中的表13~22。

5.容易读取
每一个版本的QR码中都有三个寻像图形,因此无论从哪个方向进行扫码,都可以不受背景样式的影响,实现快速稳定的读取。

6.支持数据合并功能
QR码可以将数据分割为多个编码,最多支持16个QR码。使用这一功能,还可以在狭长区域内打印QR码。另外,也可以把多个分割编码合并为单个数据。

文章目录

  • QR码版本
  • QR码的结构
    • 寻像图形&位置探测图形
    • 位置探测图形分隔符
    • 定位图形
    • 校正图形
    • 格式信息
    • 版本信息
    • 扩展图形
  • QR码的编码流程
    • 数据分析
    • 数据编码
    • 纠错编码
    • 构造最终信息
    • 在矩阵中布置模块
    • 掩膜
    • 格式和版本信息

QR码版本

QR码共有40种版本(版本1~版本40),其中版本1的模块数为21×21,随后每增加一个版本,每边的模块数各增加4,因此版本40的模块数为177×177。

QR码的结构

一个 QR 码可以分为两个部分:功能图形和编码区域。
QR码原理详解_第1张图片

为了更加方便的说明QR码每个部分的结构,这里用版本7来进行展示。
版本7的模块数为45×45,行列数坐标均从0开始计算。
图1:QR码为版本7时的结构
QR码原理详解_第2张图片

寻像图形&位置探测图形

作用:协助扫描软件定位 QR 码并转换坐标系。
寻像图形包括三个相同的位置探测图形,分别位于整个图形中的左上角、右上角、左下角,每个位置探测图形由7×7个模块组成。符号中其他地方遇到类似图形的可能性极小,因此可以在视场中迅速地识别可能的 QR 码符号。当版本号越高时,寻像图形在整个图案中所占比例越小。
寻像图形在图1中呈现为黑色区域。

位置探测图形分隔符

作用:区分功能图形和编码区域。
每个位置探测图形和编码区域之间有宽度为 1 个模块的分隔符。位置探测图形分隔符在图1中显示为灰色区域,此区域应全为空白,不能填入数据。

定位图形

作用:确定符号的密度和版本,提供决定模块坐标的基准位置。
定位图形在图1中显示为茶色区域,水平和垂直的定位图形分别始于第6行和第6列(行、列由0开始计数)。
!!! 但是由于坐标(6,6)在前者已经用黑色表示为位置探测图形,所以在此没法再用茶色表示。但是请记住,(6,6)才是定位图形的开始坐标。另外,第6行和第6列中有6个水绿色的部分也是定位图形。
定位图形由深色与浅色模块交替组成,其开始和结尾都是深色模块。

校正图形

作用:在图像有一定程度损坏的情况下,译码软件可以通过它同步图像模块的坐标映像。
校正图形的数量视符号和版本号而定,版本1没有校正图形,版本2及以上均含有校正图形。
校正图形的具体位置参考链接资源二的附录E。
例如在版本7中,中心模块行/列坐标值为6,22,38。则表示中心模块可能出现在(6,6),(6,22),(6,38),(22,6),(22,22),(22,38),(38,6),(38,22),(38,38)这几个位置中。由于(6,6),(6,38),(38,6)这三个位置都摆放了位置探测图形。所以中心模块只可能出现在剩下的6个坐标中。
校正图形在图1中显示为水绿色区域,它是固定的参照图形,每个校正图形由5×5模块组成。因此只要知道了中心模块的坐标即可推出校正图形的具体位置。

格式信息

作用:用于存放纠错等级和掩模信息。
格式信息在图1中显示为深蓝色区域,是一个 15 位数据,由 2位纠错指示符 + 3位掩模图形参考 + 10位纠错码组成。
图1中,左下角格式信息编号8的上方有一个模块的橙色区域,此区域永远为深色模块,不用于存放任何信息。

版本信息

作用:用于存放 QR 码的版本号。
版本信息在图1中显示为红色区域,是两个3×6的模块。

扩展图形

扩展图形在图1中显示为红框区域。
这些图形最初目的是用于将来对QR码的功能的扩展,并不用于对数据的编码。扩展图形由位于符号的右下角的一个4个模块组成的方块以及位于符号右边和下边的一些8个模块的块组成。8个模块的块的数目取决于符号的版本,可根据下式计算:
8模块的扩展块的数目=2 (N DlV 2),其中N为版本号,DIV表示除法运算。
对序号为奇数的符号版本,第一个8模块扩展图形应排列在17行至20行的右端,和17列至20列的下部。后续图形应排列在行/列的25至28,33至36等的末端/底部,在扩展图形之间剩余一个8模图形的块作为编码区的一部分。
对序号为偶数的符号版本,第一个8模块扩展图形应排列在13行至16行的右端,和13列至16列的下部。后续图形应排列在行/列的21至24,29至32等的末端/底部,在扩展图形之间剩余一个8模图形的块作为编码区的一部分。
详细说明参见链接资源二中的页码34。

QR码的编码流程

①数据分析(确定要进行编码的字符类型,选择所需的版本信息和纠错等级)
②数据编码(采用既定规则,数据字符转换为位流,加必要符号,后将位流转换为码字)
③纠错编码(生成纠错码字到数据码字后)
④构造最终信息(按规定将每一块中置入数据和纠错码字,必要时加剩余位)
⑤在矩阵中布置模块(将寻像图形、分隔符、校正图形与码字,按规则排列,放入二维码矩阵)
⑥掩膜(用8种掩模图形依次对符号的编码区域的位置图进行掩模处理,评价所得的8种结果,选择最优的一种)
⑦格式和版本信息(生成版本信息和格式信息,构成符号)

表二是 QR 码可表示的数据类型及其相应的模式指示符。
表三列出了各版本及模式所对应的字符计数指示符的长度。
QR码原理详解_第3张图片
接下来我将使用一个例子来说明QR码的编码过程

数据分析

确定编码的字符类型、版本信息和纠错等级。

字符类型:数字模式 “01234567”
版本信息:版本1
纠错等级:H

数据编码

Step1:数据字符转换为位流
将要表示的数字从左边开始每三位分为一组,然后将每组数据转换为10 位长度的二进制。如果最后一组数字只剩两位,则使用7 位长度的二进制表示最后两个数字。如果最后一组数字只剩一位,则使用4位长度的二进制表示最后一个数字。最后将这些二进制数据连接起来并在前面加上模式指示符和字符计数指示符。

012 / 345 / 67
012–>0000001100(转换为10 位长度的二进制,加粗部分的0是为了凑够10位长度补的,下同)
345–>0101011001(转换为10 位长度的二进制)
67–>1000011(!!由于最后一组只剩下两位数字,因此将它转换为7位长度的二进制)

数字位流:0000001100 0101011001 1000011(把所有数据连接起来)

根据上面表2 数字模式下的指示字符为0001
根据上面表3 采用版本1时,数字模式下字符计数指示符的位数为10。“01234567”共有8位数字,需将数字位数的8转换为10位长度的二进制。
8–>0000001000(这串二进制就是字符计数指示符)

数据最终位流为:【模式指示符 + 字符计数指示符 + 数字位流】
0001 + 0000001000 + 0000001100 0101011001 1000011

这里只展示数字模式下的转换过程,其他模式下的转换可参考资源一链接中的讲解。

终止符:符号的数据结尾由紧跟在最后一个模式段后面的终止符序列 0000 表示,当数据位流数量正好填满符号容量时,它可以省略,或者当符号所余的容量不足 4 位时它可以截短。
QR码各版本符号的数据容量参考资源一链接中的表一,版本7的数据容量为196。

Step2:加必要符号,此时容量足够,可以在数据位流结尾加上终止符。
00010000001000000000110001010110011000011 + 0000

Step3:位流转换为码字
将Step2中数据位流每8位一组划分,不足8位则在末尾补0。
00010000 / 00100000 / 00001100 / 01010110 / 01100001 / 10000000
则生成了6个码字

此时需要到资源一链接中查找表7~11,版本1,纠错等级为H的情况下,数据码字数为9。由于Step3只生成了6个码字,因此还有3个码字是空的。此时需要交替填充码字 11101100 和 00010001,直至填满 9 个码字。
00010000 / 00100000 / 00001100 / 01010110 / 01100001 / 10000000 / 11101100 / 00010001 / 11101100

纠错编码

纠错码字是用数据码字除纠错码多项式所得到的余数。
通过查询资源一中表13~22可知版本为1,纠错等级为H的情况下,纠错码字数为17。每一块的纠错代码为(26,9,8),说明:(c,k,r)中c=码字总数,k=数据码字数,r=纠错容量。
因此可知码字总数为26,数据码字数为9,纠错码字数为17。
QR 码的纠错使用 Reed–Solomon 编码,有关 Reed–Solomon 码在此不做说明,这部分就自己去研究哈。

在之前我们已经生成了数据码字:
00010000 00100000 00001100 01010110 01100001 10000000 11101100 00010001 11101100
十六进制表示形式为:0x10, 0x20, 0x0C, 0x56, 0x61, 0x80, 0xEC, 0x11, 0xEC
十进制表示数为:16,32,12,86,97,128,236,17,236

接下来通过工具来生成–>生成多项式工具生成纠错码字:
在第一个框内输入9个数据码字的10进制表示(16,32,12,86,97,128,236,17,236),在第二个框内输入纠错码字数17。
得到结果:14 157 2 200 194 148 243 167 173 141 226 10 244 165 43 172 223
它们用十六进制数可表示为:0x0E 0x9D 0x02 0xC8 0xC2 0x94 0xF3 0xA7 0xAD 0x8D 0xE2 0x0A 0xF4 0xA5 0x2B 0xAC 0xDF

到此,26个码字全部生成完成–>0x10 0x20 0x0C 0x56 0x61 0x80 0xEC 0x11 0xEC 0x0E 0x9D 0x02 0xC8 0xC2 0x94 0xF3 0xA7 0xAD 0x8D 0xE2 0x0A 0xF4 0xA5 0x2B 0xAC 0xDF
其中,前 9 个为数据码字,后 17 个为纠错码字。

构造最终信息

按如下步骤构造最终的码字序列(数据码字加上纠错码字,必要时加上剩余码字)。

  1. 根据版本和纠错等级将数据码字序列分为n块。
  2. 对每一块,计算相应块的纠错码字。
  3. 依次将每一块的数据和纠错码字装配成最终的序列:数据块1旳码字;数据块2的码字;数据块3的码字;以此类推至数据块n-1的最后的码字;数据块n的最后的码字;随后,纠错块1的码字,纠错块2的码字,…以此类推至纠错块n-1的最后的码字;纠错块n的最后的码字。
    由表可知,例题中1—H版本的数据码字序列为1块,不需要分开,故无需构造最终信息。
    QR码原理详解_第4张图片

在矩阵中布置模块

图2 展示了数据码字填写时的走位。
QR码原理详解_第5张图片
Step2:符号字符的布置
在 QR 码符号的编码区域中,符号字符以 2 个模块宽的纵列从符号右下角开始布置,并自右向左,且交替地从下向上或从上向下安排。具体走位路线如上图。
由于在“纠错编码”步骤中,已经生成好了最终的数据码字:0x10 0x20 0x0C 0x56 0x61 0x80 0xEC 0x11 0xEC 0x0E 0x9D 0x02 0xC8 0xC2 0x94 0xF3 0xA7 0xAD 0x8D 0xE2 0x0A 0xF4 0xA5 0x2B 0xAC 0xDF
此时将这26个16进制数转换为8位数的二进制,按照图2中的路线依次填入到对应位置即可。
以下图3橙色区域是已经填好的数据码字,浅色代表0,深色代表1。
QR码原理详解_第6张图片

掩膜

QR 码中如果出现大面积的空白或黑块,会导致扫描器识别困难。为了让 QR 图形看起来尽可能凌乱,且尽可能避免位置探测图形中的位图 1011101 的出现,需对 QR 图形进行掩模操作,步骤如下:

  1. 掩模不用于功能图形及格式图形:寻像图形、定位图形、校正图形、位置探测图形分隔符、格式信息和版本信息。
  2. 数据码字与掩模图形进行异或操作后再进行绘制。
  3. 对每个结果图形的不合要求的部分记分,以评估这些结果。
  4. 选择得分最低的图形。

掩模图形是通过将编码区域(不包括格式信息和版本信息)内那些条件为真的模块定义为深色而产生的。i 代表模块的行的位置,j 代表模块的列的位置,其中i和j均从0开始。
表23 可参考链接资源一中的表23。
QR码原理详解_第7张图片
图4模拟了用掩模图形参考000到111的掩模结果
QR码原理详解_第8张图片
掩模数据是将图3中橙色区域的数据信息分别与图4中8种情况下的紫色部分进行异或操作得到的,掩模的最终结果为图5中的粉色区域。
图5.1 掩膜为000
QR码原理详解_第9张图片
图5.2 掩模为001
QR码原理详解_第10张图片
图5.3 掩模为010
QR码原理详解_第11张图片
图5.4 掩膜为011
QR码原理详解_第12张图片
图5.5 掩膜为100
QR码原理详解_第13张图片
图5.6 掩膜为101
QR码原理详解_第14张图片
图5.7 掩膜为110
QR码原理详解_第15张图片
图5.8 掩膜为111
QR码原理详解_第16张图片

格式和版本信息

Step1:计算出纠错码和格式信息
表25此表参考链接资源一中表25
QR码原理详解_第17张图片
表25可知,纠错等级为H的二进制指示符为10。
在此假设我们选择的掩模图形参考为 011(掩模图形可从000~111中选择)。

将 2位纠错指示符 + 3位掩模图形参考,得到 5 位数据码,并使用 BCH(15,5) 编码计算得到纠错码。BCH(15,5) 表示 BCH 码总长度为 15 位,其中数据码为 5 位,纠错码 10 位。
BCH 码使用的是生成码:10100110111(0x0537)。使用数据码除以生成码,所得余数就是纠错码。

①2位纠错指示符 + 3位掩模图形参考–>10 + 011
②由于BCH码总长度为15,需将10011凑够15位,于是–>100110000000000(在数据后方补0凑齐15位)得到数据码
③纠错码=100110000000000 ÷ 10100110111后的余数
即为0111000010
④2位纠错指示符 + 3位掩模图形参考 + 10位纠错码即为最终格式信息码
–>10 + 011 + 0111000010(0x4DC2)

Step2:格式信息的掩模
作用:确保纠错等级和掩模图形参考合在一起的结果不全是 0。
在此需将15位格式信息码与掩模图形 101010000010010(0x5412)进行异或运算(异或运算即两数相同则为0,两数不同则为1)。

格式信息码 1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 (0x4DC2)
掩模图形 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 (0x5412)
异或结果 0 0 1 1 0 0 1 1 1 0 1 0 0 0 0 (0x19D0)

将掩模后的格式信息按照图1中蓝色区域的序号填入对应位置。注意顺序!!数字是倒着填入的,即末尾数字对应编号0,开头数字对应编号14,并且编号是从0开始的。

对应位 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
格式信息 0 0 1 1 0 0 1 1 1 0 1 0 0 0 0

Step3:计算版本信息
使用 BCH(18,6) 编码计算得到纠错码。原理同Step1,BCH(18,6) 表示 BCH 码总长度为 18 位,其中数据码为 6 位,纠错码 12 位。
版本信息的计算和格式信息类似,也是使用长除法。只是这一次使用的生成码为:1111100100101(0x1F25),使用数据码除以生成码,所得余数就是纠错码。
由于整篇文章中采用的例子是版本1,而版本1无需绘制版本信息。因此暂时使用版本7来进行版本信息生成的讲解。
①将版本号7转换为6位长度的二进制数据码
7–>000111
②由于这里的BCH码总长度为18,需将000111凑够18位,于是–>000111000000000000(在数据后方补0凑齐18位)得到数据码
③纠错码=0011100000000000 ÷ 1111100100101后的余数
即为110010010100
④6位数据码 + 12位纠错码即为最终版本信息码
–>000111 + 110010010100(0x7c94)
!!与格式信息不同,版本信息码生成后不再需要单独进行掩模运算。
⑤将结果分别填入左下角和右上角的版本信息中,注意顺序!!数字是倒着填入的,即末尾数字对应编号0,开头数字对应编号17,并且编号是从0开始的。

对应位 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
版本信息 0 0 0 1 1 1 1 1 0 0 1 0 0 1 0 1 0 0

版本信息的模块布置参考链接资源一中的图21。

QR码原理详解_第18张图片
这篇文章中的例子采用的掩模为011,因此最终结果参考图5.4,而正是因为图5中的8张图采用不同的掩模,所以格式信息(绿色区域)就出现了不同的情况。这8张图扫描出来的结果都为01234567,但是经过评估,最终结果取掩模为001的数据,即图5.2是最终结果。将图5.2中的二维码转换为黑白二维码,就得到了下图的结果。
QR码原理详解_第19张图片
到此QR码的编码流程就全部结束了!

参考博客:QR码详解(上)
QR码详解(下)

你可能感兴趣的:(原理类,算法)