mirror of
https://github.com/visioncortex/vtracer.git
synced 2026-09-30 07:51:20 -07:00
Snap watershed boundaries to the color-midpoint iso-line
Inside an antialiasing ramp (or JPEG halo) the per-pixel differences are near-equal, so the minimum-spanning-forest cut meanders +-1-2 px with the pixel noise and the fitted curves visibly wave. After the cut, boundary pixels whose color is a mixture of the two adjacent region means are re-assigned to the closer mean - the same rule color quantization applies, which is why the color-cluster frontend never showed this. A mixture gate keeps genuine third-color detail (e.g. dark outline strokes) with its basin, and crisp synthetic edges are untouched (goldens unchanged). The merge-tree replay now walks the full edge order: snapping can leave a region's only adjacency running through a below-cut edge, and skipping those left the tree unconnected. Costs ~6 ms on a 1400x775 cut (~30 ms before, ~36 ms after); the first sweep scans the canvas, later sweeps revisit only the moving front. Absorb the fragments boundary snapping pinches off A snap flip can strand a pixel (its supporting neighbour flips away in the same sweep) or sever a thin strand of its source region. Watershed basins are connected by construction and the mosaic gives every disjoint patch its own face, so this debris surfaced in cutout mode as 1-px micro-faces wedged between the real faces - visually gapless, but neighbours no longer shared a fitted boundary (62 chips on the Cityscape sample, some with degenerate zero-area outlines). After the sweeps, flood every touched component with a small cap: one that is disconnected from the rest of its region and fits under the floor moves wholesale to the adjacent region with the closest mean. Substantial patches severed at a thin antialiased neck stay - they make coherent faces of their own, and recoloring them would be visible. Seeded by the sweep fronts, so the cost is proportional to the flips, not the canvas (cut stays ~36 ms). Cityscape cutout: 95 faces back down to 33 (32 pre-snap), zero coverage gaps. Guarded by snap_leaves_no_debris on the real photo (smallest patch was 1 px before, 147 patches; now every patch clears the speckle floor).
This commit is contained in:
+1
-1
@@ -11,7 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
* Binary thresholding: a tunable fixed threshold and Bradley–Roth adaptive thresholding for uneven lighting — CLI `--threshold` / `--adaptive` (`--adaptive-window`, `--adaptive-t`), also on `Config`, Python, and Node.
|
||||
* Cutout mode merges neighbouring mosaic regions whose colors are within one gradient step — the flattened tessellation no longer keeps the near-identical faces that stacked gradient layering splits a smooth area into.
|
||||
* Watershed clustering (`--clustering watershed`): an alternative region-forming frontend — a hierarchical watershed by volume on the pixel graph (Cousty et al., TPAMI 2009; Najman, Cousty & Perret, ISMM 2013), cut at a single `--watershed-detail` dial (0..=255, each +25.5 roughly doubles the region count). Content-adaptive regions with no watershed-line pixels. With `cutout` the partition reaches the mosaic natively (no gradient-step re-merge); with `stacked` the merge tree itself is the stack — coarse ancestors below, refined regions on top, the same principle as color clustering — so sub-pixel gaps show ancestor colors and overdraw stays seam-free.
|
||||
* Watershed clustering (`--clustering watershed`): an alternative region-forming frontend — a hierarchical watershed by volume on the pixel graph (Cousty et al., TPAMI 2009; Najman, Cousty & Perret, ISMM 2013), cut at a single `--watershed-detail` dial (0..=255, each +25.5 roughly doubles the region count). Content-adaptive regions with no watershed-line pixels; antialiased boundary pixels snap to the color-midpoint iso-line, so edges come out as calm as the color-cluster frontend's instead of meandering with the pixel noise inside the ramp. With `cutout` the partition reaches the mosaic natively (no gradient-step re-merge); with `stacked` the merge tree itself is the stack — coarse ancestors below, refined regions on top, the same principle as color clustering — so sub-pixel gaps show ancestor colors and overdraw stays seam-free.
|
||||
* `WatershedHierarchy` is public and split into `build` (expensive, depends only on the image) and `cut` (near-instant): `Session` builds it once and re-cuts on every `watershed_detail`/`filter_speckle` change, making the detail slider fully interactive (~25 ms re-cut vs ~40 ms rebuild on a 1400×775 photo).
|
||||
|
||||
### Changed
|
||||
|
||||
Reference in New Issue
Block a user