キャッシュレス決済、飲食店のメニュー、イベントのチケット。 気づけば毎日のように、僕たちはスマホをQRコードにかざしています。
そんなある日、僕はコンビニでクシャクシャになったレシートのQRコードを読み取りながら、ふと思いました。
「あれ、これ結構汚れてるのに、なんで一発で読めるんだ?」と。
普通に考えたら、コードの一部が潰れていたら「読み取りエラー」になりそうなものですよね。 そこで今回は、QRコードが多少汚れたり欠けたりしても読み取れる仕組みについて、エンジニア初学者でもわかるようにざっくり分解してご説明いたします!
目次
🔲 そもそもQRコードには何が書いてあるの?
🎯 結論:QRコードは「壊れる前提」で作られている
✏️ 仕組みの正体:リード・ソロモン符号
そもそも誤り訂正って?
連立方程式でイメージする
🧭 ついでに:3つの四角の正体
📊 誤り訂正レベル(L / M / Q / H)
💡 だから「ロゴ入りQRコード」が作れる
📝 まとめ
🙌 最後に
🔲 そもそもQRコードには何が書いてあるの?
QRコードは、ご存じのあの白と黒のマスの集まりです。 この1マス1マスを「モジュール」と呼びます。
- ⬛ 黒のモジュール →
1 - ⬜ 白のモジュール →
0
つまりQRコードは、見た目はただの模様ですが、中身は 0と1の羅列(=デジタルデータ) なんですね。 URLや文字列を、この白黒のパターンに変換して埋め込んでいるわけです。
こんなイメージです👇
ここで大事なポイントが1つあります。 実は、このマスの中には 「本来のデータ」だけでなく「復元用のデータ」も一緒に書き込まれている んです。 これが、汚れに強い秘密の正体になります。
🎯 結論:QRコードは「壊れる前提」で作られている
先に結論からいきます。
QRコードが汚れても読めるのは、最初から「一部が壊れること」を想定して、余分なデータを混ぜて記録しているからです。
- ❌ ありがちな勘違い:「汚れた部分をカメラが頑張って推測している」
- ✅ 実際:「壊れても元に戻せるように、あらかじめ予備データを埋め込んでいる」
カメラが画像処理で必死に補完しているわけではなく、データの作り方そのものが頑丈なんですね。 そして、この「壊れても元に戻す」を実現している技術が、次に紹介するリード・ソロモン符号です。
✏️ 仕組みの正体:リード・ソロモン符号
QRコードは、リード・ソロモン符号(Reed-Solomon code) という誤り訂正の仕組みを使っています。 1960年に発表された、CDやDVD、衛星通信などでも使われている由緒正しい技術です。
そもそも誤り訂正って?
誤り訂正(エラー訂正) とは、ざっくり言うと 「データが一部壊れても、自力で元に戻せるようにする技術」 のことです。
ポイントは、本来のデータに 「予備の情報(冗長データ)」を付け足して記録しておく こと。 この予備があるおかげで、一部が読めなくても残りから計算で復元できるわけです。
連立方程式でイメージする
イメージしやすいように、中学校で習った連立方程式で考えてみます。
未知数が2つ(xとy)あるとき、式が2本あれば答えが出せますよね👇
① x + y = 10 ② x − y = 2 → x = 6, y = 4
ここで、もし式を多めに4本用意しておいたとします。
① x + y = 10 ② x − y = 2 ③ 2x + y = 16 ④ x + 2y = 14
この状態なら、たとえ①と②が汚れて読めなくなっても、残った③と④だけで x と y が求められます。
リード・ソロモン符号がやっているのは、まさにこれです。 本来必要な分よりも多めの「式(予備データ)」をQRコードに埋め込んでおくことで、
一部のマスが汚れて欠けても → 残っているマスから計算して → 元のデータを復元できる
という仕組みを実現しています。 (実際には連立方程式そのものではなく「多項式」という数式を使いますが、"予備を多めに持たせて復元する"という発想は同じです。)
🧭 ついでに:3つの四角の正体
QRコードをよく見ると、3つの角に大きな四角い目印がありますよね。 これは 位置検出パターン(ファインダパターン) と呼ばれるものです。
役割はシンプルで、カメラに対して 「ここにQRコードがあるよ」「向きはこっちだよ」 を一瞬で伝えることです。
3つの角にあることで、QRコードが斜めになっていても、上下逆さまでも、向きを正しく判断できます。 「適当にかざしてもサッと読める」のは、この目印のおかげなんですね。
こんなイメージです👇
📊 誤り訂正レベル(L / M / Q / H)
実はQRコードには、「どれくらい壊れても復元できるか」のレベルが4段階あります。
レベル復元できる目安特徴
L:約 7%
予備が少なくデータを多く詰められる
M:約 15%
標準的なバランス
Q:約 25%
汚れやすい環境向け
H:約 30%最も頑丈
レベルが高いほどたくさん復元できますが、その分予備データが増えるので、同じ情報量でもQRコードのマスは多く(=模様は細かく)なります。
「汚れに強くしたい」のか「シンプルにしたい」のか、用途に応じて使い分けるわけですね。
💡 だから「ロゴ入りQRコード」が作れる
たまに、真ん中に企業のロゴが入ったQRコードを見かけませんか?
あれは魔法でもなんでもなく、この誤り訂正の仕組みを利用しています。
ロゴで隠れた部分は、QRコードからすれば「汚れて読めない部分」と同じ扱いです。 誤り訂正レベルを H(約30%復元) などに上げておけば、 真ん中をロゴで隠しても、残りのマスから元データを復元できる というわけです。
仕組みを知ると、街中のロゴ入りQRコードの見え方が少し変わるかもしれません。
📝 まとめ
- QRコードの中身は
0と1のデータ(白黒のマス=モジュール) - 最初から予備データを混ぜて記録している(壊れる前提の設計)
- リード・ソロモン符号で、欠けても残りから計算して復元できる
- 誤り訂正レベル(L〜H) で、どれだけ頑丈にするかを選べる
普段なにげなくかざしているQRコードも、「壊れてもいいように、あらかじめ余分に書いておく」というシンプルな発想で、あの頑丈さを実現しているんですね。
🙌 最後に
「誤り訂正」という考え方は、QRコードだけの特別な技術ではありません。 CD・DVD、通信、ストレージなど、データが壊れたり消えたりする可能性がある場所では、ほぼ必ず使われているとても重要な仕組みです。
もし「自分でも触ってみたい」という方は、 Pythonの qrcode ライブラリを使えば、誤り訂正レベルを指定してQRコードを生成して、実際にどこまで隠しても読めるか試すことができます。 仕組みを知ったうえで手を動かすと、理解が一気に深まるのでおすすめです!