「QRコードは3割欠けても読める」とよく言われますが、実際には同じ面積が欠けても、場所と散らばり方によって結果が変わります。理由はデータの並び方と、ブロックに分けて誤り訂正を計算する仕組みにあります。本記事では、復元できる欠けとできない欠けの境目を解説します。
復元できるのは「データ領域」だけ
QRコードの誤り訂正が守っているのは、データ符号語と誤り訂正符号語だけです。四隅のファインダパターン、タイミングパターン、位置合わせパターンといった機能パターンは訂正の対象外で、ここが潰れると計算で戻すことはできません。それどころか、読み取り機がQRコードを見つけられず、復元処理が始まりもしません。
つまり「レベルHなら3割欠けても読める」はデータ領域の話であって、コード全体の面積の話ではありません。機能パターンの役割と、壊れたときの症状は「QRコードの四隅にある四角の役割」にまとめています。
訂正は「ビット」ではなく「符号語」の単位で行われる
ここが復元可能性を考えるうえで最も重要な点です。QRコードは8モジュール(8ビット)をひとまとまりにした符号語(コードワード)を単位としてデータを扱い、リード・ソロモン符号による訂正も符号語単位で行われます。
この性質から、次のことが言えます。
- 1つの符号語の中で1ビットだけ壊れても、8ビット全部壊れても、消費する訂正能力は同じ「1符号語ぶん」です。
- 逆に、同じ面積の汚れでも細かく散らばっているほど不利になります。多くの符号語に薄く広がると、それぞれを1符号語ぶんとして数えるためです。
- ペン先で点を打ったような小さな汚れが8個あると、まとまった大きな汚れ1つより多くの訂正能力を使うことがあります。
データはどの順に並んでいるか
符号語は、コードの右下隅から出発して、幅2列の帯を上向きに進み、上端に達したら左へ2列ずれて今度は下向きに進む、という蛇行(ジグザグ)で配置されます。機能パターンにぶつかるモジュールは飛ばされ、縦のタイミングパターンがある列6も飛ばされます。
実演:符号語が並ぶ順路
ブラウザ上でバージョン2のQRコードを生成し、データと誤り訂正の符号語が置かれていく順路を赤い線で描きました。灰色と濃紺のマスは機能パターンなどの予約領域で、順路はそこを避けて進みます。橙と青の帯は8モジュール=1符号語の区切りです。
図を見ると分かるとおり、順番が近い符号語は物理的にも近い場所に置かれます。これは素直な配置ですが、そのままだと弱点になります。コードの一部にまとまった汚れがあると、連続した符号語がまとめて壊れてしまうからです。
ブロック分割とインターリーブ
この弱点を埋めるのがブロック分割とインターリーブです。バージョンが大きくなると、データ符号語は複数のブロックに分けられ、ブロックごとに独立して誤り訂正符号語が計算されます。そして符号内に配置するときは、各ブロックから1個ずつ順番に取り出して交互に並べます。これがインターリーブです。
結果として、物理的に隣り合う符号語は別々のブロックに属することになります。コードの一部が大きく汚れても、その被害は複数のブロックに薄く分散されるため、どのブロックも訂正能力の範囲内に収まりやすくなります。1つのブロックに被害が集中して「そのブロックだけ復元不能」になる事態を避けるための設計です。
| バージョン / レベル | ブロック数 | データ符号語 | 誤り訂正符号語 |
|---|---|---|---|
| 1 / L | 1 | 19 | 7 |
| 1 / M | 1 | 16 | 10 |
| 1 / H | 1 | 9 | 17 |
| 5 / Q | 4 | 62 | 72 |
| 10 / M | 5 | 216 | 130 |
| 10 / H | 8 | 122 | 224 |
| 40 / L | 25 | 2,956 | 750 |
| 40 / H | 81 | 1,276 | 2,430 |
バージョン1は誤り訂正レベルに関わらず1ブロックしかありません。小さいQRコードほど「汚れが1か所に集中したときに弱い」のは、分散させる先のブロックが無いからです。逆にバージョン40・レベルHでは81ブロックに分かれます。
欠けた場所別の復元可能性
| 欠け方 | 復元の見込み | 理由 |
|---|---|---|
| 四隅のファインダが1つ潰れている | ほぼ絶望的 | 機能パターンは訂正対象外。検出そのものが失敗する |
| 外周の余白が無い・背景と接している | 低い(ただし画像を加工して余白を足せば通ることがある) | 比率の判定が崩れて検出できない |
| データ領域の一部がまとまって欠けている | 高い | インターリーブで複数ブロックに分散される |
| コード全体に細かい汚れが散っている | 面積のわりに低い | 符号語単位で数えるため、少ない面積で多くの符号語を消費する |
| 右下から中央にかけて大きく欠けている | 中程度 | データ領域だが、欠けが大きいと各ブロックの訂正能力を超える |
| 白黒が反転している・色が薄い | 高い | 情報自体は失われていない。二値化や反転で戻せる |
実際の画像から復元を試すときは、まず情報が失われているのか、写り方が悪いだけなのかを分けて考えるのが近道です。にじみ・ボケ・低コントラストは「写り方の問題」なので、画像処理で戻せる可能性が高いカテゴリです。物理的に破れている・塗りつぶされている場合だけが、誤り訂正の出番になります。
Free Tool QR Code Photo Restore で復元を試す 写真のQRコードを鮮明化・二値化・ボケ補正しながら、読み取れる状態まで自動で試行します。 Free Tool QR Code EC Tester で限界を測る QRコードを部分的に隠しながら、誤り訂正レベルごとにどこまで読み取れるかを実際に確かめられます。まとめ
- 誤り訂正が守るのはデータ領域だけ。機能パターン(四隅・タイミング・位置合わせ)は対象外。
- 訂正の単位は8モジュール=1符号語。1ビット壊れても8ビット壊れても消費は同じ1符号語ぶん。
- そのため、同じ面積なら細かく散った汚れのほうが不利になりやすい。
- 符号語は右下からのジグザグで配置され、大きいバージョンではブロックに分けてインターリーブされる。
- インターリーブがあるので、一箇所にまとまった欠けは複数ブロックに分散されて耐えやすい。
- 位置が分かっている欠け(消失)は、位置が分からない誤りの2倍まで訂正できる。
よくある質問(FAQ)
QRコードは面積の何割まで欠けても復元できますか?
面積だけでは決まりません。誤り訂正が守るのはデータ領域だけで、四隅のファインダパターンなどの機能パターンは対象外です。またリード・ソロモン符号は8モジュール=1符号語の単位で訂正するため、同じ面積でも細かく散らばった汚れのほうが多くの符号語を消費して不利になります。
なぜ一箇所にまとまった汚れに強いのですか?
データ符号語が複数のブロックに分けられ、配置時に各ブロックから1個ずつ交互に並べられる(インターリーブ)ためです。物理的に隣り合う符号語が別々のブロックに属するので、まとまった汚れの被害が複数ブロックに分散されます。
1ブロックあたり何符号語まで訂正できますか?
誤りの位置が分からない場合は、そのブロックの誤り訂正符号語数のおよそ半分までです。壊れている位置が分かっている場合(消失)は、最大で誤り訂正符号語数と同じ数まで訂正できます。小さいバージョンでは誤読防止のために一部が確保されるため、実際は半分よりわずかに少なくなります。
四隅のファインダパターンが欠けている場合はどうすればよいですか?
誤り訂正では復元できません。機能パターンは訂正の対象外で、欠けると読み取り機がQRコードを検出できないためです。画像処理で四隅を描き直せる場合を除き、元のQRコードを再取得するのが確実です。