返回

文章详情

用于光学字符识别的里德-所罗门码:脏乱印刷代码的错误纠正

Hacker News2026年6月26日 20:12

概述 本项目提供针对印刷代码、优惠券、身份证和标签的OCR优化错误纠正。目标是打印出带有里德-所罗门ECC和OCR安全奇偶校验文本的紧凑代码。当OCR错误读取一个或多个符号时,解码器可以检测到扫描的代码无效,识别出不一致的符号位置,并在错误数量在配置的里德-所罗门限制内时纠正原始消息。这在打印环境不理想时尤其有用。示例包括缺失针的点阵打印机、用尽墨水的色带、低分辨率打印、容易积聚污垢的标签,或任何在OCR读取之前印刷字符可能部分损坏的工作流程。这可以将OCR的可靠性提高到接近100%,前提是扫描质量足够好,OCR错误数量不超过纠正能力。 里德-所罗门错误纠正 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)字节,所以一个奇偶校验字节无法适配为一个OCR安全字符。实现方法将每个奇偶校验字节编码为两个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 ```

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡