code wiki / (root) / nx_img_threshold_gate.nx

nx_img_threshold_gate.nx source

↩ module page · 46 lines · 2213 B

1// nx_img_threshold_gate.nx -- proves R2 (Otsu threshold + binarize) on hand-computed images: 2// A = bimodal [50 x3, 200 x3] -> Otsu picks 50, binarize -> 3 ink pixels 3// B = two clusters [10,20,30 | 220,230,240] -> Otsu picks 30 (splits dark from light) 4// Exit 0 iff all pass. license_tier: ORIGINAL 5import "nx_gate.nx" 6import "nx_img_threshold.nx" 7 8func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 { 9 if got == want { st[0] = st[0] + 1; gw(" PASS " as *u8); gw(name); gw("\n" as *u8) } 10 else { st[1] = st[1] + 1; gw(" FAIL " as *u8); gw(name); gw(" got=" as *u8); gn(got); gw(" want=" as *u8); gn(want); gw("\n" as *u8) } 11 return 0 12} 13 14func decode(src: *u8, pix: *u8, cap: i64, dims: *i64) -> i64 { 15 var len: i64 = 0; while src[len] != (0 as u8) { len = len + 1 } 16 return img_pgm_decode(src, len, pix, cap, dims) 17} 18 19func main() -> i64 { 20 let st: *i64 = sys_mmap(16) as *i64 21 st[0] = 0; st[1] = 0 22 let dims: *i64 = sys_mmap(64) as *i64 23 24 // -- A: bimodal 50/200 -- 25 let a: *u8 = "P2\n3 2\n255\n50 50 50\n200 200 200\n" as *u8 26 let pa: *u8 = sys_mmap(1024) 27 let na: i64 = decode(a, pa, 1024, dims) 28 chk("A decoded 6 pixels" as *u8, na, 6, st) 29 chk("A Otsu threshold = 50" as *u8, thr_otsu_of(pa, na), 50, st) 30 chk("A binarize -> 3 ink pixels" as *u8, thr_binarize(pa, na, 50), 3, st) 31 chk("A ink pixel (0,0) = 0" as *u8, img_get(pa, 3, 0, 0), 0, st) 32 chk("A paper pixel (2,1) = 255" as *u8, img_get(pa, 3, 2, 1), 255, st) 33 34 // -- B: two clusters (dark ~20, light ~230) -- 35 let b: *u8 = "P2\n3 2\n255\n10 20 30\n220 230 240\n" as *u8 36 let pb: *u8 = sys_mmap(1024) 37 let nb: i64 = decode(b, pb, 1024, dims) 38 chk("B decoded 6 pixels" as *u8, nb, 6, st) 39 chk("B Otsu threshold = 30 (splits dark from light)" as *u8, thr_otsu_of(pb, nb), 30, st) 40 chk("B binarize -> 3 ink pixels (the dark cluster)" as *u8, thr_binarize(pb, nb, thr_otsu_of(pb, nb)), 3, st) 41 42 gw("nx_img_threshold_gate: PASS=" as *u8); gn(st[0]); gw(" FAIL=" as *u8); gn(st[1]); gw("\n" as *u8) 43 if st[1] == 0 { gw("R2 nx_img_threshold: GREEN (Otsu binarization, integer-exact)\n" as *u8); return 0 } 44 gw("R2 nx_img_threshold: RED\n" as *u8) 45 return 1 46}