このサイトは、ほんの入り口です

ここにあるのは、だれかが実際に調べ、考え、作ってきたことを集めたメモです。気になったら、ページの下の「参考にした情報源」から、もとの本や記事、それを生み出した人たちに、直接ふれてみてください。このメモには書ききれないおもしろさが、そこにあります。

QRコードは、よごれても どうして よめるの? ── さいしょから よぶんな じょうほうを もって いる

QRコードが汚れても読める理由 ── 余分な情報を持つ「誤り訂正」と、大きさとのトレードオフ

QRコードはどう誤りを直す? ── リード・ソロモン符号と訂正レベル

分野:技術

QRコードの すみが すこし よごれても、スマホが ちゃんと よめる ことが あります。

その ひみつは、さいしょから よぶんな じょうほうを いっしょに もたせて いる ことです。よぶんを もつと、なにが おきるのか。かわりに、なにを あきらめて いるのか。しらべました。

QRコードは、少し汚れたり欠けたりしていても、スマホで読めることがあります。理由は、はじめから余分な情報を一緒に持たせているからです。

その仕組みの「誤り訂正」と、余分を増やすほどコードが大きくなるという代償、それに「30%隠せる」という説明がなぜ面積の話ではないのかを、公式の資料などでたどります。

QRコードは、リード・ソロモン符号による誤り訂正で、一部が汚れても復元できる[1][2]。訂正レベルはL・M・Q・Hの4段階(約7%・15%・25%・30%とされる)で、上げるほどコードが大きくなる[1][7]。この率は「全コードワードに対する比」であり、面積の割合ではない[1][3]。公式資料と個人の検証を突き合わせて、この違いを整理する。

読み方を切り替えられます。画面の上にある「よみかた」のボタンで、小学校低学年むけ・小学校高学年むけ・中学生むけの3つの書き方に切り替わります。むずかしいと思ったら、いつでもやさしい方に戻ってください。選んだ読み方はブラウザが覚えているので、次に別の記事を開いたときも同じ読み方で始まります。

1. すこし よごれても、なぜ よめる?

1. 汚れていても読めるのは、答えを一部だけ隠したような状態だから

1. 汚損しても読める理由 ── 情報に冗長性を持たせている

カバンに 入れて いた ちらしの QRコードが、ちょっと よごれて いた。それでも スマホを かざすと、ちゃんと ページが ひらいた。

ふつうの 文字は、1つ 読めないと、いみが かわって しまう ことが あります。QRコードは ちがいます。さいしょから、おなじ じょうほうを たしかめる ための「よぶんな 部分」を、いっしょに 入れて いるのです。

この 章の こたえは、それだけです。どう よぶんを つくるのか、なにを ひきかえに して いるのかは、あとの 章で 見て いきます。

チラシの角に指の跡がついたQRコードでも、スマホをかざすと読めることがあります。ふつうの文字は、一部が読めなくなると意味が変わってしまうことがあります。QRコードは、そうならないように作られています。

はじめから、本来のデータに加えて、間違いを見つけて直すための余分なデータを一緒に記録しているのです。少し欠けても、残った部分から元のデータを計算で取り戻せます[1]。

では、その余分はどう作られ、何と引き換えなのか。2章以降で順にたどります。

QRコードは、本来のデータに加えて、誤りを検出・訂正するための冗長なデータを併せて記録している。一部が汚れや欠けで読めなくなっても、残りから元のデータを計算で復元できる[1]。誤りを直す仕組みは、CD・DVD・衛星通信などにも使われているリード・ソロモン符号である[2]。

以下では、(1)開発の経緯、(2)冗長性の作り方、(3)符号の性質、(4)訂正レベルと大きさ、(5)「30%」の意味、の順に、複数の資料を突き合わせて確かめる。

2. どうして QRコードは できたの?

2. 1994年、2人の開発チームが作ったQRコード

2. 1994年の開発と規格化 ── バーコードの約20文字を超えるために

QRコードは、1994年に 日本の デンソーという 会社で うまれました[5]。作ったのは、原さんたち たった 2人の チームです。

そのころの バーコードには、入れられる 文字が 20文字ぐらい しか ありませんでした。しかも はたらく 人は、1日に 1000回ほど よみとって いたと つたえられて います[5]。

QRコードは、およそ 1年半で できあがりました。数字なら 7000文字ぐらい、漢字も 入れられます[5]。

たくさん 入れられる ぶん、ちいさな きずで よめなく なっては こまりそうです。よぶんな じょうほうの ひみつは、次の 章です。

QRコードは1994年、デンソー(現在のデンソーウェーブ)で、原昌宏さんらの2人のチームが開発しました[5]。

当時のバーコードは、英数字で入れられるのが最大で20文字ほどでした。作業をする人は1日に約1000回も読み取っていたと、開発の紹介ページに書かれています。開発を始めてから完成まで、約1年半かかりました。数字なら約7000文字、漢字も表せます[5]。

このQRコードは、規格として公開されました。1997年にAIMの規格、1999年にJIS、2000年にISO/IEC 18004になっています。規格になった範囲では、特許の権利は行使しないと宣言されています[6]。

これだけ多くの情報を入れられるなら、読めなくなったときの備えも大事になりそうです。次の章で、その備えをのぞきます。

QRコードは1994年、デンソー(現デンソーウェーブ)の原昌宏らの2人のチームが開発した。当時のバーコードは英数字で最大約20文字で、作業者は1日約1000回の読み取りをしており、開発開始から約1年半で完成した。数字で約7000文字、漢字も表現できる[5]。

規格化は、1997年にAIM規格、1999年にJIS、2000年にISO/IEC 18004の順に進んだ。規格化された範囲については特許権を行使しないと宣言されている[6]。位置検出パターンなど読み取りの仕組みの経緯は別のメモ(QRコードの開発秘話のメモ)にあるので、ここでは扱わない。

扱える情報量が約20文字から数千文字に増えるほど、一部が読めないときの影響も大きくなる。この増えた量を守る仕組みが次章の主題である(この動機が開発当時のものかどうかは、上の資料には書かれていない)。

3. よぶんな じょうほうって、どんな もの?

3. 余分の作り方 ── データ100個に、訂正用を100個そえる

3. 冗長性の量 ── t個の誤りを直すために2t個の訂正用コードワード

たとえば、3、5、2という 3つの 数字を おぼえて もらうと します。ここへ 合計の「10」を そえて おきます。

もし 5が よごれて 見えなく なっても、10から 3と 2を ひけば、5だと わかります。よぶんな 1つの おかげで、なくなった ものを 計算で もどせました。

QRコードの よぶんな じょうほうも、じつは こんな かんがえ方です。ただし 本当の しくみは、もっと むずかしい 計算を つかって います。この 合計の 話は、あくまで ひとつの たとえです。

公式の ページの れいでは、データが 100こ あって、そのうち 50こ まちがっても 直せるように するには、よぶんな じょうほうを 100こ そえる ことに なると 書かれて います[1]。100このデータに 100この よぶん。ぜんぶで 200こに なります。

たとえば、3、5、2の3つの数字を覚えてもらうときに、合計の「10」を添えておくとします。5が汚れて見えなくなっても、10から3と2を引けば5だと分かります。余分な1つのおかげで、失われた数を計算で取り戻せました。

実際の仕組みはもっと複雑で、この合計の話は一つのたとえにすぎません。それでも「余分を持たせておいて、欠けたところを計算で埋める」という考え方は同じです。

QRコードの公式ページには、次の例があります。データが100個あって、そのうち50個の誤りを直せるようにするには、リード・ソロモン符号の場合、その2倍の100個の訂正用データが必要になります。全体は200個で、そのうち50個まで直せるので、訂正率は50÷200で25%です[1]。

この「個」は、QRコードでは「コードワード」と呼ばれる単位で、1個が8ビット分です[1]。

誤り訂正の基本は、元のデータに冗長な記号を付け足し、欠けや誤りを計算で復元することである。3、5、2に合計10を添えれば、5が読めなくてもそれを求められる、という例が最も単純である(この例は説明のために作ったもので、実際の符号とは異なる)。

QRコードの公式ページの例では、データコードワード100個のうち50個を訂正するには、リード・ソロモン符号で50×2=100個の訂正用コードワードが必要で、全体200個のうち50個、つまり25%(レベルQ相当)になる[1]。1コードワードは8ビットである[1]。

訂正率を「全コードワードに対する比」で示す理由について、公式ページは、汚れや破損がデータ部分だけに起きるとは限らないためだと説明している[1]。この点は5章の「面積との違い」で再び出てくる。

4. まちがいを なおす けいさんは だれが つくった?

4. 1960年に作られた、リード・ソロモン符号

4. リード・ソロモン符号 ── シンボル単位の符号が連続した破損に強い理由

この 計算の しくみは「リード・ソロモン ふごう」と よばれます。1960年に、リードさんと ソロモンさんが つくったと 言われて います[2]。

QRコードの ためだけに うまれた ものでは ありません。CDや DVD、うちゅうと 地きゅうの あいだの つうしんなどにも つかわれて いる とされます[2]。

この ふごうは、1ビットずつ ではなく、いくつかを ひとまとめに した「かたまり」で あつかいます。だから、となりあった ところが まとめて よごれるような ときにも つよいと 言われます[2]。

QRコードでは、この かたまりが 8ビットで 1つです[3]。

この計算法は、リード・ソロモン符号と呼ばれ、1960年にリードとソロモンによって開発されたとされています[2]。CDやDVD、衛星通信、そしてQRコードなどに使われています[2]。

この符号は、ビットを1つずつではなく、いくつかまとめた「シンボル」を単位にして扱います。そのため、隣り合った場所がまとめて壊れる「連続した破損」に強いと説明されます[2]。QRコードのコードワードが、このシンボルにあたります[3]。

t個のシンボルの誤りを直すのに、2t個の訂正用シンボルが必要になります[2]。前の章の「50個直すのに100個」は、この関係のとおりです。

汚れは、指でこすったように、まとまって起きることが多そうです。ただ、連続した破損に強い性質と、QRコードでこの符号が採用された理由は、別の問いです。

リード・ソロモン符号は1960年にリードとソロモンが開発した。t個のシンボル誤りを訂正するには2t個の冗長シンボルが必要で、CD・DVD・衛星通信・QRコードなどに使われる[2]。ビット単位でなくシンボル単位で扱うため、連続した破損(バースト誤り)に強いとされる[2]。QRコードのシンボルは8ビットのコードワードである[3]。

前章の例(訂正50個に訂正用100個)は、t=50、2t=100に対応する(自分の計算)。この符号の数学(有限体上の多項式)は、このメモでは扱わない。数学に踏み込むなら、Wikipediaの記事[2]から一次の文献をたどれる。

なお、この符号が連続した破損に強いことと、QRコードで採用された理由は別の問いである。

5. よぶんを ふやすと、どうなる?

5. 訂正レベルは4段階、上げるほどコードは大きくなる

5. 訂正レベルL・M・Q・Hとバージョン ── 復元力と大きさのトレードオフ

QRコードには、よぶんの 多さを えらぶ 4つの レベルが あります。L、M、Q、Hです。ふやすほど、およそ 7%、15%、25%、30%の ぶんまで、なおせると されて います[1]。ふつうは Mが よく つかわれると 言われます[1]。

でも、よぶんを ふやせば、入れる ものが ふえます。すると QRコードは 大きく なります[1]。

QRコードの 大きさは、たてよこの マスの 数で きまります。いちばん ちいさい ものは 21×21マス、いちばん 大きい ものは 177×177マスです[7]。マスの 数で いうと、およそ 71ばいの ちがいです(21×21は 441、177×177は 31329)。

つよさを えらぶか、ちいささを えらぶか。どちらも とれる わけでは ありません。

QRコードの誤り訂正には、L・M・Q・Hの4段階があります。訂正できる割合は、およそ7%・15%・25%・30%とされます[1]。レベルを上げるほど復元の力は強くなりますが、データが増えて、コードは大きくなります[1]。一般には、Mがよく使われるといわれます[1]。

コードの大きさは「バージョン」で決まり、1から40まであります。バージョン1は21×21マス、バージョン40は177×177マスで、1つ上がるごとに1辺が4マスずつ増えます[7]。マスの総数は441から31329で、約71倍です。

入れたいデータの種類と量、誤り訂正のレベル、バージョンの3つで、収まるかどうかが決まります。たとえば、数字100桁をレベルMで入れると、バージョン3(29×29マス)になります[7]。

ここには、はっきりした引き換えがあります。汚れに強くするなら、同じ内容でもコードが大きくなります。小さく印刷したいなら、訂正の余裕を減らすことになります。

訂正レベルはL・M・Q・Hの4段階で、復元能力はおよそ7%・15%・25%・30%とされる[1]。レベルを上げると復元力は上がるがデータが増え、コードは大きくなる。一般にはMがよく使われるといわれる[1]。

バージョンは1〜40の40種類で、バージョン1は21×21セル、バージョン40は177×177セルである。1段階ごとに1辺が4セル増える(21+4×39=177)[7]。総セル数は441から31329で、約71倍(自分の計算)。データの種類・誤り訂正レベル・バージョンで容量が決まり、例としては数字100桁をレベルMで入れるとバージョン3(29×29)になる[7]。

まとめると、冗長性を増やすほど(レベルを上げるほど)、同じデータを入れるのに必要なセル数が増える。復元力と大きさは、同時には満たしにくいトレードオフである。

6. 「30%かくせる」は、どこの 30%?

6. 「30%隠せる」は面積の話ではない

6. 「Hなら30%隠せる」の誤解 ── 面積ではなくコードワード比

「レベルHなら 30%まで かくしても よめる」と いう せつめいを 聞く ことが あります。これは 本当に、QRコードの 見た目の 30%を かくせる、と いう ことでしょうか。

公式の ページでは、この 30%は、ぜんぶの かたまり(コードワード)の うち、どれだけ なおせるか、の わりあいです[1]。面積めんせきの わりあいでは ありません。

ある 人の しらべでは、レベルHで ロゴを 大きめに のせても 読めたのに、レベルLで ほぼ おなじ 広さを おおうと 読めなかった、と 書かれて います。三つの すみに ある 四角い もようなどは、なおす ものに 入らないので、かくすと 読めないそうです[4]。ただ、これは 1人の けんしょうなので、いつでも そうなるとは 言いきれません。

「レベルHなら30%まで隠しても読める」という説明を耳にすることがあります。この30%は、見た目の面積の30%のことでしょうか。

公式ページによると、誤り訂正率は「全コードワードに対する比率」で表されます。汚れや破損が、訂正用のコードワードだけに起きるとは限らないからです[1]。数えるのは、コードワードの数であり、面積ではありません[3]。

ある個人の検証では、レベルHでロゴの一辺をQRコードの40%(覆う面積は約21%)にしたら読めましたが、レベルLで一辺40%(約23%)にすると読めませんでした。覆った面積は約2割で同じくらいなのに、結果が逆になったことになります。書き手は、レベルLでは型番(バージョン)が下がり、ロゴが位置検出パターンにかかったことが失敗の理由だと述べています。また、三隅の位置検出パターンやタイミングパターンは誤り訂正の対象外で、覆うと読めなくなる、とも書かれています[4]。

これは1人の検証結果で、条件によって結果は変わるはずです。「必ずこうなる」という法則としては読まないほうがよさそうです。

「レベルHなら30%隠せる」は、面積の話としては誤解されやすい。公式ページは、訂正率を全コードワードに対する比で示している。汚損がデータ部分だけに限られるとは限らないためである[1]。1コードワードは8ビットで、復元率は画像の面積割合ではなくコードワード単位である[3]。

個人の検証(Qiita)では、レベルHでロゴの一辺40%(覆う面積21.1%)はデコードに成功し、レベルLで一辺40%(23.3%)は失敗した。同程度の面積を覆っても結果が逆になりうる。書き手は、レベルLではバージョンが下がり、ロゴが位置検出パターンにかかったことが失敗の理由だと述べている。また、三隅の位置検出パターンとタイミングパターンは誤り訂正の対象外で、覆うと読めない[4]。ただし、この検証は個人による一つの条件での結果であり、一般法則として断定はできない(面積の計算方法の詳細も本文では確認していない)。

コードワードのどこが壊れるかで、結果が決まる。同じ面積でも、壊れる場所によって結果が変わりうるという読み方が、資料とは矛盾しない。

7. じぶんでも かんがえて みよう

7. 自分でも調べてみたくなったら

7. 自分でも調べてみたくなったら

QRコードを、つくる がわに なったつもりで、かんがえて みましょう。

  1. のりものの なかに はる、ちいさな シールの QRコードなら、Lと Hの どちらに しますか。りゆうも かんがえます。
  2. お店の 大きな かんばんに のせる QRコードなら、どちらでしょう。かんばんは 雨や ほこりで よごれるかも しれません。
  3. データが 100こで、50こ まで なおせるように するには、よぶんな データは いくつ いりますか。答えは 3章に あります。

くらべて みると、「つよく したい」ことと「ちいさく したい」ことが ぶつかる ことに 気づきます。

QRコードの こうしきの ページ(デンソーウェーブ)は 日本語で よめます[1]。

QRコードを作る側の立場で、次のことを考えてみてください。

  1. 電車の中に貼る小さなシールと、お店の大きな看板とでは、L・M・Q・Hのどのレベルが向いているか。理由も添えて考える。
  2. データ100個を、150個まで直せるようにするには、訂正用データはいくつ必要か。2t個の関係を使って計算する。
  3. 「30%隠せる」という説明を見たとき、何の30%なのかを確かめる。

日本語で読める資料は、デンソーウェーブの「QRコードドットコム」(誤り訂正・バージョン・歴史のページ)[1][7][6]と、開発の紹介ページ[5]です。QRコードの開発や位置検出パターンの話は別のメモにあります。

このメモで扱ったことは、机の上で確かめられる。

  1. 公式ページ[1]の例(データ100個・訂正50個・訂正用100個)を、2t個の関係から自分で再計算する。訂正用がデータの2倍のとき、全体に対する割合は何%か(自分の計算では、訂正50個÷全体200個で25%)。
  2. レベルQの25%が、全コードワードのうち何個を直せる数字なのかを、バージョンごとの総コードワード数(公式ページ[7]などで確認)と照らして考える。
  3. 紙に10×10の100マスを描き、データ用70マスと訂正用30マスに塗り分ける。訂正できる割合(30%)と、隠せる面積の割合は別のものだと、マスの位置をずらして考えてみる。
  4. Qiitaの検証[4]の条件(ロゴの位置・大きさ・使ったリーダー)を読み、同じ結果がなぜ他の条件では変わりうるかを考える。

日本語の一次資料は、デンソーウェーブのQRコードドットコム(誤り訂正[1]・バージョン[7]・歴史[6])と、開発の紹介ページ[5]である。

QRコードの開発秘話や位置検出パターンの話は、別のメモに書いた。

しらべた ところ

参考にした情報源

参考にした情報源

出典について:QRコードドットコムとデンソーウェーブの資料は開発元による公式の解説、ウィキペディアは百科事典サイト、QR WORLDは民間企業の解説ページ、Qiitaは個人の検証記事です。個人の検証は一つの条件での結果として扱いました。

  1. QRコードドットコム(デンソーウェーブ)「誤り訂正機能について」。 https://www.qrcode.com/about/error_correction.html (訂正率は全コードワードに対する比、100個・50個の例、レベルと大きさ)
  2. Wikipedia日本語版「リード・ソロモン符号」。 https://ja.wikipedia.org/wiki/リード・ソロモン符号 (1960年の開発、2t個の冗長シンボル、使われている場面)
  3. QR WORLD「QRコードの誤り訂正機能とは?」。 https://qr.c-cloud.co.jp/articles/knowledge/error-correction (1コードワード=8ビット、面積でなくコードワード単位)
  4. Qiita「ロゴ入りQRコードの「Hなら30%隠せる」は、たぶん間違いです」。 https://qiita.com/hashito/items/7d7bf6f84bddbfe5f0fb (個人の検証:レベルH・Lでロゴを重ねた結果、対象外の部分)
  5. デンソーウェーブ「QRコード開発」。 https://www.denso-wave.com/ja/technology/vol1.html (1994年の開発、バーコードの約20文字、2人のチーム、約1年半)
  6. QRコードドットコム「道のり」。 https://www.qrcode.com/history/ (規格化の年、権利行使をしない宣言)
  7. QRコードドットコム「バージョン」。 https://www.qrcode.com/about/version.html (バージョン1〜40、セル数、容量の例)

なおした ところ

更新履歴

更新履歴(改版の記録)

  •  初版を公開。

このサイトでは、公開した記事の本文は原則として書き直しません。誤りが見つかったときや、内容が古くなったときだけ手を入れ、その理由をこの欄に残します。