AstroBotany · calibration card · design proposal for discussion

ABCD v2: a bigger calibration card with colours that mean something to plant and soil scientists

A card with colour patches, each defined by a Munsell colour notation and chosen to correspond to plant-tissue and soil colours. Its corner markers are standard ArUco markers (IDs ), so software can tell it apart from the original card (IDs ).

The ABCD v2 calibration card: four black-and-white corner markers, a 10 cm ruler, a 5 cm vertical ruler, a checkerboard strip, five rows of colour chips and a grey ramp.

What is on the card

Annotated ABCD v2 card with nine numbered callouts.
ABCD v2 at print size (, plus 3 mm bleed in the print file). Callouts are drawn from the layout geometry in card/abcd_v2_chips.json by scripts/make_figures.py.
Colour chips
Calibration
Plant tissue
Soil
Neutral ramp

What changed from v1

v1, v1.5 and v2 cards drawn side by side at the same scale.
v1 (the StickerMule sticker), the v1.5 draft and v2, drawn at the same scale. Each card's scale is measured from its own printed ruler (scripts/make_figures.py).
v1v1.5 draftv2
Ruler0–5 cm0–10 cm0–10 cm across + 0–5 cm down (checks that x and y scale agree)
Colour chips5 primaries40 saturated screen colours, each a Munsell notation, in calibration / plant / soil groups
Framesaturated redsaturated rednone; chips sit on black on a white card
Corner markersArUco IDs same as v1ArUco IDs : the card identifies itself
Extrasrainbow strip, checkerchecker5 mm checker, version + batch code

Why the red frame went: red is the colour we most want to measure in plants (anthocyanin). A large saturated red area next to the subject competes with it in segmentation and pulls the camera's automatic white balance.

Why the v1.5 colours were replaced: pure screen blue, red and cyan are outside what a sticker press can print, so the printed patch would not match its file value. They also don't correspond to anything a plant or soil scientist records.

How the colours were chosen

Every chip is a Munsell notation (hue value/chroma, e.g. 7.5YR 5/6), the colour language soil scientists already use in the field and the basis of the Munsell Plant Tissue charts. The notation is the design; the printed colour is computed from it, then measured.

1 · NotationSoil chips from the Munsell soil-chart pages; plant hues from the Plant Tissue book; calibration hues around the colour circle.
2 · Renotation dataMunsell's published measurements turn each notation into CIE xyY (Illuminant C).
3 · Print + screen valuesConverted to Lab (D50) for printing and measuring, and to sRGB for the artwork file.
4 · Gamut gateEach chip must print (CMYK round trip, ΔE2000 ≤ 3) and fit sRGB; if not, its chroma steps down on the same hue page.
5 · MeasureEach printed batch is measured with a spectrophotometer; measured values replace the design values in the app.

Pipeline as run: . Gate result: chips reduced (); largest remaining ΔE2000 (results/generator_log.txt).

The scanned Munsell PDF's pixel colours were not used. It's a photograph of the chart, so its colours depend on the scanner. Only the notations and colour names were taken from it.

Cross-check: for the chips it covers, our sRGB values match Andrew Werth's Virtual Munsell Color Wheel within /255 per channel ( soil chips use odd chromas or half values that tool doesn't show). It is built from the same renotation data, so this checks our conversion, not the data itself (results/werth_crosscheck.txt).

Calibration row (A)

White and black anchors plus eight hues spread around the colour circle at the highest chroma that prints. Gives the colour-correction fit something to grip on in every direction.

Plant tissue (B–C)

Healthy leaf greens, chlorosis yellow-greens, senescence yellows/oranges, anthocyanin reds and purples, necrotic browns, white and tan roots. Every hue is a page of the Munsell Plant Tissue Color Book; the exact value/chroma are design targets to confirm with consultants.

Soil (D–E)

Twenty chips that exist on the soil-chart pages (10R to 2.5Y), each labelled with the name printed there. The low-chroma greys span the darkness of grey regoliths. No chip claims to match a specific simulant or Apollo sample.

Neutral ramp

Twelve greys from N9.5 to N1.5, including N5 (≈ 18 % grey), for white balance and the camera's tone curve.

Chip explorer

Click a chip to see its notation, where it comes from, and its print, screen and gamut values. The grid is laid out as on the card.

All chips

Screen colours are approximate: your display isn't calibrated and the card isn't printed yet. Lab D50 is the print/measurement target. CMYK is from macOS's Generic CMYK profile and is a guide only; the sticker printer uses its own.

Corner markers: which card is this?

The corners are standard ArUco markers from OpenCV's DICT_4X4_50 dictionary (the "4x4" option on chev.me/arucogen). The original card already used IDs ; v2 uses IDs . Any ArUco reader therefore knows which card is in the photo and which corner is which, even if the card is sideways or upside down.

IDs 0–3 were the best-separated block of four in the dictionary: the minimum bit differences from the v1 markers, between each other and from their own rotations are in the log below, so a misread is very unlikely. OpenCV's own detector reads both cards correctly (results/aruco_ids.txt):



Detection tests

The calibration app's own detector was run on synthetic photos of both cards: flat, tilted, rotated and upside down, each also with a warm colour cast, noise and blur. Error is the largest distance between a found corner and the true marker centre. "Before" is the app as committed; "after" adds marker-ID checking.

Sources: results/detection_before.txt, results/detection_after.txt (scripts/run_all.sh). What the "before" failures mean:

Also found: measured against its own printed ruler, the v1 card's markers are not 4.3 cm apart in both directions as the app assumes. To confirm on a real photo before changing the app.

Printing and measuring

  1. Print matte if possible: glare hides markers and chips (the app already has a fallback for photos where glare hides part of the card).
  2. Measure at least 3 stickers from each batch, every chip, with a spectrophotometer (D50 / 2°). Record L*, a*, b* in the batch template.
  3. Flag any chip whose sticker-to-sticker difference exceeds ΔE2000 2.
  4. Feed the measured values to the generator (--measured); they replace the design values the app uses.
  5. Each print run gets its own batch number in the card's 8-cell code (3 bits version + 5 bits batch).

Open questions for discussion

Each is a GitHub issue so comments stay in one place: open questions.

Files and sources