QRコードのマスクパターンとは?8種類の役割と選ばれ方

QRコードを画像として眺めていると、同じ文字列を入れても模様が毎回違って見えることがあります。これは マスクパターンと呼ばれる処理の結果です。この記事では、マスクがなぜ必要なのか8種類の条件式どうやって1つが選ばれるのか、そして読み取り側がどう元に戻すのかを順に整理します。

結論から:マスクは「読みにくい模様を避けるために、決まった位置のマスを白黒反転させる処理」です。8種類の候補それぞれでペナルティ点を計算し、もっとも点が低い1つが採用されます。どれを使ったかは形式情報に記録されるので、読み取り側は同じ操作をもう一度かけるだけで元に戻せます。

1. なぜマスクが必要なのか

QRコードのデータ領域は、入力した文字列と誤り訂正符号をそのまま白黒のマスに並べたものです。ここで問題になるのが、並べた結果として現れる模様です。

入力する文字列は選べません。「abcabcabc…」のような繰り返しを入れれば、そのまま規則的な模様が出ます。そこで、データそのものは変えずに、見え方だけを崩す手段が必要になります。それがマスク処理です。

2. マスクは可逆な反転処理である

マスク処理がやっていることは単純です。マスの位置(行 i、列 j)を決まった式に入れ、条件が成り立つマスだけ白黒を反転します。データを暗号化しているのではなく、位置で決まるパターンを重ねているだけです。

同じ式をもう一度かければ、反転したマスがもう一度反転して元に戻ります。2回かけると元に戻るため、読み取り側は特別な逆算をせずに復元できます。

重要なのは対象範囲です。マスクがかかるのはデータと誤り訂正符号の領域だけで、次の部分には一切かかりません。

これらはコードの位置・向き・大きさを検出するための目印なので、反転させてしまうと読み取りの起点が失われます。

3. 8種類の条件式

マスクパターンは0番から7番までの8種類が決められています。行を i、列を j として、次の条件が真になるマスを反転します。i と j はコードの左上を (0, 0) として数えます。

0番:(i + j) mod 2 = 0
1番:i mod 2 = 0
2番:j mod 3 = 0
3番:(i + j) mod 3 = 0
4番:(i div 2 + j div 3) mod 2 = 0
5番:(i × j) mod 2 + (i × j) mod 3 = 0
6番:((i × j) mod 2 + (i × j) mod 3) mod 2 = 0
7番:((i + j) mod 2 + (i × j) mod 3) mod 2 = 0

ここで div は小数を切り捨てる整数の除算、mod は割った余りです。式を見ると、それぞれが違う「崩し方」を担当していることが分かります。

8種類を用意しているのは、どんな入力でも必ず1つは相性の良いものがあるようにするためです。1種類しかなければ、その模様と元データの模様が重なって最悪の結果になる入力が必ず存在します。

4. どうやって1つが選ばれるのか

エンコーダは8種類すべてを実際に適用し、それぞれについてペナルティ点を計算します。点が低いほど読みやすい模様であり、最小の点だったマスクが採用されます。

ペナルティは次の4つの観点で加算されます。

  1. 同じ色の連続:行または列に同じ色が5マス以上続くと減点されます。長く続くほど点が増えます。前述の「マスの境目を数え間違える」問題への対策です。
  2. 同色の 2×2 ブロック:同じ色が四角く固まると減点されます。塊が大きいほど二値化がずれやすくなります。
  3. 位置検出パターンに似た並び:1対1対3対1対1の比率を持つ並びが行または列に現れると、大きく減点されます。これはコードの角を誤認させる原因になるためで、4つの中でもっとも重い減点です。
  4. 白黒の比率の偏り:コード全体の黒マスの割合が50%から離れるほど減点されます。全体が白寄り・黒寄りになると、明暗の基準が取りにくくなります。

この評価はコードの見た目だけを見ており、中身の文字列は関係ありません。だから「同じ文字列でも誤り訂正レベルを変えると別のマスクが選ばれる」ということが起こります。誤り訂正符号の中身が変われば、並ぶ模様も変わるためです。

5. 読み取り側はどう戻すのか

読み取り側は、形式情報を先に読みます。形式情報は位置検出パターンのすぐ隣にある15ビットの領域で、次の2つが入っています。

残りのビットは、この5ビットを守るための誤り訂正符号とマスクです。形式情報そのものが読めなければ何も始まらないため、形式情報はコード内に2か所置かれています。片方が汚れても、もう片方から読めます。

手順としては、①形式情報からマスク番号を得る、②同じマスクをデータ領域にもう一度かけて元の並びに戻す、③誤り訂正符号で誤りを直す、④データを復号する、という順になります。

6. 実務で知っておくと役に立つこと

まとめ

マスクパターンは、QRコードを機械にとって読みやすい模様に整えるための可逆な処理です。8種類の候補から、同色の連続・塊・紛らわしい並び・白黒比率という4つの観点でもっとも点の低いものが自動的に選ばれ、その番号が形式情報に記録されます。

ブラウザ上で実際にQRを作って確かめたい場合はQRコード生成を、読めないコードの中身や構造を調べたい場合はQRコード解析QRコード復元を使えます。関連する解説としてQRの型番とモジュール数位置検出パターン誤り訂正もあわせてお読みください。

よくある質問(FAQ)

マスクパターンは自分で選べますか?

仕様上は8種類のうち任意の1つを使えます。ただし通常のエンコーダは8種類すべてを試し、ペナルティ点が最小のものを自動的に選びます。手で固定すると読み取り率が下がることがあるため、特別な理由がなければ自動選択に任せるのが安全です。

マスクをかけると元のデータは失われませんか?

失われません。マスクは決まった位置のモジュールを白黒反転させるだけの可逆な処理です。どのマスクを使ったかは形式情報に記録されており、読み取り側は同じマスクをもう一度かけることで元の並びに戻せます。

位置検出パターンにもマスクはかかりますか?

かかりません。マスクの対象はデータと誤り訂正符号が入る領域だけです。位置検出パターン、位置合わせパターン、タイミングパターン、形式情報、型番情報といった機能パターンは反転されません。これらが反転すると、コードの位置や向きを検出できなくなるためです。

← 技術ブログ一覧へ戻る