METHOD / MEASUREMENTS / LIMITS
How a photo becomes a pattern
A deterministic conversion, a shared Pattern and checks you can reproduce. Here is what BEST does, what we measure, and where the model falls short.
Why crossstitchgo
A limited thread palette and visible fabric change an image. Matching each pixel to a raw thread color can lose lightness and detail. BEST evaluates the modeled stitched result, including its contrast, instead of stopping at color matching.
Conversion, editing and export run on your device. No AI model is part of the conversion pipeline. Our macaw showcase source is original generated photography; every resulting stitch and chart is computed by the same product algorithm.
From light to thread
- Resize in linear light. Decode sRGB, area-average the light values, then encode sRGB again. The C1 black-and-white checkerboard test produces about 187.5, rather than gamma-space gray 128. Default conversion is 150 stitches wide and 30 requested colors.
- Recover local lightness. L* unsharp masking with σ 1.5 gives small edges a chance to survive. Chroma compensation accounts for fabric, with tapered gain for very saturated regions.
- Choose a useful palette. Deterministic weighted Lab clustering gives edges, local variation, highlights and shadows more weight. The brightest and darkest candidate threads are reserved.
- Match to modeled stitched colors. CIEDE2000 with kL = 0.7 favors lightness. Similar colors are merged while respecting the 70% palette floor; rare colors and stray stitches are cleaned with edge protection.
- Evaluate candidates. The design specification describes a nine-grid search: USM
{0, 0.2, 0.35}crossed with chroma{1.0, 1.05, 1.1}. The shipped M0 implementation is an adaptive search of up to six candidates, including higher compensation when needed and reduced chroma for near-neutral images. It can stop after four candidates if all gates pass. It ranks gate failures first, then contrast, chroma, far-color error and isolated stitches. This implementation difference is deliberate and recorded; nine-grid search is not claimed as shipped.
Code: src/lib/image.ts, converter.ts, metrics.ts, constants.ts. The selector returns its best candidate even when a new image fails a gate. Passing three regression images does not guarantee every photo passes.
Seven hard lines
“Original” means the photo after linear-light resizing to the stitch grid. Local contrast is mean Sobel gradient magnitude of L* after a σ 0.7 blur. Mean chroma is average √(a*² + b*²). Far-view ΔE00 compares the source and modeled stitched image after a one-cell Gaussian blur. An isolated stitch has no matching neighbor among its eight surrounding cells.
| Gate | Measure | Hard line |
|---|---|---|
| C2a | Local contrast | At least 95% of the resized original |
| C2b | Mean chroma | 95% to 110% of the original |
| C2c | Chroma p95 | No more than 110% of the original |
| C2d | Highlight L* p99.5 | At least min(original, 91.6) minus 2 |
| C2e | Far-view ΔE00 | No more than improved() baseline + 0.1 |
| C2f | Isolated stitches | No more than baseline + 1.5 percentage points |
| C2g | Colors retained | At least ceil(0.7 × requested colors) |
The C2 baseline is improved(), our conversion without BEST. It still includes palette reduction and cleanup. It is different from the simpler homepage comparison.
Three fixtures. Published results.
Reproduced 2026-11-05, Asia/Shanghai. Each fixture is 150 stitches wide with 30 requested colors. Values below are BEST / improved() baseline. All C2a through C2g checks passed for all three. Fixture photographs are test-only and are not used as site artwork.
| Fixture | Local % | Chroma % | Far ΔE00 | Isolated % | BEST colors | One run, ms |
|---|---|---|---|---|---|---|
| face | 97.5 / 90.1 | 95.5 / 84.7 | 4.304 / 4.457 | 2.63 / 2.02 | 30 | ~3865 |
| pet | 98.5 / 93.1 | 95.6 / 100.6 | 3.319 / 3.278 | 3.93 / 2.77 | 30 | ~2237 |
| flower | 99.1 / 92.6 | 95.7 / 108.6 | 2.266 / 2.177 | 0.98 / 0.78 | 21 | ~1728 |
Timings are observations from one local run, not speed promises. BEST does not improve every measure: pet and flower have slightly higher far-color error than baseline, within the +0.1 gate. All three have more isolated stitches, within the +1.5 percentage-point allowance.
The macaw showcase, with full measurements
Homepage labels the product result “crossstitchgo” (the BEST conversion path). Both versions use the same 150 × 150 linear-light grid, 36-color budget and stitched renderer. “Typical basic conversion” is an illustrative algorithm: nearest raw-DMC color by squared Lab distance, keep the most frequent 36 colors, then remap to that palette. It has no USM, fabric compensation, weighted palette, protected extremes or confetti cleanup. It is not a measurement of a competitor.
| Measure | crossstitchgo | Typical basic conversion |
|---|---|---|
| Local contrast kept | 99.9% | 71.7% |
| Peak highlight L* | 89.4 | 72.5 |
| Mean chroma kept | 89.9% | 87.5% |
| Far ΔE00 | 5.007 | 6.776 |
| Isolated stitches | 4.04% | 4.92% |
| Actual colors | 36 | 36 |
Limits: this saturated photo misses C2b (mean chroma) and C2e (far-color error against improved()). Its improved baseline far ΔE00 is 4.848, giving a limit of 4.948. The other five gates pass. We publish this case because the visual improvement and the remaining limitations both matter.
Full-precision metrics JSON · Source image · Actual Pattern JSON · Actual exported PDF
A preview of stitches, not a promise of calibration
Blocks, stitched preview and PDF use one Pattern. The Aida renderer includes fabric holes, crossed threads and shadows, using COVER = 0.82, SHADE = 0.86 and a provisional fabric color. Sheen is off by default (SHEEN_DEFAULT_ON=false). These are uncalibrated physical assumptions. Your thread, fabric, lighting and screen will change the appearance.
DMC matching uses the craft-color-codes dataset, CC BY 4.0, with upstream attribution to adrianj/CrossStitchCreator. These digital colors are uncalibrated, not an official guarantee of real-thread color.
Check the paper, too
Color-symbol and black-and-white PDF charts are free. Default cells are 3 mm; adjacent pages repeat 2 rows or columns. Each chart page has a minimap and row/column numbers. Symbol contrast is tested at ≥4.5:1 across the DMC palette. Fonts are embedded; grids and symbols are vector/text rather than a chart screenshot.
C5 parses actual PDFs and compares their cells to the Pattern. C3 checks deterministic output hashes. Physical print tests and Pattern Keeper compatibility are still unverified.
Comparison and portrait presets
The three-palette comparison shares a BEST parameter search on a 48-stitch-wide representative grid, then selects and cleans each palette on the complete output grid. This differs from running three independent full BEST searches. Final metrics count occupied colors, isolated cells with no same-color eight-neighbor, and row-scan thread changes that skip empty cloth. Difficulty is a heuristic, not a predicted completion time.
Portrait mode uses a deterministic YCbCr skin-candidate rule, extra weight and reserved skin colors. Warm objects can also match the rule. On the fixed face regression fixture, candidate-region mean ΔE00 improved from 4.942 to 3.870 (21.69%). This is one reproducible fixture, not evidence across all skin tones or lighting. All physical color estimates remain uncalibrated.
Reproduce the evidence
- Run
pnpm showcaseto build the demonstration from the archived original source. The script writes the optimized source, BEST and naive renders, shared Pattern data, real PDFs andpublic/showcase/metrics.json. - Run
pnpm build, thenpnpm test. Converter tests writeoutput/metrics/face.json,pet.jsonandflower.json, including all seven checks and deterministic hashes. The full suite also parses actual exported PDFs. - Review
tests/unit/converter.test.ts,pdf.test.tsandshowcase.test.ts. Prompts, source, build logs and the M0_SHOWCASE report are archived under.codex-runs/.
Free and paid, specifically
Free for personal use. Up to 500 × 500 stitches and 80 colors. No sign-up or watermark. Photos stay on your device. This includes 220 history steps and 20 free licensed fonts. Free PDF export here covers an item charged separately by stitchmate and photo2stitch in the dated research; it does not mean every feature of those products is available here.
| Tool | Free access | Paid access in the research |
|---|---|---|
| crossstitchgo | 500 × 500, 80 colors, photo conversion, editing and full PDF. No signup or watermark. | Personal editing and export stay free. Seller plans are $14.90 per month or $99 per year. |
| Stitch Fiddle | 15 charts, 300 × 300, 50 colors, basic editing | Premium: $5/mo or $30/yr; photo conversion, unbranded export, larger grids |
| stitchmate | 10 patterns, PNG and PDF previews; no signup | Full PDF $5.99 each; Personal Pass $99 once; Plus $149 once |
| xstitchify | 5 PDF credits on signup; about 20 fonts | Standard $9.99/mo or $69.99/yr; Pro $24.99/mo |
| Pattern Keeper | One-month trial; Android chart reader and tracker | About $9 once. Different purpose: progress tracking, not photo conversion |
| makebead | Free multi-craft tools; small export watermark | No paid tier recorded |
| FlossCross | Free photo conversion, editor and PDF; up to 300 × 300 | No paid tier recorded |
| stitchxcross | Free conversion, editing and watermark-free PDF; local processing | No paid tier seen in the research |
| photo2stitch | One credit on signup | Editable canvas or PDF $5 each; $15/mo for 20 uses |
| crossstitchmaker.net | Free conversion, editing, PDF/PNG; 300 × 300, 40 colors | No paid tier recorded |
FlossCross and stitchxcross also offer free tools. We compare specific limits and exports, not overall quality. Pattern Keeper is a chart tracker; our web tracker includes a practice chart.
The Seller plan is $14.9/mo or $99/yr for selling workflows. Try buyer links, version approval and text branding on the local server. The mock checkout charges nothing.
What remains unverified
- The web tracker saves progress on the local server. Real phone testing and independent designer PDF samples are still pending.
- M1 adds 15 / 25 / 40-color comparison, presets, exclusions, locks and highlight knockout. Full browser performance remains unverified; local compute results are not browser timing claims.
- Fractional stitches, backstitch, knots and beads now share the editor, local autosave, PDF and OXS data paths. Physical print testing and FlossCross OXS import remain unverified.
- Five-person editing tests and physical DMC swatch calibration are pending.