本文へスキップ
動画

QR コードのしくみ:破れたコードでも読み取れる理由

QR コードはメッセージそのものに加えて、そこから計算した予備のバイトを持っています。だから破れたり汚れたりロゴで隠れたりしたバイトも、リーダーが復元できます。4 つのレベルで約 7〜30% のコード語を復元でき、隠してはいけないのは 3 つの角の四角です。数字はすべて出典つきの、48 秒の解説動画です。

公開
読了時間
6 分
タグ
  • qr-codes
  • how-it-works
  • explainer
目次
  1. 破れても、汚れても、読み取れる
  2. メッセージから計算した予備のバイト
  3. 1 バイト直すのに予備が 2 バイト
  4. 4 つのレベル:7% から 30% へ
  5. ロゴは直せる損傷
  6. 角は隠さない
  7. まとめ
  8. 出典

要点: QR コードはメッセージだけを記録しているのではありません。そこから計算した予備のバイト、つまりリード・ソロモン(Reed–Solomon)誤り訂正を加えています。音楽 CD と同じ数学で、欠けたバイトや間違ったバイトをリーダーが復元できます。予備をどれだけ持たせるかは選べます。L、M、Q、H の 4 つのレベルが、それぞれコード語の約 7、15、25、30% を復元し、予備のバイトが多いほどコードは大きくなります。だから真ん中にロゴを置いても読み取れます。リーダーにとってそれはただの損傷です。3 つの角の四角は別です。データではなく、リーダーがコードを見つけてまっすぐに直すためのもので、ほとんどのリーダーはこれを必要とします。

破れても、汚れても、読み取れる

QR コードを開発した DENSO WAVE(デンソーウェーブ):"QR Code has error correction capability to restore data if the code is dirty or damaged."(QR コードには、コードが汚れたり破損したりしてもデータを復元する誤り訂正能力がある。)特長の一覧にもこうあります:"Data can be restored even if the symbol is partially dirty or damaged."(シンボルが部分的に汚れたり破損したりしていても、データを復元できる。)

動画のコードは本物で、中身は oliverz.dev です。角が破れ、端が汚れ、真ん中をロゴが覆っていて、44 個のコード語のうち 13 個が間違っていますが、それでもデコードできます(jsQR と ZXing の 2 つのデコーダで試しました)。

メッセージから計算した予備のバイト

DENSO WAVE:"The QR Code error correction feature is implemented by adding a Reed-Solomon Code… to the original data."(QR コードの誤り訂正機能は、元のデータにリード・ソロモン符号を加えることで実現されている。)カンタベリー大学の『Computer Science Field Guide』はもっと簡単に言います:"it adds extra bits to the data so that errors can be corrected."(誤りを訂正できるよう、データに余分なビットを加える。)

単位はコード語です。DENSO WAVE:"codeword is a unit that constructs the data area. One codeword of QR Code is equal to 8 bits."(コード語はデータ領域を構成する単位である。QR コードの 1 コード語は 8 ビットに等しい。)CS Field Guide:"Each black or white square (“dot” or “module”) corresponds to one bit of data."(黒または白の四角(「ドット」または「モジュール」)1 つが、1 ビットのデータに対応する。)つまり 8 モジュールで 1 バイトです。

この数学は新しいものではありません。DENSO WAVE:"Reed-Solomon Code is a mathematical error correction method used for music CDs etc. The technology was originally developed as a measure against communication noise for artificial satellites and planetary probes."(リード・ソロモン符号は、音楽 CD などに使われる数学的な誤り訂正方式である。この技術はもともと、人工衛星や惑星探査機の通信ノイズ対策として開発された。)

1 バイト直すのに予備が 2 バイト

DENSO WAVE:"Reed-Solomon Code requires twice the amount of codewords to be corrected."(リード・ソロモン符号は、訂正したい数の 2 倍のコード語を必要とする。)CS Field Guide:"The maximum number of errors that a Reed-Solomon code can correct is one half of the amount of extra error correcting data added to it."(リード・ソロモン符号が訂正できる誤りの最大数は、加えた誤り訂正用データの量の半分である。)

私たちのコードは、いちばん高いレベルで、メッセージのコード語が 16 個、予備が 28 個、合わせて 44 個です。28 の半分は 14 なので、最大 14 個の間違ったコード語を直せます。44 個中 14 個は約 32%(私たちの計算)で、DENSO の "Approx. 30%"(約 30%)にあたります。私たちのテストでも限界はちょうどそこでした。14 個間違っていれば読め、15 個では結果が出ませんでした。

結果が出ないのであって、間違った結果ではありません。CS Field Guide:"they won’t read the data incorrectly, instead they just refuse to give any data at all, rather than giving you incorrect data."(データを誤って読むことはなく、間違ったデータを返すくらいなら、何のデータも返さない。)

4 つのレベル:7% から 30% へ

DENSO WAVE による規格(ISO/IEC 18004)の概要:"Level L Level M Level Q Level H Approx. 7% of codewords can be restored. Approx. 15% of codewords can be restored. Approx. 25% of codewords can be restored. Approx. 30% of codewords can be restored."(レベル L、M、Q、H:コード語の約 7% を復元可能。約 15% を復元可能。約 25% を復元可能。約 30% を復元可能。)

この割合は、目に見える面積ではなくコード語を数えたものです:"*Data restoration rate for total codewords" … "QR Code therefore represents its error correction rate as a ratio of the total codewords."(※全コード語に対するデータ復元率……そのため QR コードは、誤り訂正率を全コード語に対する比率で表す。)

予備のバイトが増えれば場所をとります。DENSO WAVE:"Raising this level improves error correction capability but also increases the amount of data QR Code size."(このレベルを上げると誤り訂正能力は上がるが、データ量と QR コードのサイズも増える。)そして:"as the amount of data increases, more modules are required to comprise QR Code, resulting in larger QR Code symbols."(データ量が増えると QR コードを構成するのにより多くのモジュールが必要になり、QR コードのシンボルは大きくなる。)oliverz.dev を入れた私たちの 4 つのコードの、メッセージ + 予備のコード語:

  • L:19 + 7、21 × 21 モジュール
  • M:16 + 10、21 × 21 モジュール
  • Q:13 + 13、21 × 21 モジュール
  • H:16 + 28、25 × 25 モジュール(H では "oliverz.dev" の 11 バイトが 21 × 21 に収まらなくなる)

ロゴは直せる損傷

だから真ん中のロゴでも読み取れます。リーダーはそれを損傷として扱い、隠された部分を復元します。私たちの H のコードでは、7 × 7 モジュールのロゴで 44 個のコード語のうち 9 個が間違いになり、上限の 14 個に収まっています。

ただし、ただではありません。予備のバイトを使ってしまいます。色やイラストを入れたコードについての DENSO WAVE の FAQ:"If it is deformed, the QR Code's error correction function is invoked where even a tiny missing or smeared part renders the reading operation impossible, or the response of the operation may become slow."(変形していると QR コードの誤り訂正機能が働き、わずかな欠けやにじみでも読み取れなくなったり、読み取りの反応が遅くなったりすることがある。)

角は隠さない

3 つの大きな四角はデータではありません。DENSO WAVE:"QR Code accomplishes this task through position detection patterns located at the three corners of the symbol."(QR コードは、シンボルの 3 つの角にある位置検出パターンによってこれを実現している。)QR コードの歴史のページには、これによって "the orientation of their code could be determined regardless of the angle of scanning, which could be any angle out of 360°"(読み取る角度が 360° のどの角度でも、コードの向きを判別できる)とあります。

CS Field Guide:"Don’t colour in near the three large squares in the corners, as most QR scanners need these to align the image."(角にある 3 つの大きな四角の近くは塗らないこと。ほとんどの QR スキャナは、画像の位置合わせにこれを必要とする。)

私たちのテストでは、角の四角の 1 つの中心に 3 × 3 モジュールの小さなシールを貼っただけで、データのバイトには一切触れていないのに、2 つのデコーダとも読めなくなりました。ロゴは 49 モジュールを覆っても読め、シールは 9 モジュールで読めません。

まとめ

  1. QR コードはメッセージと、そこから作った予備のバイト(リード・ソロモン)を持っているので、破れたり汚れたり隠れたりしたバイトをリーダーが復元します。
  2. 予備の量は選べます。L、M、Q、H で、コード語の約 7〜30%。予備が多いほどコードは大きくなります。真ん中のロゴは、予備のバイトで埋め合わせる損傷です。
  3. 3 つの角の四角はデータではありません。リーダーがコードを見つけてまっすぐに直すためのもので、ほとんどのリーダーはこれを必要とします。

出典

動画はコードでアニメーションを作り、台本は AI の手を借りて書きました。上の引用はすべて出典で確認しています。「私たちの計算」と記した数字は私たち自身の計算です。コードは本物で(生成してから jsQR と ZXing でデコード)、そのバイトとコード語の数も本物です。破れ、汚れ、ロゴ(特定のブランドではない汎用のマークで、テストしたモジュールにぴったり重ねて描いています)、カメラのファインダー、そして傾いたコード(同じコードを遠近法で描いたもの)はイメージです。実際の傷みは、モジュールに沿って描いた損傷ほどきれいではありません。「QR Code」は DENSO WAVE INCORPORATED の登録商標です。動画のナレーションは英語です。制作には Shotloop を使いました。コードで解説動画をつくり、1 ショットずつ直せる、私の無料 Mac アプリです。

How It Works のほかの回

YouTube の再生リスト ↗
フォローする

つくったもの、実験、学んだことを随時シェアしています。

新しい動画は YouTube に、短いメモは X に。ここの記事はすべて両方にリンクしています。

YouTube