二维码的生成与识别
大学最后一次课程设计,居然是数字图像处理。可以想象有多为难,对于一个普通的二本学生来说,这无疑是一个挑战。好在老师对我们放低了要求,可以站在巨人的肩膀上,可以从网上down别人的代码,但是一定要弄懂。我们组选择题目的是二维码的生成与识别。完成这个课设才发现平常生活中随处可见的二维码居然这么复杂。果然不了解就没有发言权啊。
下面我就把我总结的关于二维码的相关知识点分享一下。
二维码
二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。
二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。
二维码的结构
1、版本信息:version1(21*21),version2,…,version40,一共40个版本。版本代表每行有多少模块,每一个版本比前一个版本增加4个码元,计算公式为(n-1)*4+21,每个码元存储一个二进制0或者 1。1代表黑色,0表示白色。比如,version1表示每一行有21个码元。
2、格式信息:存储容错级别L(7%),M(15%),Q(25%),R(35%)。容错:允许存储的二维码信息出现重复部分,级别越高,重复信息所占比例越高。目的:即使二维码被图标遮住一部分,一样可以获取全部二维码内容。有图片的二维码, 图片不算二维码的一部分,它遮住一部分码元,但还是可以扫描到所有内容。
3、码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误,就是说当码元被图片遮住,可以通过纠错码字来找回)。
4、位置探测图形、位置探测图形分隔符、定位图形,校正图形:用于对二维码的定位。位置探测图形用于标记矩形大小,3个图形确定一个矩形。定位符是因为二维码有40个版本尺寸,当尺寸过大后需要有根标准线,不然扫描的时候可能会扫歪。
具体的二维码结构如图1-1所示。
图:1-1二维码结构示意图
二维码的生成过程
信息按照一定的编码规则后变成二进制,通过黑白色形成矩形。
- 数据分析:确定编码的字符类型,按相应的字符集转换成符号字符; 选择纠错等级,在规格一定的条件下,纠错等级越高其真实数据的容量越小。
格式 |
容量 |
数字 |
最多7089字符 |
字母 |
最多4296字符 |
二进制数(8 bit) |
最多2953字节 |
日文汉字/片假名 |
最多1817字符(采用Shift JIS) |
中文汉字 |
最多984字符(采用UTF-8) |
中文汉字 |
最多1800字符(采用BIG5) |
- 数据编码:将数据字符转换为位流,每8位一个码字,整体构成一个数据的码字序列。其实知道这个数据码字序列就知道了二维码的数据内容。
- 纠错编码:按需要将上面的码字序列分块,并根据纠错等级和分块的码字,产生纠错码字,并把纠错码字加入到数据码字序列后面,成为一个新的序列。
纠错等级 |
纠错水平 |
L |
7%字码修正 |
M |
15%字码修正 |
Q |
25%字码修正 |
H |
30%字码修正 |
在二维码规格和纠错等级确定的情况下,其实它所能容纳的码字总数和纠错码字数也就确定了,比如:版本10,纠错等级时H时,总共能容纳346个码字,其中224个纠错码字。就是说二维码区域中大约1/3的码字时冗余的。对于这224个纠错码字,它能够纠正112个替代错误(如黑白颠倒)或者224个据读错误(无法读到或者无法译码),这样纠错容量为:112/346=32.4%。
4.构造最终数据信息:在规格确定的条件下,将上面产生的序列按次序放如分块中。按规定把数据分块,然后对每一块进行计算,得出相应的纠错码字区块,把纠错码字区块 按顺序构成一个序列,添加到原先的数据码字序列后面。
5.构造矩阵:将探测图形、分隔符、定位图形、校正图形和码字模块放入矩阵中。
6.掩摸:将掩摸图形用于符号的编码区域,使得二维码图形中的深色和浅色(黑色和白色)区域能够比率最优的分布。
7.格式和版本信息:生成格式和版本信息放入相应区域内。
二维码的识别
1、定位图形:首先寻找探测图形,就是二维码上的三个方块。这三个方块的作用就是不管在哪个方向扫描图形,都可以扫到,不信可以将手机翻转测试一下。在通过二维码上的定位图形和分隔符确定二维码信息的图像。定位图形确定二维码符号中模块的坐标,二维码中的模块都是固定的,包括校正图形,版本信息,数据和纠错码。分隔符呢,就是将探测图形与二维码信息图像分开。
2、灰度化二维码信息像素:手机拍到的图像都是彩色的,所以拍摄到二维码也不列外,它也是彩色的,只不过除了黑白,其他颜色非常浅而已。灰度化是指通过颜色的深浅来识别二维码,就是说颜色深的按深灰处理,浅色的按浅灰处理,去掉其他颜色。
3、去掉二维码信息像素的噪点:相机的传感器在把光线作为接收信号和输出过程产生的粗糙像素,这些粗糙的像素是照片中不应该出现的干扰因素。噪点就是指这些粗糙的像素。
4、二值化二维码信息像素:二值化是说将图像上像素灰度值设置为0或者255,也就是变成只有黑白两种颜色。第一步已经灰度化变成只有深灰和浅灰两种颜色,现在二值化是将深灰变成黑色,浅灰变成白色。为什么变成黑白色呢。因为二维码图像其实是由二进制的0或者1组成,0代表白色,1代表黑色。二维码在二值化时会将二维码图像变成只有黑白色的条码,然后根据解析公式什么的(因为像素是0-255之间,要全部转变成0或者255,估计得经过一些计算,然后0就是0,255变为1)转化成二进制信息。
5、二维码译码和纠错:将得到的二进制信息进行译码和纠错。得到的二进制信息是版本格式信息、数据和纠错码经过一定的编码方式生成的,所以译码是对版本格式信息,数据和纠错码进行解码和对比。纠错是和译码同时进行的,将数据进行纠错。得到数据