QR 二維碼在不影響掃碼的情況下,哪些部分可以刪除?

問題是這樣遇到的,在某大神的項目網站上,看到他的頭像是以下圖片:

我查閱了一些關於QR碼原理的資料,大概了解了一下是如何QR碼是如何編碼的,還有掩碼之類的也看了一些。

我做了個小實驗,擦去QR碼的部分圖像,效果如下:

這個碼仍然可以正確掃描(應該是QR碼一定的容錯性吧?)

但再稍微刪一點就不能再掃描了。

在只了解一點點QR碼皮毛的情形下,我對此有如下猜測:

1.刪除的面積有一定上限,超過其容錯率便很難掃描。

2.有某些特定區域一丁點也不能刪,否則將不能掃描。

我不太明白,這種很大面積的圖案是如何嵌入到QR碼當中而不影響掃碼的?

如果現在要儘可能多的刪除這張QR碼的內容,那麼最多都可以刪掉哪些部分,而不影響掃碼?

希望對此了解的知友能指點一下~多謝


你可以去看下這篇文章 http://cgv.cs.nthu.edu.tw/Projects/Recreational_Graphics/Halftone_QRCodes/

它是一方面讓QR code長得像輸入圖片,另一方面不斷用識別庫去嘗試識別……最後取得平衡

ps. 我也用這個文章的代碼生成過頭像對應的QR Code...論文作者有提供可執行程序

http://en.wikipedia.org/wiki/Albert_Einstein (二維碼自動識別)


QR 二維碼一共有40個尺寸,即 21 × 21 的 Version 1 到 177 × 177 的 Version 40,計算公式為 left( V - 1 
ight) 	imes 4 + 21,其中 V 代表 Version,即版本號。

圖片截自 QR Code 的標準化文檔,中文是自己加上的,有些可能翻譯不準確,見諒。

功能圖案:

  • 定位標誌:分別在三個角,標定一個 QR 碼。
  • 定時標誌:由深淺兩色交替構成,起到了確定坐標的作用,推測應該在大尺寸 QR 碼中作用較為明顯。
  • 對齊標誌:在 QR 碼微量畸變的情況下進行矯正

編碼區:

  • 格式信息:用於存放一些格式化數據,如糾錯級別
  • 版本信息:包含版本信息和糾錯相關信息

---------------------------------------分割線---------------------------------------

回到答主的疑問,哪些部分可以刪除呢,來實驗一下。(使用了微信的掃一掃功能,不知道有沒有特殊的工具可以使用)

  • 定位標誌必須保持完整,缺少一點就讀不出來

像這三張圖,均對右上角的定位標誌做了處理,結果都掃描不出來,真的是少「一點」都不行。

  • 定時標誌

http://mmcheng.net/ (二維碼自動識別)

將左側的定時標誌刪去,掃描成功。

http://mmcheng.net/ (二維碼自動識別)

將兩條定時標誌均刪除後仍然掃描成功。

  • 對齊標誌

http://mmcheng.net/ (二維碼自動識別)

http://mmcheng.net/ (二維碼自動識別)

我將所謂畸變理解為傾斜角,在對齊標誌完整的情況下,極限大概是上下左右45度,都能夠掃描成功。

嘗試將整個對齊標誌刪除,只有在完全正對的時候才能掃描成功。

----------------------------------基友叫我出門玩啦,待續----------------------------------


簡單說就是信息有冗餘唄,有糾錯碼和補齊碼。

補齊碼就是需要的信息比它可以容納的信息少,那就加一段補齊碼,就是重複11101100 00010001這兩個bytes。為什麼是這兩個,我也不知道

然後是糾錯碼,有L、S、Q、H四種級別的糾錯,通常情況下使用15%的級別,保證條碼有輕微破損的時候仍能被讀出。其原理大概就是給QR碼分區,然後在每個分區加上一段糾錯碼,二維碼的糾錯碼主要是通過Reed-Solomon error correction 演算法來實現,由於鄙人看不懂,請移步QR code spec http://raidenii.net/files/datasheets/misc/qr_code.pdf


一方面是面積有限制,一般擦除的面積肯定不能超出容錯比例。

其次就是輔助定位的部分是不能被擦除的,也就是下圖所指出的地方:

之前我給趙人希做拼接式二維碼的時候,就是把他的URL地址加大容錯比例重新生成,再拆成四個小圖放微博上,利用QR碼的容錯原理,讓四個小圖之間的間隙部分被容錯掉就可以了。

做的第一版因為正好校正標識被擦去了一部分,所以識別率不佳,後來稍微挪了一下二維碼的位置,讓空隙避開了校正標識。

儘管定位和校正標識被擦除對識別的影響非常大,但是也不是完全不能擦除,擦除很小一部分的時候,二維碼仍然是可以識別的,只是這些區域被擦除一點點就會帶來很大的識別率下降。


如果我沒記錯的話,除了那四個定位的方塊,和那橫豎兩條線其餘的任意刪減大約30%,再多就識別不出來了。



。。小白求教 這種二維碼是怎麼用程序生成的?掩碼是怎麼樣被選擇的?


推薦閱讀:

TAG:演算法 | 圖像處理 | 二維碼 | QRCode |