QRコードの誤り訂正:L・M・Q・Hは実際にどう働くか

KoloQRチーム基本

QRコードの4つの誤り訂正レベルが、角丸のタイルに大きな文字で Q・M・L・H と並び、その下に「Error Correction」と書かれた角丸の帯が置かれた図。

誤り訂正とは、記号の一部が損なわれたり覆われたりしてもスキャナーがデータを復元できるように、QRコードに組み込まれた冗長性です。QRコードは、ある意味で中身を二重に保存しています。1つはデータとして、もう1つは数学的に導かれ、記号全体に散らされた復元用の情報としてです。コードの一部が擦れたり、汚れたり、折れたり、ロゴの下に隠れたりしても、スキャナーは残った部分から欠けた断片を組み立て直します。

要点

  • 誤り訂正とは、記号の一部が損なわれたり覆われたりしてもスキャナーがデータを復元できるように、QRコードに組み込まれた冗長性です。
  • ISO/IEC 18004で定められた4つのレベルは、コードのデータのおよそ7%(L)、15%(M)、25%(Q)、30%(H)を復元します。
  • 誤り訂正を上げるとデータ容量が減るので、同じURLでもより高いシンボルバージョンが必要になります。印刷幅が同じなら、それはモジュールが小さくなり、スキャンが難しくなるということです。
  • 誤り訂正が直すのはデータ領域だけです。ファインダーパターン、タイミングパターン、クワイエットゾーンが傷むと、どのレベルで作っていてもたいていコードは読めなくなります。
  • 誤り訂正は、コントラスト不足、ぼやけ、反射、小さすぎる印刷を埋め合わせられません。これらは記号の一部ではなく全体を一度に劣化させるからです。

QRコードの誤り訂正とは

その仕組みがリード・ソロモン符号で、CDや深宇宙通信で使われているのと同じ系統の符号です。リード・ソロモン符号とは、QRコードの誤り訂正コードワードを生成し、無傷で残ったコードワードから失われたデータを再構成する方式です。働きかける相手は個々の正方形ではなくコードワードです。コードワードとは、QRコードが1つの単位として扱う8モジュールのまとまりで、1単位のデータか、1単位の誤り訂正のいずれかになります。

誤り訂正は生成のときに一度だけ選ばれ、記号に焼き付けられます。レベルはファインダーパターンの脇にある形式情報に書き込まれるので、どのスキャナーでもどのレベルが使われたかを読み取れます。印刷したQRコードの誤り訂正レベルを後から変えることはできません。変えるということは、コードを作り直して刷り直すということです。

誤り訂正レベルL・M・Q・Hの意味

QRコードの4つの誤り訂正レベルは、コードのコードワードのおよそ7%(L)、15%(M)、25%(Q)、30%(H)を復元します。どのQRコードも、必ずそのうちの1つを使います。レベルが高いほど復元用のコードワードが増え、同じシンボルサイズなら実際のデータに使えるコードワードは減ります。

レベル公称の復元率バージョン1(21×21)のバイト数バージョン10(57×57)のバイト数主な用途
L(低)約7%17271画面、アプリ、長いURL、屋内のきれいな面
M(中)約15%14213一般的な既定値。ふつうの印刷物
Q(四分位)約25%11151中央の小さなロゴ、手に取るものや屋外のもの
H(高)約30%7119大きめのロゴ、工業用の表示、摩耗、風雨
容量の数値は、ISO/IEC 18004の文字数容量表(バイトモード)によります。

この割合が示すのはコードワードであって面積ではなく、正確な値ではなく公称値です。バージョン1なら計算が目に見えます。この記号は合わせて26コードワードを持ち、リード・ソロモン符号は1つのブロックの中で誤り訂正コードワードの半分までを直せます。ただし、誤ったデータを読み取る危険を下げるために規格が確保している、わずかな予備分を差し引きます。

レベル(バージョン1)データコードワード誤り訂正コードワード直せるコードワード全26に対する割合
L19728%
M1610415%
Q1313623%
H917831%

より大きな記号では、データは複数のリード・ソロモンのブロックに分けられ、コードワードは記号全体に交互に配置されます。そのため1つのしみは多くのブロックに分散され、各ブロックが自分の担当分を直します。この交互配置があるからこそ、隅にできたコーヒーの輪はたいてい耐えられますし、訂正がブロックごとに行われるにもかかわらず公称の割合が目安として通用するのです。

どの誤り訂正レベルを使うべきか

印刷するQRコードのほとんどにはMを、コードにロゴを載せる場合や面が酷使される場合はQかHを、そしてLは画面上か、データが長くコードを粗いまま保たなければならない場合にだけ使いましょう。Mは多くの作成ツールが既定にしているレベルで、擦れることのないポスター、チラシ、メニュー、名刺なら、Mが正解です。

判断の基準です。

  • コードを画面に表示するなら、Lを選びます。 画面には汚れも折れもなく、コントラストは完璧なので、復元の余力は無駄な冗長性でしかなく、コードを密にするだけです。
  • コードを紙に印刷し、ロゴを載せないなら、Mを選びます。 Mは通常の取り扱い、インクのにじみ、軽い汚れをカバーします。
  • コードの中央にロゴを置くなら、最低でもQを、ロゴが大きければHを選びます。 ロゴは、本来なら印刷やスキャンの誤りを吸収するはずの復元の余力を消費します。
  • コードが屋外、パッケージ、機械、あるいは擦られたり折られたり風雨にさらされたりする場所に出るなら、Hを選びます。 摩耗はモジュールを永久に取り除きます。
  • データが長く、コードを物理的に小さく保たなければならないなら、LかMを選び、代わりにデータを短くします。 長いURLでレベルを上げると記号が密になり、たいていそちらのほうが大きなリスクです。

ここでは、実例による反証が役に立ちます。スイスとリヒテンシュタインの決済標準であるスイスQR請求書は、誤り訂正レベルM、46×46mmの固定サイズ、最小モジュールサイズ0.4mm、そしてコード中央の7×7mmのスイス十字を定めています。この十字が覆うのは記号面積のおよそ2.3%です。一国の銀行標準が、レベルMのQRコードにロゴを載せているわけです。ロゴが小さく、モジュールのサイズが保証されているからです。レベルHはロゴのための要件ではありません。大きなロゴのための埋め合わせです。

誤り訂正が印刷したQRコードのサイズをどう変えるか

誤り訂正のレベルを上げると、印刷幅が同じならモジュール1つ1つは小さくなります。同じデータに、1辺あたりのモジュール数がより多い、高いシンボルバージョンが必要になるからです。ここが多くの人の見落とす取引です。損傷から守るためのレベルが、そもそもスキャンの失敗を招く密度も上げてしまいます。

https://koloqr.com/qr-codes-for/coffee-shops のような44文字のURLを、バイトモードでエンコードし、幅25mmで印刷する場合を考えます。

レベルシンボルバージョングリッド25mmでのモジュール幅モジュール0.4mmでの最小記号幅
L329×290.86mm11.6mm
M433×330.76mm13.2mm
Q433×330.76mm13.2mm
H537×370.68mm14.8mm

この表から2つのことが分かります。1つ目は、LからHへ移ると、同じ印刷サイズでモジュールが約21%小さくなることです。吸い込みやすい紙では、これはくっきりしたモジュールと、互いににじんでつながるモジュールとの差になります。2つ目は、このデータではMとQが同じシンボルバージョンになることです。つまりQは無料です。同じ物理的なコード、同じモジュールサイズで、復元率が15%ではなく25%になります。

この2つ目の点は、毎回確かめてください。容量は段階的に動くので、誤り訂正レベルを1つ上げてもまったく費用がかからないことがよくあります。選んだレベルでコードを生成してグリッドの大きさを控え、1つ上のレベルで生成して比べましょう。グリッドが変わらなければ、高いほうを取ります。

ロゴはQRコードのどこまでを覆えるか

中央のロゴがQRコードの面積のおよそ20%までを覆う程度なら、ほとんどの印刷の現場でレベルHなら確実に復元できます。Hの理論上の上限は30%近くですが、復元の予算をすべてロゴに使ってしまうと、インクのにじみ、反射、指紋、少しピントの外れたカメラのために残るものがなくなります。そうした誤りも、同じ予算から支払われるからです。

確かめやすい実用的な目安があります。直径がQRコードの幅の半分である円形のロゴは、記号面積のおよそ20%を覆います。1辺がコード幅の0.45倍の正方形のロゴも、ほぼ同じです。これを守れば、レベルHはおよそ3分の1の余力を残せます。

割合よりも大事な原則です。

  • ロゴは中央に置きます。 中央にあるロゴは、交互に配置されたリード・ソロモンのブロックへ損傷を均等に散らします。同じ大きさでも中央から外れたロゴは損傷を集中させ、1つのブロックを使い切ってしまいやすくなります。
  • ロゴを3つのファインダーパターンに触れさせてはいけません。 角にあるあの大きな正方形は、スキャナーがそもそもコードを見つけるための手がかりであり、誤り訂正では守られていません。
  • ロゴには不透明な背景を付けます。 背景を透明にしてモジュールの上に直接置いたロゴは、縁の周りに半端なモジュールを生み、デコーダーがやはり容量を使って直さなければならない誤りを作ります。
  • バージョン7以上の記号では、アライメントパターンに注意します。 バージョン7以上は、中央付近を含むデータ領域の中にアライメントパターンを置きます。大きな中央のロゴがその1つを埋めてしまうと、正面からならたいてい読めても、斜めからや曲面では失敗することがあります。
  • 画面のプレビューではなく、印刷したコードでテストします。 モニターで400%に拡大すれば動くロゴが、非コート紙の25mmでは失敗することがあります。

円形やカスタムの形のQRコードを作れる無料のQRコード作成ツールであるKoloQRは、ロゴの配置に対応し、書き出す前に誤り訂正レベルを設定できます。角丸のドットや円形のモジュールといった装飾的なモジュール形状は、モジュール1つあたりの印刷されるインクの面積を減らすので、誤り訂正が用意している余裕の一部を消費します。装飾がスキャンの成績をよくすることは決してなく、その差を吸収するのは誤り訂正です。実際にどう見えるかはブランドQRコードをご覧ください。

誤り訂正では直せないQRコードの部分

誤り訂正が守るのはデータ領域だけです。スキャナーがデコードを始める前に必要とする構造のパターンは、リード・ソロモンの訂正の対象外なので、そこが傷むと、コードをLで作っていてもHで作っていても、たいてい致命的になります。

  • ファインダーパターン。 左上、右上、左下の角にある3つの同心の正方形が、記号がどこにあり、どう回転しているかをスキャナーに伝えます。これを守る冗長性はありません。1つでも覆うと、たいていコードはそもそも検出されません。
  • クワイエットゾーン。 クワイエットゾーンとは、スキャナーが記号のどこが始まりでどこが終わりかを判別するための、QRコードの周囲にある4モジュール分の空白の余白です。文字、枠線、写真がその余白に入り込むと、コード内部のモジュールがすべて完璧なままでも検出が壊れます。
  • タイミングパターン。 ファインダーパターンの間を走る、1モジュール幅の交互の線がモジュールのグリッドを決めます。ここが傷むと、読み取り全体の位置がずれます。
  • アライメントパターン。 バージョン2以上にあり、遠近のゆがみを補正します。1つ失っても、平らなものを正面からスキャンするなら耐えられることが多いのですが、曲がったボトルや斜めのサインではずっと厳しくなります。

形式情報は例外です。誤り訂正レベルとマスクパターンを記録する、ファインダーパターンの脇にあるモジュールの帯は、それ自体がBCH符号で守られ、記号の中に二重に保存されているので、それなりの損傷には自力で耐えます。

誤り訂正が守ってくれないもの

誤り訂正が直すのは局所的な損傷であって、全体的な劣化ではありません。レベルをMからHへ上げても、小さすぎる、淡すぎる、ぼやけている、照明が悪いといったコードには何の効果もありません。これらの問題はすべてのモジュールを一度に襲うので、デコーダーが再構成の手がかりにできる無傷の領域が残らないからです。

誤り訂正のレベルを上げても解決しない失敗です。

  • データに対して小さすぎる印刷。 印刷でモジュールがおよそ0.4mmを下回ると、スマホのカメラはグリッドを解像しにくくなります。レベルを上げるとモジュールはさらに小さくなり、問題は悪化します。
  • コントラスト不足。 スキャナーは明暗のはっきりした差を必要とします。クリーム色の地に淡いグレーのコードは、どのレベルでも失敗します。
  • 反転した色。 暗い背景に明るいモジュールという配置は、どこでも対応されているわけではありません。いくつかのスキャンアプリや標準カメラは、明るい地に暗いコードを想定しています。
  • 反射とラミネート。 スポットライトの下のグロスラミネートはカメラへ光を跳ね返し、記号全体を消してしまいます。
  • 手ぶれと暗さ。 どちらも一部ではなく画像全体を劣化させます。
  • 間違ったリンク先や、すでに死んだリンク先のURL。 誤り訂正が保証するのは、エンコードされた文字列をスキャナーが正しく読むことだけです。そのアドレスが今も生きているかどうかについては、何も語りません。

現場でコードが時々失敗するのに、印刷した見本がきれいに見えるとき、原因はほぼ必ずモジュールのサイズ、コントラスト、照明であって、誤り訂正のレベルではありません。

画面での誤り訂正と印刷での誤り訂正

画面ならレベルLがたいてい良い選択で、印刷ならMが妥当な下限です。ディスプレイに映るQRコードは、誤り訂正が備える物理的なリスクのどれにも遭いません。インクのにじみも、折れも、摩耗も、汚れもないので、復元の余力は何も買わず、増えたモジュールがコードを必要以上に密にするだけです。

画面ならではの注意点です。スマホに表示したコードを別のスマホでスキャンする場合、画面の反射と明るさが相手になりますが、これは誤り訂正では扱えません。代わりに表示サイズと画面の明るさを上げましょう。

印刷ならではの注意点です。吸い込みやすい紙はインクを広げ、モジュールは少しずつ隣へはみ出します。このドットゲインは実際の誤りの原因であり、まさにレベルMとQが吸収するものです。コート紙は広がりが少なく、新聞紙、クラフト紙、布はより広がります。プリンターの解像度でモジュールの形が幾何学的に正確なままになるよう、拡大したPNGではなくSVGで書き出しましょう。KoloQRはPNGとSVGの両方を書き出せます。

自分のQRコードが実際どこまで損傷に耐えるかをテストする方法

公称の割合を信じるのではなく、実際に印刷したコードでテストしましょう。レベルが教えてくれるのは予算で、その予算をどれだけすでに使ったかを教えてくれるのは印刷です。次の手順はおよそ15分で終わり、頼りにできる数字が手に入ります。

  1. 最終的な設定でコードを生成する. 同じデータ、同じ誤り訂正レベル、同じロゴで、SVGとして書き出します。
  2. 本番の設定で、本番の紙に印刷する. 同じプリンター、同じ紙、同じラミネート。オフィス用紙へのレーザー校正では、非コート板紙の振る舞いは予測できません。
  3. 傷のない印刷物を、想定する距離で2台のスマホからスキャンする. iOSとAndroidを1台ずつ、標準カメラで。ここで失敗したら止めて、損傷のテストに進む前にサイズかコントラストを直します。
  4. 記号面積の10%を中央で不透明なテープで覆う. 25mmのコードなら、8×8mmの正方形が10%に近い大きさです。もう一度スキャンします。
  5. コードがスキャンできなくなるまで、覆う面積を5%ずつ増やす. 最後に成功した割合を記録します。それがあなたの実際の耐性です。
  6. 損傷を片方の端に置いた場合と、1つの角にまたがる場合でも繰り返す. ファインダーパターンは避けてください。端の損傷は、中央の損傷より早く失敗しがちです。
  7. 実際の照明の下で繰り返す. 売り場、夜のレストラン、倉庫の通路で。
  8. 結果を公称のレベルと比べる. レベルHのコードが12%の被覆で失敗するなら、残りの予算は印刷の品質に食われていたということです。コードを大きくする、URLを短くする、吸い込みの少ない面に移す、のいずれかを行います。

その数字を記録しておきましょう。本刷りを決める前に手元にあると、最も役に立つ数字です。

誤り訂正レベルを選ぶときによくある間違い

誤り訂正で最も多い間違いは、守りは強いほど安全だという思い込みから、既定でHを選ぶことです。長いURLを小さく印刷する場合、Hは置き換えたMの版より頻繁に失敗する、より密なコードを生みます。

すべきこと理由
レベルを上げる前にURLを短くする文字数が減ればシンボルバージョンが下がり、モジュールが大きくなる。どんなレベル変更よりも、現実の余裕が増える
1つ上のレベルでグリッドの大きさが変わるかを確かめる容量は段階的に動くので、レベルを1つ上げても費用がかからないことがよくある
屋外、工業用、パッケージのコードにはHを使う摩耗と風雨はモジュールを永久に取り除く。復元の余力は、まさにそのためにある
損傷を加えた印刷見本でテストする公称の割合は上限であって、保証ではない
してはいけないこと理由
小さなコードを埋め合わせるためにHを使うモジュールが小さくなることで生まれる失敗のほうが、誤り訂正が直す分より多い
復元の予算をロゴで使い切る印刷、反射、ピントの誤りも同じ予算から支払われるのに、何も残らない
Hがファインダーパターンを守ると思い込むどの誤り訂正レベルもそこを守らない。ファインダーパターンが覆われれば検出されない
クワイエットゾーンがないのを誤り訂正で乗り切ろうとするデコードが始まる前に検出が失敗するので、復元の余力は一度も使われない
現場でコードが失敗した後にレベルを上げるまずコントラスト、サイズ、照明を診断する。レベルが原因であることはまれ

Questions? Answered

最低でもQを、ロゴがコードのおよそ15%より広く覆うならHを使いましょう。ロゴは中央に、不透明な背景の上に置き、レベルHなら記号面積のおよそ20%以内に収めます。そうすれば、ロゴと同じ予算から支払われる印刷やカメラの誤りのために、復元の余力を残せます。

常にそうとは限りません。レベルを上げるとより多くの損傷を吸収できますが、データ容量が減るので、同じ内容でもより高いシンボルバージョンが必要になり、同じ印刷幅ではモジュールが小さくなります。長いURLを小さく印刷する場合、レベルMのほうがレベルHより確実にスキャンできることがよくあります。

いいえ。レベルは記号の形式情報にエンコードされ、コード全体の作られ方を決めるので、後から編集することはできません。新しいレベルでコードを作り直して刷り直してください。リンク先も変える必要があるなら、それは別の問題です。静的コードは固定のURLを指しています。

スキャナーは通常、誤ったデータを返すのではなく、読み取りの失敗を報告します。QRコードは、壊れたコードがもっともらしいけれど誤った値にデコードされる確率を下げるために、小さなシンボルサイズでは誤読を防ぐためのコードワードをわずかに確保しています。

いいえ。3つのファインダーパターン、タイミングパターン、クワイエットゾーンに誤り訂正はありません。スキャナーはデコードを始める前に、それらを頼りに記号を見つけて位置を合わせます。ですから1つでも覆うと、データ領域が完璧でレベルがHであっても、たいていコードはそもそも検出されません。

よくある原因は損傷ではなく、モジュールのサイズかコントラストです。レベルHはデータ容量を減らすので、同じ印刷幅では記号がより密になります。モジュールを1つ測ってみてください。印刷でおよそ0.4mmを下回ると、レベルにかかわらずスマホのカメラは苦戦します。コードを大きくするか、URLを短くしましょう。

ほとんどの作成ツールはレベルMを既定にしていて、これはおよそ15%を復元します。印刷にとって妥当な折り合いですが、思い込まずに確かめる価値はあります。Lを既定にするツールもありますし、ロゴを追加すると黙ってレベルを上げるツールもあり、それはシンボルバージョンと印刷時の密度を変えてしまいます。

ほとんどしません。レベルが高いとモジュールが増えるので、カメラはわずかに密なグリッドを解像し、デコーダーはわずかに長くリード・ソロモンの処理を回しますが、最近のスマホの性能では感じ取れる差ではありません。スキャンの速さを決めるのは、はるかに照明、ピントの距離、モジュールのサイズです。

いいえ。誤り訂正コードワードはデータから数学的に導かれるもので、独立した内容は持ちません。隠れた層を足しているように見えるもの、たとえば図形、色、装飾の重ね合わせは、2つ目のデータの経路ではなく、復元の余力を消費する装飾です。

KoloQRを選ぶ理由

  • ウェブサイト、メニュー、Wi-Fi、PDF、名刺用のQRコードを作成
  • 色・ロゴ・オリジナルの形をカスタマイズ
  • 高品質なPNG・SVGファイルをダウンロード
  • 印刷にもデジタルにも対応
QRコードを作成
シンプルな黒いQRコードと、同じコードをブランドカラーの円形にデザインし直したもの