読めなかった位置を「消失」として誤り訂正に渡し、遠近の歪みは射影変換で正します。画像を入れるだけで自動で復元します
すべての処理はブラウザ内で完結します。画像がサーバーへ送信されることはありません。
下のQRコードは、このページの中で生成した実物です(内容はすべて https://hashitosystem.com/、括弧内は誤り訂正レベル)。実写で起きる劣化を加えてあります。「この画像で試す」を押すと、そのまま読み込んで復元を試せます。
元画像のプレビューをドラッグして、擦り跡・白飛び・影で潰れている範囲を囲ってください。その範囲のモジュールは値を推測せず消失として誤り訂正に渡されます。消失は位置が分かっているぶん、位置不明の誤りの2倍まで訂正できます。
自動で格子が当たらないときの逃げ道です。下のチェックを入れてから、プレビュー上でQRコードの外周の角を左上 → 右上 → 右下 → 左下の順に4回クリックしてください。指定した四角形から射影変換で格子を作り、型番を総当たりします。
小さい画像は拡大すると1モジュールあたりの画素が増えて安定します。全体に薄い・白い擦り跡がある場合は平坦化(背景の明るさむらを割り算で除く処理)が効きます。変更したら「復元する」を押してください。
まだ結果はありません。左で画像を読み込むと、ここに復元結果が出ます。
実際に走った処理だけを、走った順に並べています。
スクリーンショットやカメラで撮った写真の中のQRコードが読み取れない——その多くは、擦れ・汚れ・白飛び・斜めからの撮影・低コントラストが原因です。本ツールは、市販のQRリーダーが捨ててしまう「どこが読めなかったか」という情報を最後まで持ち回り、リード・ソロモン符号の消失訂正に渡すことで、通常の読み取りでは届かない欠損からの復元を狙います。
リード・ソロモン符号は、1ブロックあたり n 個のコードワードのうち k 個がデータ、残り n-k 個が誤り訂正用です。ここで誤りの位置が分からない場合に直せるのは (n-k)/2 個までですが、位置が分かっている(消失)なら n-k 個まで直せます。ちょうど2倍です。
たとえばバージョン2・誤り訂正レベル M のQRコードは、全44コードワードのうち16個が誤り訂正用です。位置が分からなければ8個までしか直せませんが、位置が分かっていれば16個——全体の約36%——まで直せます。レベル H なら28個、全体の約64%です。本ツールは、擦り跡や白飛びでモジュールの明暗を決めきれなかった場所を確信度で順位づけし、下位から順に消失として扱う個数を掃引します。「誤りを消失に置き換える」交換を最適な点まで自動で探すため、消しすぎて訂正能力を使い切ることも、消し足りずに誤りを残すこともありません。
推測で当てた値がたまたまデコードできてしまうと、間違った内容を「復元できた」と表示してしまいます。本ツールは3つの検算を行います。
検算に通らなかった結果は破棄せず、「推測を含む」と明示したうえで解析案として提示します。内容が URL の場合は、開く前に必ず妥当性をご確認ください。
斜めから撮った写真のQRコードは台形に写ります。平行四辺形しか表せないアフィン変換では格子が合わないため、3つの位置検出パターンの中心に位置合わせパターンの中心を加えた4点から射影変換(homography)を解き、正対に直してからモジュールを読み取ります。
位置検出パターンが擦り跡に埋もれて2つしか見えない、1つしか見えない、という写真もあります。その場合は、見つかった1つからモジュールの大きさを求めて角の役割(左上/右上/左下)と型番と縮尺を総当たりする経路と、QRの外形四角形の4隅から格子を作る経路を試します。どの候補が正しいかはリード・ソロモン復号のシンドロームで機械的に判定できるため、候補を多めに出しても誤った結果を採用することはありません。それでも当たらない写真は必ずあるので、4隅を手で指定する操作も残しています。
二値化条件の掃引・格子候補の評価・消失位置の掃引は互いに独立なので、Web Worker に分けて並列に実行します。ワーカーは Blob から組み立てるため、このページは1つのHTMLで完結したままです。ワーカー数は端末の論理コア数から決め(上限4本)、いずれかが検算まで通った結果を出した時点で残りを打ち切ります。Web Worker が使えない環境では、同じ処理を逐次で実行します(結果は同じで、時間だけ長くなります)。
消失訂正を使っても、訂正できるのは1ブロックあたり n-k 個までです。誤り訂正レベル L のコードは全体の約21%、M は約36%、Q は約51%、H は約64%が上限で、これを超える欠損は原理的に復元できません。また、消失の位置を画像から特定できない種類の損傷(周囲と同じコントラストのままモジュールだけが別の値に変わっているなど)は、消失として扱えないため訂正能力が半分に戻ります。復元できなかった場合は、どこまで進んだか(位置検出パターンの検出数・格子の一致率・消失として扱ったコードワード数)を「処理の内訳」に表示します。
いいえ。画像の読み込み・遠近補正・二値化・誤り訂正・復号まで、すべての処理はお使いのブラウザ内(Canvas と JavaScript、Web Worker)で完結します。画像や読み取り結果が外部のサーバーへ送信・保存されることはありません。名刺やチケットなど、他人に見せたくない画像でも安心してお使いいただけます。
誤り訂正には「誤りの位置が分からない場合」と「分かっている場合」があり、後者を消失訂正と呼びます。リード・ソロモン符号では、位置が分からない誤りは (n-k)/2 個までしか直せませんが、位置が分かっている消失なら n-k 個まで直せます。つまり訂正できる個数がちょうど2倍になります。本ツールは、擦り跡や白飛びでモジュールが読めなかった場所を「消失」として記録し、その位置情報ごと復号器に渡します。市販のQRリーダーは読めなかった場所を捨ててしまうため、この差が復元できるかどうかの分かれ目になります。
分かります。リード・ソロモン復号のあとにシンドロームがゼロになるか、誤り訂正の能力をどれだけ使い残したか、終端以降の埋め草が規格どおりかの3つを機械的に検算しています。訂正能力に余力を残して復号できた場合は「検算済み」と表示します。能力を使い切って復号した場合は、結果が元のQRコードと一致する保証がないため「推測を含む」と明示します。この区別は隠しません。
斜めからの撮影は、3つの位置検出パターンと位置合わせパターンの4点から射影変換(homography)を解いて正対に直してから読み取ります。位置検出パターンが欠けている場合は、1つだけ見つかったパターンからモジュールの大きさを求めて向きと型番を総当たりする経路と、QRの外形四角形から4隅を求める経路を試します。それでも駄目な場合に備えて、プレビュー上をクリックして4隅を手で指定する機能を用意しています。自動で当てられない写真は必ずあるため、手動の逃げ道は残しています。
二値化条件の掃引・格子候補の評価・消失位置の掃引を Web Worker で並列に実行します。ワーカー数は端末の論理コア数から決め(上限4本)、いずれかのワーカーが検算まで通った結果を出した時点で残りを打ち切ります。Web Worker が使えないブラウザでは同じ処理を逐次で実行するため、結果は同じで時間だけ長くなります。