Method
How the refusal is measured
A tap that cannot finish the job says so and changes nothing. Here is the test it runs, the corpus it is checked against, and the numbers — 87.0 % precision, 69.9 % recall — generated, never retyped.
The method, in plain words
- A tap makes a disc. Its radius is the long edge of the file divided by 56, held between 14 and 56 pixels; on these 14-pixel tiles it is 14 px.
- Before anything is written, the tool reads a ring of untouched picture just outside the disc. Its average is the colour of the surroundings.
- Inside the disc it takes the third of the pixels furthest from that colour — the thing you tapped. A speck two pixels across would vanish in an average; the distant third keeps it.
- If more than 8 % of the ring still looks like that thing, the thing carries on past the disc. The tap is refused and nothing is changed.
- A Patch loop is read the same way, on the band outside the loop, in sixteen sectors round it, so a pole leaving through two sides is caught even when the loop is long.
Three examples from the corpus
| Tile | What it is | Ring measured | Outcome |
|---|---|---|---|
| sky-specks-01 | A dark speck on a pale sky | 0.0 % | Filled |
| poles-01 | A pole crossing the disc | 24.1 % | Refused: too big for one tap |
| level, upright stripes | Structure exactly upright | no tilt read | Refused: nothing reads as off level |
The same stripes turned by 3° read as 2.5°: the reading works in quarter-degree steps and is smoothed over five of them.
The numbers
| Measure | Value |
|---|---|
| Tiles in the corpus | 312 |
| Cut (share of the ring) | 8 % |
| Precision — of the taps refused, how many needed a region | 87.0 % |
| Recall — of the tiles that needed a region, how many were refused | 69.9 % |
| Over-refusal — of the tiles one tap could fix, how many were refused | 8.9 % |
| Find specks — proposals that were a planted speck | 79.7 % (102 of 128) |
| Find specks — planted specks it ringed | 98.1 % (102 of 104) |
| Measured | 2026-10-24 |
By class
| Class | Tiles | Called right |
|---|---|---|
| sky specks | 26 | 26 (100.0 %) |
| sensor dust | 26 | 26 (100.0 %) |
| raindrops | 26 | 26 (100.0 %) |
| wires | 26 | 3 (11.5 %) |
| poles | 26 | 26 (100.0 %) |
| foliage | 26 | 15 (57.7 %) |
| brickwork | 26 | 13 (50.0 %) |
| fabric | 26 | 25 (96.2 %) |
| text | 26 | 26 (100.0 %) |
| skin | 26 | 26 (100.0 %) |
| products | 26 | 26 (100.0 %) |
| scanned paper | 26 | 16 (61.5 %) |
What the numbers say
- Thin wires and pen lines are mostly not refused by a tap: a line two or three pixels wide is too small a share of the disc for the ring to see. That is what the Heal stroke is for — drag along a line instead of tapping it.
- Brickwork and foliage are where the cut is least sure. The seam shows a smear before you save; a refusal is not the only safeguard.
- A tool that refuses too often is worse than one that promises too much, so over-refusal is published beside recall. Both are held by a test: a change to the engine that moves either below its floor fails the build.
What the corpus is, and is not
312 tiles in twelve classes — sky specks, sensor dust, raindrops, wires, poles, foliage, brickwork, fabric, text, skin, products and scanned paper — drawn by this site's own code from fixed seeds. Each label is true by construction: the thing under the tap either stops inside one disc or carries on past it. That makes the corpus reproducible, free of anyone else's photographs, and a fair test of the arithmetic. It is not a set of real photographs, and real photographs are harder; a photographed corpus, labelled by two people, is still to come.
Try the refusal yourself on Remove spots from a photo, or draw a loop on Remove small objects from a photo.


