二维码哪些部分是无用的?

我观察扫描二维码的时候,不用全部入扫描区,就能成功。那么哪些信息是不必要的呢?
已邀请:

陈浩 - 曾经学物理,现在做数学

推荐来自: Joey 圆月超人 艺诗 LF DqWong vczh 浮生未半 叶藏 advAdder 石佳明更多 »

这并不是因为 QR 码有「无用部分」或「不必要信息」。QR 码的编码用了纠错码 (error-correcting code),有四个纠错等级,分别可以纠正 7%,15%,25%,30% 的数据损失。纠错是针对数据区,这个区域随便遮掉一小部分,一般都可以被纠正,所以没有固定的「无用部分」。功能区是不可以遮掉的(关于 QR 码结构请自己搜)。

关于纠错码:Reed-Solomon Error Correction.
 
上面这个 R-S 纠错码是非常巧妙的,但也涉及一些较深的数学,这里不展开。说说最简单的纠错码,就是重复。A 为了传输信息 11001 给 B,实际传输的是 111111000000111(每个字母重复三遍)。这是必要的,因为信道(信息传输的渠道)通常是不可靠的,B 可能收到的是 110101001100110。但是 B 每次读三个字母,比如 110,其中 1 比较多,就知道第一位应该是 1,这样最后解码成 11001。这就像以前无线电通讯时,要把呼号重复几遍一样。
 
纠错码可以看作是信息冗余,但也是保证数据准确传输所必需的。事实上,现在我们使用的通信全部有纠错能力,因为信道不可靠,而许多通信不允许有错。可以说多亏了纠错码才有了互联网的正常运行。认为没有必要设置冗余,这实在是对通信载体太有信心了。以二维码为例,印在纸上纸张可能破损、在户外可能有污渍、手机摄像头可能聚焦有问题,这些都会造成数据损失,但是因为纠错码,信息没有损失。也多亏了纠错功能,我们得以在二维码上进行一定的艺术设计,加些广告什么的,这会遮挡一部分二维码,但不会丢失信息。
@陈浩 说的太专业了,自愧不如。看完之后还是似懂非懂,于是就自己做了个实验,直接把二维码的不同部分抹去,看究竟那些能扫出结果,下面上过程。结论在最后加粗部分,不是很严谨,仅供娱乐。具体原理还是要专业大神来解释。
1.原图。【是我的个人二维码,想来想去也就这个不算是打广告了233】

二维码尺寸是37*37,四角三个方块大小是7*7。用QQ截图的结果是317*317像素,这是基本数据,下面的所有不同方法都是按照这个数据来的。
2.缩放

以上两个面积分别是原图的56%和25%,都扫不出来。
3.截取
分别截取二维码的不同部分,我这里把整张图分割成四等份,试了一下都扫不出来。
        


        
4.涂抹
用不同的色块涂抹二维码不同部分,试了一下还是有结果的,因为图太多所以直接放结论。
色块尺寸按照二维码的格数来算的话分别是7*7(用于遮住四角的色块)和23*10(用于遮住同一边两个色块之间的部分)。结果如下。


5.结论
根据我并不是很严谨的实验得出的结论是,
一个二维码图片中起重要作用的首先是位于四角的三个方块(除去右下角那个打酱油的)以及中间部分,因为时间有限所以没有测试最中间头像部分的作用,不过按照微信二维码的规则应该是没什么作用,毕竟不管头像怎么换,扫描之后链接到的还是我这个帐号。
其次就是两个角之间的四条边,遮住一个没有关系,两个的话就无法扫描了。按照我的想法四边的尺寸应该是一样的,但是试了几次都是上图的那个结果,可能是哪里出了问题。

 

要回答问题请先登录注册