QRCode二维码生成方案及其在带LOGO型二维码中的应用-阿里云开发者社区

开发者社区> 大数据> 正文
登录阅读全文

QRCode二维码生成方案及其在带LOGO型二维码中的应用

简介: 很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别。那么,有没有一种办法将上述区域预先“抠空”出来(以便专门放置LOGO),而其他区域则专门来放置二维码的有效数据呢?——这就是本文想探讨的问题。

很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别。那么,有没有一种办法将上述区域预先“抠空”出来(以便专门放置LOGO),而其他区域则专门来放置二维码的有效数据呢?——这就是本文想探讨的问题。

本文重点探讨的是二维码的高级应用及改进,其主要的思路是通过掩码等手段,提前对二维码生成进行改进

由于二维码通常是黑白方块型的,人眼无法直接识别,但为了商业和宣传的需要,很多公司都乐意将自己的LOGO标识加入到二维码中,以更方便直接识别。

为了便于理解,先比较以下两图:

       

图1   未加LOGO的彩色二维码              图2  加LOGO后的彩色二维码

但一旦LOGO加入到二维码中特别是LOGO足够显眼而遮挡住二维码本身而影响其本身的可识别性时,问题随之产生。下图就标识出了上面所加LOGO所遮盖的二维码区域。


图3  LOGO所遮盖的二维码区域示意

我们可以想像,如果LOGO遮挡区域足够地大,二维码就变得无法识别。那么,有没有一种办法将上述区域预先“抠空”出来(以便专门放置LOGO),而其他区域则专门来放置二维码的有效数据呢?——这就是本文想探讨的问题。

众所周知,为了增加QR码阅读的可靠性,最好均衡地安排深色与浅色模块。应尽可能避免类似“位置探测图形”的位图1011101出现在符号的其他区域。

为了满足上述条件,应按以下步骤进行掩模:

1)掩模不用于功能图形;
2)用多个矩阵图形连续地对已知的编码区域的模块图形(格式信息和版本信息除外)进行XOR操作。XOR操作将模块图形依次放在每个掩模图形上,并将对应于掩模图形的深色模块的模块取反(浅色变成深色,或相反);
3)对每个结果图形的不合要求的部分记分,以评估这些结果;
4)选择得分最低的图形。

下表给出了掩模图形的参考(放置于格式信息中的二进制参考)和掩模图形生成的条件。掩模图形是通过将编码区域(不包括为格式信息和版本信息保留的部分)内那些条件为真的模块定义为深色而产生的。所示的条件中,i代表模块的行位置,j代表模块的列位置,(i,j)=(0,0)代表符号中左上角的位置。


图4   掩模图形参考及条件


图5   QRCode的八种掩模方案


图6  掩模结果(版本1符号的所有的掩模图形,用掩模图形参考000到111的掩模结果)。

下图为掩模过程:


图7  符号的掩模过程

这些掩模方案的特征是黑点与白点呈形状的均匀地几何分布。将它们与原有图案进行异或操作后,掩模后的图像会对原有图像有明显的改进,有利于更好地识别。

罚点记分:

在依次用每一个掩模图形进行掩模操作之后,要通过对每一次如下情况的出现进行罚点记分,以便对每一个结果进行评估,分数越高,其结果越不可用。在下表中,N1到N4为对不好的特征所罚分数的权重(N1=3,N2=3,N3=40,N4=10),i为紧邻的颜色相同模块数大于5的次数,k为符号深色模块所占比率离50%的差距,步长为5%。虽然掩模操作仅对编码区域进行,不包括格式信息,但评价是对整个符号进行的。

最终,应选择掩模结果中罚分最低的掩模图形用于符号掩模。


图8   罚点记分表


从上表可以看出,该罚点记分方法有一定的人为性,特别是N1到N4为对不好的特征所罚分数的权重(N1=3,N2=3,N3=40,N4=10)。有人利用统计学中的方差来解决此类通用问题,其方法是:对每小块的黑点与白点数进行统计,若与期望的平均分布的值相差越大,则其越不可用。其采样的样本越多,采样窗口越小,所获得的数据就越精确。根据上述八种掩模方案的均方差,对计算结果进行比较,最终选取最优掩模。

类似这样:
double CompareVariance(bool[][] matrix)
{
  int S=0;


  for(int i = 0; i < matrix.Length; i++)
    for(int j = 0; j < matrix[0].Length; i++)
      if(!(matrix[i][j]^matrix[i][j+1])) S++;


  for(int j = 0; j < matrix[0].Length; i++)
    for(int i = 0; i < matrix.Length; i++)
      if(!(matrix[i][j]^matrix[i][j+1])) S++;


  double s = S/(2n(n-1));


  return s;
}


为了实现本文所述的上述目标,我们在掩码实施前对二维码的生成方案进行改进,提前根据需要预留特定位置给LOGO标识。

首先我们来看看二维码的符号字符区域,然后再看看其编码流程。

QRCode的结构:


图9  QRCode的结构

下图为二维码的符号字符区域示意:


图10   版本2-M符号的字符区域分布示意


图11   版本7-H符号的符号字符布置

从上面可知,字符区域分布中均有纠错块与数据块。

再看编码流程:

第1步 数据分析
  分析所输入的数据流,确定要进行编码的字符的类型。QR码支持扩充解释,可以对与缺省的字符集不同的数据进行编码。QR码包括几种不同的模式(ECI,数字,字母数字,8位字节,日本汉字,中国汉字,混合,结构链接,FNC1模式等),以便高效的地将不同的字符子集转换为符号字符。必要时可以进行模式之间的转换更高效地将数据转换,以便为二进制串。
选择所需的错误检测和纠正等级。如果用户没有指定所采用的符号版本,则选择与数据相适应的最小的版本。
第2步 数据编码
  对于采用的模式按照已定义的规则,将数据字符转换为位流。在当需要进行模式转换时,在新的模式段开始前加入模式指示符进行模式转换。在数据序列后面加入终止符。将产生的位流分为每8位一个码字。必要时加入填充字符以填满按照版本要求的数据码字数。
第3步 纠错编码
  按需要将码字序列分块,以便按块生成相应的错误纠正码字,并将其加入到相应的数据码字序列的后面。
第4步 构造最终信息
  按相关的规范步骤,在每一块中置入数据和纠错码字,必要时加剩余位。
第5步 在矩阵中布置模块
  将寻象图形、分隔符、定位图形、校正图形与码字模块一起放入矩阵。
第6步 掩模
  依次将掩模图形用于符号的编码区域。评价结果,并选择其中使深色浅色模块比率最优且使不希望出现的图形最少化的结果。
第7步 格式和版本信息
    生成格式和版本信息(如果用到时),形成符号。

(写作中,未完)


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
大数据
使用钉钉扫一扫加入圈子
+ 订阅

大数据计算实践乐园,近距离学习前沿技术

其他文章
最新文章
相关文章