プログラミング
OCR向けリード・ソロモン符号:汚れた印刷コードのための誤り訂正
Reed-Solomon for OCR: error correction for messy printed codes (github.com)
要約
このプロジェクトは、印刷されたコード、クーポン、ID、ラベルなどのOCRを最適化する誤り訂正機能を提供します。OCRが記号を誤読した場合でも、リード・ソロモン符号の誤り訂正能力の範囲内であれば、元のメッセージを検出・修正することができます。特に、ドットマトリックスプリンターやインク切れのプリンターなど、印刷環境が理想的でない場合にOCRの信頼性を向上させるのに役立ちます。
全文翻訳
OCR向けリード・ソロモン符号 概要
このプロジェクトは、印刷されたコード、クーポン、ID、ラベル向けのOCR最適化された誤り訂正機能を提供します。目標は、リード・ソロモンECC(誤り訂正符号)とOCRセーフパリティテキストを含むコンパクトなコードを印刷することです。OCRが1つ以上の記号を誤読した場合、デコーダーはスキャンされたコードが無効であることを検出し、どの記号位置に不整合があるかを特定し、誤りの数が設定されたリード・ソロモン符号の制限内であれば、元のメッセージを訂正することができます。これは、印刷環境が理想的でない場合に特に役立ちます。例としては、ピン抜けのあるドットマトリックスプリンター、インク切れ寸前のリボン、低解像度印刷、汚れが付きやすいラベル、またはOCRが読み取る前に印刷された文字が部分的に損傷する可能性のあるあらゆるワークフローが挙げられます。これにより、スキャン品質が十分でOCRの誤りの数が訂正能力を超えない限り、管理された印刷コードワークフローにおけるOCRの信頼性をほぼ100%に向上させることができます。
リード・ソロモン誤り訂正
ReedSolomonForOcrはGF(256)上でリード・ソロモン符号を実装しています。
記号サイズ: 8ビット
最大コードワード長: 255記号
エンコーディング形式: メッセージ + パリティ
訂正能力: floor(nsym / 2)までの未知の記号誤り
例えば、nsym=10の場合、10個のパリティ記号が追加され、最大5個の未知の記号誤りを訂正できます。
通常のバイト指向APIは、0〜255の範囲の整数記号で動作します。
```python
from importlib.util import module_from_spec, spec_from_file_location
spec = spec_from_file_location("reed_solomon_ocr", "reed-solomon-ocr.py")
module = module_from_spec(spec)
spec.loader.exec_module(module)
ReedSolomonForOcr = module.ReedSolomonForOcr
rs = ReedSolomonForOcr(nsym=10)
message = ReedSolomonForOcr.bytes_to_symbols(b"HELLO-123")
codeword = rs.encode(message)
is_valid = rs.check(codeword)
decoded = rs.correct(codeword)
assert is_valid
assert decoded == message
```
OCRセーフ文字
OCRの誤りは、しばしば似たような文字から生じます。混乱を避けるために文字セットを減らす場合、各類似グループから最も特徴的な文字を選択してください。
推奨される英数字の選択肢:
0とOの場合: どちらも残さない。0とOの両方を削除する。
1、I、lの場合: 数字の1のみを残す。大文字のIと小文字のlを削除する。
2とZの場合: 数字の2を残す。大文字のZを削除する。
5とSの場合: 数字の5を残す。大文字のSを削除する。
8とBの場合: 数字の8を残す。大文字のBを削除する。
6とGの場合: 数字の6を残す。大文字のGを削除する。
VとUの場合: 大文字のUを残す。大文字のVを削除する。
究極のセーフ文字リスト:
安全な数字: 2 3 4 5 6 7 8 9
安全な文字: A C D E F H J K L M N P Q R T U W X Y
このコーデックは、パリティテキストにこのOCRセーフアルファベットを使用します: 23456789ACDEFHJKLMNPQRTUWXY
リード・ソロモン記号はGF(256)バイトであるため、1つのパリティバイトは1つのOCRセーフ文字に収まりません。実装では、各パリティバイトを2つのOCRセーフ文字としてエンコードします。
使用方法
OCRセーフパリティでのエンコード
```python
rs = ReedSolomonForOcr(nsym=10)
message = ReedSolomonForOcr.bytes_to_symbols(b"HELLO-123")
message_symbols, safe_parity = rs.encode_with_ocr_safe_parity(message)
print(message_symbols)
print(safe_parity)
```
両方を印刷または保存:
message_symbols: 元のメッセージ記号
safe_parity: OCRセーフパリティ文字
OCRセーフパリティからのコードワード再構築
```python
codeword = rs.codeword_from_ocr_safe_parity(message_symbols, safe_parity)
assert rs.check(codeword)
```
OCRセーフパリティで破損したメッセージを訂正
```python
corrupted_message = message_symbols[:]
corrupted_message[0] ^= 0x55
decoded = rs.correct_with_ocr_safe_parity(corrupted_message, safe_parity)
assert decoded == message
```
バイトヘルパー
```python
symbols = ReedSolomonForOcr.bytes_to_symbols(b"ABC123")
data = ReedSolomonForOcr.symbols_to_bytes(symbols)
```
互換性ラッパー関数
このモジュールはラッパー関数も公開しています:
```python
codeword = module.rs_encode_msg(message, nsym=10)
decoded = module.rs_correct_msg(codeword, nsym=10)
message_symbols, safe_parity = module.rs_encode_msg_with_ocr_safe_parity(message, nsym=10)
decoded = module.rs_correct_msg_with_ocr_safe_parity(message_symbols, safe_parity, nsym=10)
```
デモとテストの実行
```bash
python3 main.py
python3 -m unittest -v
```