情報のしくみしくみ

QR コードは、なぜ欠けても読めるのか

汚れたり欠けたりした QR コードが読める理由を、マスを塗って欠けさせる図で確かめます。どこが欠けると読めなくなるのかも解きます。

図1 さわって動かせます

この図は、JavaScript を使って動きます。下の説明でも要点が分かるように書いています。

QR コードのマスをなぞると、白黒が変わります。読めるかどうかは、図の中で読み取りの計算をして決めています。誤り訂正レベル H で右下の 7×7 マスを白にすると、白黒が変わるのは 25 マスで、まだ読めます。左上の四角の中心の9マスを白にすると、それだけで読めなくなります。

上の QR コードには https://ugokuzukai.com/ が入っています。マスを指かマウスでなぞると、そのマスが白(または黒)になります。

試すと、いくつかのことに気づきます。

この「自分で直す」しくみを、誤り訂正といいます。QR コードを作ったデンソーウェーブは、汚れたり破損したりしても、コード自身でデータを復元できると説明しています。誤り訂正には、リード・ソロモン符号という方法を使っています。

予備の数字を足すと、間違いが直せる

リード・ソロモン符号の考え方を、短い数字の列で試します。

5つの数字 3・1・4・1・5 を送るとします。数字だけを送ると、途中で1つが書き換わっても、受け取った側は気づけません。そこで、予備の数字を足して送ります。

図2 さわって動かせます

この図は、JavaScript を使って動きます。下の説明でも要点が分かるように書いています。

5つの数字(3・1・4・1・5)に、予備の数字を足して送ります。予備 A は数字の合計(14)、予備 B は「何番目か」を掛けた合計(46)です。受け取った数字から A と B を計算し直し、送られた A・B とのずれを見ます。4番目の 1 が 7 に書き換わると、A は +6、B は +24 ずれます。24 ÷ 6 = 4 なので、4番目が 6 だけ多いと分かり、直せます。予備が A だけだと、間違いがあることは分かっても、どこかは分かりません。

数字を1つ書き換えると、予備とのずれが出ます。

予備が A だけのときは、「どこかが違う」ことしか分かりません。合計は、どの場所の数字が変わっても同じようにずれるからです。

予備を B まで足すと、直せます。1か所が e だけ違うとき、A のずれは e になります。B のずれは「何番目か × e」になります。そこで B のずれを A のずれで割ると、何番目かが出ます。A のずれから、どれだけ違うかも分かります。

「どこが」と「どれだけ」の2つを求めるので、1か所を直すのに、予備が2つ要ります。2か所が違うと、この予備では直せません。図の「2か所を書き換える」の例のように、1か所の間違いと取り違えて、別の数字に直してしまうこともあります。

QR コードのリード・ソロモン符号は、この考えを広げたものです。予備に当たるのが「誤り訂正の符号語」で、その数を増やすほど、直せる場所が増えます。デンソーウェーブの説明でも、1つの符号語を直すには、誤り訂正の符号語が2つ要ります。ただし計算は、ふつうの足し算とかけ算ではありません。リード・ソロモン符号は、有限体と呼ばれる別の数の体系の上で計算します(Reed と Solomon が 1960 年に書いた論文も、題名は「ある有限体の上の多項式符号」です)。

QR コードは、文字をどう「マス」にしているか

QR コードの白黒の四角1つを、この記事では「マス」と呼びます。規格(JIS X 0510)では「モジュール」、デンソーウェーブの説明では「セル」と呼んでいます。

マスの並べ方は、規格で決まっています。図1の QR コードは、次の順で作りました。

  1. 文字をバイト(8ビット)の列にする。頭に「どんな種類のデータか」と「何文字か」を付ける
  2. 8ビットずつに区切る。この8ビットのまとまりを「符号語」と呼ぶ。決まった数に届くまで、埋め草の符号語を足す。ここまでが「データの符号語」
  3. データの符号語をいくつかの「ブロック」に分け、ブロックごとに「誤り訂正の符号語」を計算して付ける
  4. 各ブロックから1つずつ順に取り出して、1列に並べ直す
  5. 右下の角から、2列ずつ上へ、下へと折り返しながら、符号語のビットをマスに置いていく
  6. 「マスク」という決まった模様で、白黒を入れ替える。規格には8種類のマスクがある。位置検出パターンに似た並びや、同じ色の大きな固まりが少なくなるものを選ぶ
  7. 誤り訂正レベルと、どのマスクを使ったかを「形式情報」として、決まった場所に置く

図1の下の帯は、手順4で並べ直す前の、ブロックごとの符号語です。塗りつぶした四角がデータの符号語、点線の四角が誤り訂正の符号語です。マスの白黒を変えると、そのマスが入っている符号語に印が付きます。

図1でレベル Q か H を選ぶと、ブロックが2つになります。右下の 7×7 マスを白にすると、誤りの符号語が2つのブロックに分かれて入るのが見えます。手順4で、各ブロックの符号語を交互に並べたからです。

どれだけ欠けても読めるか:L・M・Q・H

誤り訂正レベルは4つあります。デンソーウェーブの説明では、全部の符号語のうち、L は約 7%、M は約 15%、Q は約 25%、H は約 30% を復元できます。

図3 さわって動かせます

この図は、JavaScript を使って動きます。下の説明でも要点が分かるように書いています。

同じ文字列 https://ugokuzukai.com/ を、誤り訂正レベル L・M・Q・H で QR コードにします。L と M では型番2(25×25 マス)、Q と H では型番3(29×29 マス)になります。直せる符号語の数は、L が 44 個のうち 4 個(9.1%)、M が 44 個のうち 8 個(18.2%)、Q が 70 個のうち 18 個(25.7%)、H が 70 個のうち 22 個(31.4%)です。文字を変えると、型番と符号語の数も変わります。

レベルを上げると、誤り訂正の符号語が増えます。同じ文字を入れるには、その分だけ大きな型番が要ります。型番は 1 から 40 まであり、型番1が 21×21 マスで、1つ上がるごとに縦横4マスずつ増えます。図3で L から H に切り替えると、マスが細かくなるのはこのためです。

直せる符号語の数は、規格の表に、型番とレベルの組ごとに書いてあります。図3の数は、その表から出しています。帯の下の黒い線の長さが、直せる数です。データの符号語と誤り訂正の符号語のどちらに誤りがあっても直せます。直せるのは、両方を合わせてこの数までです。

表の数を見ると、誤り訂正の符号語の半分より、少し少ない数しか直さない組があります。たとえば型番1のレベル L は、誤り訂正の符号語が7つあるのに、直すのは2つまでです。残りの符号語は、誤りを直すためではなく、読み違い(誤りが多すぎるときに、別の文字に直してしまうこと)を防ぐために使います。図2の「2か所を書き換える」の例で起きたことを、起きにくくする分です。

約 7%・15%・25%・30% は、符号語で数えた割合です。マスで数えた割合とは違います。1つの符号語は8マスにまたがります。8マス全部が変わっても、1マスだけが変わっても、誤りは符号語1つです。図1の例で、右下の 25 マスの白黒が変わっても、誤りの符号語は5つで済んでいるのはこのためです。

欠ける場所で、結果が変わる

図1をもう一度使います。今度は、欠ける場所を変えて試してください。

図4 さわって動かせます

この図は、JavaScript を使って動きます。下の説明でも要点が分かるように書いています。

図1と同じ QR コードです。左上・右上・左下の大きな四角(位置検出パターン)は、中心の 3×3 マスを白にするだけで読めなくなります。形式情報(左上の四角を囲む L 字の列と、右上・左下の四角の脇の列)は、2か所とも大きく欠けると読めなくなります。データのマスは、直せる数までなら欠けても読めます。

読み取りは、順に進みます。前の段で止まると、その先の誤り訂正までたどり着きません。

1. 位置検出パターンを探す。 3つの角にある大きな四角は、ここに QR コードがあるという目印です。白黒の幅が 1:1:3:1:1 になっています。デンソーウェーブによると、この比は、チラシや雑誌などの印刷物を調べて、一番使われていない比を選んだものです。走査線がどの方向から通っても、この比を探せば位置が割り出せます。

図1で、四角の中心の 3×3 マスを白にすると、どの線で見ても 1:1:3:1:1 が崩れます。たった9マスでも、QR コードの場所が分からず、読み取りはここで止まります。四角の外側の角を少し欠いただけなら、中心を通る線の比は崩れないので、読めます。

2. 形式情報を読む。 誤り訂正レベルとマスクの種類が入っています。これが分からないと、マスクを外せず、符号語も取り出せません。形式情報は、同じものが2か所に置いてあります。それぞれにも誤り訂正の符号が付いていて、少しの欠けなら直せます。図1で片方を全部欠いても、もう片方が読めれば先へ進みます。

3. 符号語を取り出して、ブロックごとに直す。 ここで、リード・ソロモン符号が働きます。誤りの符号語が、ブロックごとの上限までなら直せます。1つのブロックでも上限を超えると、読めません。

データの部分は、全体に広く散らばっています。誤り訂正で直せるのは、この部分です。位置検出パターンと形式情報は、データを読む前の段で使うので、データの誤り訂正では直せません。欠けてもよい量が、場所によって違うのはこのためです。

この図で簡単にしたところ

  • 誤り訂正レベルの約 7%・15%・25%・30% は、マスの割合ではなく、符号語の割合です。1つの符号語は8マスなので、マスで数えた割合とはずれます。1マスだけ変わっても8マスとも変わっても、誤りは符号語1つに数えます。
  • 図1と図3の「読めるか」は、編集部が書いた読み取りの計算で決めています。マスの白黒が、格子のずれなしに分かっている前提です。実物の読み取り機は、カメラの画像から白黒を見分ける段で、ぼけ・ゆがみ・光の加減の影響も受けます。
  • 図1では、位置検出パターンを「中心の 3×3 マスを通る横の線と縦の線の両方で、それぞれ1本以上、1:1:3:1:1 の並びが見えれば見つかる。並びの両端の外側の分離パターンも明るいこと」と判定し、3つとも見つかることを読む条件にしました。実物の読み取り機の探し方は、これより複雑です。
  • 図1の読み取りでは、タイミングパターンと位置合わせパターンを使っていません。実物の読み取り機は、これらでマスの格子の位置を合わせます。図ではそこが欠けても結果は変わりません。
  • 誤りの場所が先に分かっている場合(消失)の訂正は扱っていません。図1は、どの符号語が誤りかを知らない状態で直します。
  • 図1と図3は、8ビットバイトのモード(文字は UTF-8)だけで符号化し、型番は1〜5に限りました。数字だけ・英数字だけのモードや、型番6以上は作れません。
  • 図1の QR コードの周りの余白は2マスにしました。実際に使うときは、4マス以上の余白が要ります。
  • 図2では、予備の数字は書き換えられないことにし、ふつうの足し算とかけ算を使いました。リード・ソロモン符号では、予備の符号語の誤りも直せます。計算には、有限体という別の数の体系を使います。

出典

  1. JIS X 0510:2018 情報技術-自動認識及びデータ取得技術-QRコード バーコードシンボル体系仕様(日本規格協会):符号化の手順、型番と誤り訂正レベルごとの符号語の数・ブロックの分け方・直せる符号語の数、マスの配置、マスク、形式情報
  2. ISO/IEC 18004:2024 Information technology — Automatic identification and data capture techniques — QR code bar code symbology specification(ISO):国際規格の版
  3. 誤り訂正機能について(デンソーウェーブ(QRコードドットコム)):誤り訂正の率は全部の符号語に対する割合。1符号語は8ビット。1つ直すのに誤り訂正の符号語が2つ要る
  4. QRコード規格化・標準化(デンソーウェーブ(QRコードドットコム)):レベル L・M・Q・H で、符号語の約 7%・15%・25%・30% が復元できる
  5. QRコードの情報量とバージョン(デンソーウェーブ(QRコードドットコム)):型番は1〜40。型番1が 21×21 で、1つ上がるごとに縦横4マスずつ増える
  6. QRコード道のり(デンソーウェーブ(QRコードドットコム)):切り出しシンボル(位置検出パターン)の白黒の幅の比 1:1:3:1:1
  7. コード領域を確定するためのポイント(デンソーウェーブ(QRコードドットコム)):周りに4セル分以上の余白が要る
  8. I. S. Reed, G. Solomon, Polynomial Codes Over Certain Finite Fields, Journal of the Society for Industrial and Applied Mathematics, 8(2), 300–304, 1960(SIAM):リード・ソロモン符号の原論文

この記事は、うごく図解の AI の編集部が書き、別の AI が出典と照らして確かめました。どう作っているか