Skip to content

Document + pin F017: zhang_suen erases isolated 2x2 blocks An isolated 2x2 block is a genuine divergence point between the parallel algorithms and matters for small-blob masks (marker remnants, dotted-line dashes, segmentation specks). All four block pixels satisfy the zhang_suen deletion gate (B == 3, A == 1, both sub-iteration corner products zero) in the same sub-iteration, so the default method erases the block entirely, while guo_hall keeps exactly one pixel. Document the property in vignette("choosing-a-method") -- a caveat on the zhang_suen/guo_hall bullets plus a new "Small isolated blobs" subsection with a runnable example and the mitigation (use guo_hall or size-filter blobs before thinning). Add a tripwire-style pinned test asserting zhang_suen -> empty and guo_hall -> one pixel; if either count changes, the vignette guidance is wrong and must be updated with it. Also records the F014 hilditch fix in NEWS. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>#8

Merged
billdenney merged 2 commits into
mainfrom
review-backlog/thinr
Jul 4, 2026

Conversation

@billdenney

Copy link
Copy Markdown
Member

No description provided.

billdenney and others added 2 commits July 4, 2026 18:02
The Hilditch parallel form (Lam-Lee-Suen survey, conditions 3 and 4)
skips deleting a pixel only when a cardinal neighbour p2/p4 has
crossing number A == 1 on the *current* image. The kernel computed
the look-ahead crossing number with the centre pixel forced to 0 and
compared it against 1. Under the condition gate (p4 == p8 == 1 for
condition 3), that look-ahead value equals A(p2)|current + 1, so the
test "A_p2 != 1" required A(p2)|current == 0 -- strictly stronger than
the published "A(p2) != 1". It therefore also refused to delete pixels
adjacent to junction neighbours (A(p2) >= 2), leaving a redundant pixel
beside skeleton junctions.

Change the tests to "A_p2 == 2" / "A_p4 == 2", which is the exact
current-image "A != 1" condition. Verified against a pure-R
implementation of the published form: the corrected kernel matches it
on 1000 random images, and the previous kernel was strictly thicker in
~8% of cases and never thinner. Cannot break topology (strictly fewer
or equal pixels deleted the same way the published form deletes them).

Adds an exact-skeleton regression pin (a 6x6 junction shape where the
old kernel left a redundant pixel at [4,3] that the fixed kernel and
the published form both remove).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
An isolated 2x2 block is a genuine divergence point between the parallel
algorithms and matters for small-blob masks (marker remnants, dotted-line
dashes, segmentation specks). All four block pixels satisfy the zhang_suen
deletion gate (B == 3, A == 1, both sub-iteration corner products zero) in
the same sub-iteration, so the default method erases the block entirely,
while guo_hall keeps exactly one pixel.

Document the property in vignette("choosing-a-method") -- a caveat on the
zhang_suen/guo_hall bullets plus a new "Small isolated blobs" subsection
with a runnable example and the mitigation (use guo_hall or size-filter
blobs before thinning). Add a tripwire-style pinned test asserting
zhang_suen -> empty and guo_hall -> one pixel; if either count changes,
the vignette guidance is wrong and must be updated with it.

Also records the F014 hilditch fix in NEWS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@codecov

codecov Bot commented Jul 4, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

Files with missing lines Coverage Δ
src/hilditch.cpp 100.00% <100.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@billdenney billdenney merged commit 551e54a into main Jul 4, 2026
9 checks passed
@billdenney billdenney deleted the review-backlog/thinr branch July 4, 2026 20:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant