製造ラインのトレーサビリティで毎日使う記号を、作る・撮る・読む・格付けする・
「どこまで劣化しても読めるか」を確率で言う、までを 1 つの鎖にした層です
(台帳は opssymbol.py、numpy と scipy のみ。zxing-cpp は optional)。
encode_barcode1d(EAN-13 / UPC-A / Code 128・GS1-128 / Code 39 / ITF)/
ean_check_digit / barcode_scan_profiles / decode_barcode_profile / read_barcode1d。qr_encode / qr_decode_modules / qr_locate / qr_sample / qr_read、
dm_encode / dm_decode_modules / dm_locate / dm_sample / dm_read(Data Matrix ECC200)。
Reed-Solomon は自前(symrs.py)で、ブロックごとに直した語数を返す。render_symbol(印字のにじみ・刻印の点・回転・あおり、面積で積分)/
capture_degrade(照明の傾き・周辺減光・デフォーカスの一様円・動きぶれ・ガウス・
ショット雑音・読み出し雑音・量子化)。grade_barcode_profile / grade_barcode1d(ISO/IEC 15416 の考え方)/
grade_datacode2d(ISO/IEC 15415 の考え方)。symbol_read / symbol_read_trials / symbol_read_pod: 物理劣化を 1 つ
掃引し、MIL-HDBK-1823A の hit/miss(既存の pod 族)で「90 % 読める劣化量」とその
95 % 信頼の保守側を返す。read_symbols_zxing(zxing-cpp、Apache-2.0、pip install zxing-cpp。
無ければ ImportError。黙って自前の読み取り器に切り替えない)。flowchart TD
ENC["encode_barcode1d / qr_encode / dm_encode<br/>シンボルの表(真値 = 文字列)"]
ENC --> R["render_symbol<br/>印字・回転・あおり"]
R --> C["capture_degrade<br/>照明・ぼけ・雑音"]
C --> IMG["image2d"]
IMG --> RD["read_barcode1d / qr_read / dm_read<br/>(read_symbols_zxing)"]
IMG --> GR["grade_barcode1d / grade_datacode2d<br/>等級 A..F と制限するパラメータ"]
ENC --> TR["symbol_read_trials<br/>劣化を掃引 x 試行(成功 / 誤読 / 不能)"]
TR --> POD["symbol_read_pod<br/>level90 / level90_95・誤読の上限"]
import numpy as np
import fullseye as fs
sym = fs.ledger.encode_barcode1d("490123456789", "ean13") # 検査数字は自動 → 4901234567894
img = fs.ledger.render_symbol(sym, 3.0, rotate_deg=20.0) # モジュール 3 px、20° 回転
img = fs.ledger.capture_degrade(img, defocus_px=4.0, full_well_e=20000.0,
read_noise_e=10.0, bits=8, seed=1)
print(fs.ledger.read_barcode1d(img, ("ean13",))["text"]) # 4901234567894
print(fs.ledger.grade_barcode1d(fs.ledger.render_symbol(sym, 6.0))["letter"]) # A
tr = fs.ledger.symbol_read_trials(sym, "defocus_px", np.linspace(2, 16, 8), trials=30,
module_px=3.0, refine=True, level_jitter=0.05)
pod = fs.ledger.symbol_read_pod(tr)
print(pod["level90"], pod["level90_95"], pod["misread_total"])
symbol_read_trials は表の体系だけを
有効にする。現場でも使う体系だけを有効にしてください。examples/poc_symbol_package_1d.py)。symbol_read_pod は傾きの無い曲線を
作らず、全数成功の実証(29/29 の論法)を返す。symbol_read_pod は monotone = False の旗を立てる(examples/poc_symbol_part_dpm.py)。Copyright (c) 2026 Kazufumi Furuse. Licensed under the Apache License, Version 2.0.