How PaletteMix Mixes Color
The science, the data, and the honest limits.
Most paint mixing tools work the way your screen works: they treat color as red, green, and blue light. Mix red light with green light and you get yellow light. Mix red paint with green paint and you get a muddy brown. The screen and the palette follow different rules, and any mixing tool that ignores this gives wrong answers.
PaletteMix follows the rules of the palette.
This page is for painters who want to understand what the app does, and for anyone evaluating whether the science is real. If you just want to mix paint, the app is at palettemix.app/app.
What the app actually does
When you tap a color on a reference photo, PaletteMix:
- Reads the pixel's sRGB color value.
- Converts that color into a 36-point spectral reflectance curve — an estimate of how much light that color reflects at each wavelength from 380 nanometers (deep violet) to 730 nanometers (deep red), sampled every 10 nanometers.
- Searches combinations of two and three paints from your palette, adjusting proportions to find the mix whose predicted spectral reflectance is closest to the target.
- Converts the predicted mixture back to a screen color, and scores the match using CIEDE2000, the perceptual color difference metric used in color science research.
- Returns the top recipes, ranked by predicted accuracy, with mixing proportions, order, and any tinting-strength or interaction warnings that apply.
Kubelka-Munk theory was published in 1931. CIEDE2000 was standardized in 2001. The sRGB-to-spectral estimation follows published methods on spectral upsampling. The work PaletteMix does is applying this science to the paint inventories painters actually use — 36 brands, 3,397 individual paint formulations, each with its own spectral signature.
Why RGB mixing fails for paint
Your screen emits light. Every pixel mixes three colored lights — red, green, and blue — at different intensities. This is additive mixing. Red plus green makes yellow. Red plus green plus blue makes white.
Paint absorbs light. A red paint looks red because it absorbs most wavelengths except the red ones, which bounce back to your eye. A blue paint absorbs most wavelengths except blue. Mix them and the red absorbs what the blue reflects, the blue absorbs what the red reflects, and what comes back is whatever narrow band both pigments happen to let through. That's usually a muddy purple-brown. This is subtractive mixing.
Subtractive mixing cannot be predicted from RGB values. Two paints with identical RGB appearances under one light source can produce completely different mixtures, because the way they absorb light across the full visible spectrum is different. Two reds that look the same on screen can mix with yellow to produce two different oranges. The information that predicts the mixture — the full spectral curve of each pigment — isn't in the RGB value at all.
An RGB color picker paired with an RGB averaging tool will always give you approximate recipes at best, often wrong ones.
The Kubelka-Munk model
The Kubelka-Munk model describes how light behaves inside a layer of pigment. Pigment particles absorb some wavelengths and scatter others back toward the viewer. The model reduces this to two numbers per wavelength: K (how strongly the pigment absorbs) and S (how strongly it scatters).
For opaque paint films — which is what oil paint is when applied to a canvas — the ratio K/S at each wavelength can be calculated from the paint's reflectance:
Where R is the reflectance at that wavelength, between 0 and 1.
The useful property of K/S ratios is that they add. If you mix two paints at concentrations c₁ and c₂:
Converting the mixed K/S back to reflectance:
Applied at every wavelength across the visible spectrum, this gives the spectral curve of the mixed paint. From that curve, standard colorimetric conversions produce the sRGB color you see on screen.
This is the single-constant Kubelka-Munk model — a simplification that assumes all paints being mixed have similar scattering behavior. That holds reasonably well for oil paints applied opaquely. The two-constant model gives better accuracy for translucent media like watercolor and glazes, but it requires separate K and S values that aren't widely published. PaletteMix uses single-constant because the data exists and the results are good for opaque oil mixing.
Accounting for paint quality tiers
A tube of student-grade Cadmium Red Hue and a tube of artist-grade Cadmium Red contain different amounts of actual pigment. The student paint is cut with extenders and fillers to hit a lower price point; the artist paint delivers closer to pure pigment concentration.
PaletteMix models this. Every paint in the database is tagged with a quality tier — Hobby, Student, Artist, or Master — and the mixing engine applies a tier-specific pigment-load factor when computing K/S ratios. A student-grade paint at the same proportion as a master-grade paint produces a weaker contribution to the mix, which matches what happens on the palette. Two recipes that look identical on paper can produce different results if one palette is student-grade and the other is master-grade.
This is why brand and tube specificity matters. A mixing tool that treats "Burnt Sienna" as a single generic color can't tell you whether your mix needs more pigment because your tube is a thinner student-grade formulation. A tool built around your actual palette can.
Where the pigment data comes from
Every paint in the database has an associated spectral reflectance curve: 36 numbers representing how much light it reflects at each 10-nanometer band from 380 to 730 nanometers. The data comes from two sources.
The first is measured data — spectrophotometer measurements originally from published Golden Heavy Body acrylic data, the most accessible published measured dataset. For pigments whose formulation is consistent across media, like Titanium White (PW6), Yellow Ochre (PY43), Cadmium Red (PR108), and Ivory Black (PBk9), these measured curves produce accurate mixing predictions across brands. Roughly 720 paints use measured data.
The second is estimated data — spectral curves derived from the manufacturer-published sRGB swatch using the Burns spectral upsampling method. This is the source for paints without directly measured data. Roughly 2,680 paints use estimated data.
During development, every paint with measured data available was cross-checked: the measured spectral curve was converted back to sRGB and compared against the manufacturer's stated color. Where the discrepancy exceeded ΔE 12 — typically for deep-violet phthalocyanines and pre-mixed tints labeled as single-pigment — the measured data was rejected in favor of the estimated curve. A wrong measured curve produces worse predictions than a reasonable estimate from the correct stated color. Around 450 paints auto-corrected this way.
The result: each paint uses the most accurate spectral representation available for its specific formulation, rather than blindly applying measured data that may be wrong for a given brand.
Improving this data is an ongoing project. Contributions from painters with spectrophotometer access, manufacturer technical sheets, or published pigment studies are welcome.
How accuracy is measured
PaletteMix scores every recipe using CIEDE2000 — the color difference metric standardized by the International Commission on Illumination in 2001, and still the current standard for perceptual color matching. The output is a single number, ΔE₀₀, representing how far apart two colors appear to a human observer under controlled viewing conditions.
Rough interpretation:
The app has been validated against a set of real-world painter scenarios:
Most working mixes — chromatic grays, flesh tones across skin types, earth colors, atmospheric landscape colors — come in under ΔE 4. Your eye and a few brushstrokes do the rest.
The Zorn halftone result (ΔE 6.28) is a ceiling imposed by the palette, not a software failure. An exhaustive 1% grid search across all possible proportions of the Zorn palette (Titanium White, Yellow Ochre, Cadmium Red, Ivory Black) confirmed that ΔE 6.23 is the mathematical minimum for that specific target color. No recipe can do better with those four paints. When PaletteMix hits a ceiling like this, it says so.
Every recipe shows its ΔE score in the interface.
Mixing guidance beyond the recipe
A recipe that says "Phthalo Blue 5%, Titanium White 95%" without warning about tinting strength is a recipe for wasted paint. PaletteMix layers additional guidance on top of the raw mixing math.
Tinting-strength warnings flag high-power pigments with dosing advice specific to the pigment. Phthalo Green gets "use a rice-grain amount"; Quinacridone Rose gets "a tiny knife-edge"; 21 pigments have their own labels. Generic tinting warnings are useful; pigment-specific ones are useful at the palette.
Interaction notes appear when a recipe combines pigments that need care together: dioxazine violet going chalky in flesh mixes, certain cadmium-and-phthalo combinations turning gritty, earth pigments dulling certain synthetics.
Desaturation alerts fire when two paints sit more than 130° apart on the color wheel and both exceed 10% of the mix — the classic path to muddy color.
Chalky-mix warnings fire when white exceeds 40% of a chromatic mixture.
Mixing-order suggestions appear on every recipe, biased toward starting with lower-tinting-strength pigments so you don't overshoot on the powerful ones.
Yellowing previews simulate what a mix will look like after roughly six months of cure, using a quadratic-scaled shift in b* (yellow) and L* (lightness) applied more strongly to light values than dark ones — which matches how linseed-oil yellowing behaves in practice.
Hue-substitute warnings flag when a cross-brand match is a hue substitute rather than a genuine pigment match. An Arylide yellow proposed as a substitute for a true Cadmium Yellow mixes differently from the pigment it's named after, and the label makes that visible.
Specular-highlight detection warns when the tapped color appears to be a reflection rather than a paintable color — the bright glint on a ceramic, the shine on a wet lip. No amount of white will mix that, because the color isn't pigment, it's light.
What PaletteMix can't do
Several things that affect the final appearance of a mix aren't captured by any mathematical model.
Tubes vary. Two tubes of "Cadmium Red" from the same manufacturer, purchased two years apart, can differ slightly due to batch variation in pigment sourcing. PaletteMix uses published average data. Your actual tube may differ.
Medium and dilution change everything. Adding linseed oil, Liquin, or solvent changes the optical behavior of the paint. PaletteMix models opaque, undiluted mixing. Glazes and washes behave differently and aren't currently modeled.
Oil paint darkens slightly as it dries, and some pigments shift noticeably over weeks or months. PaletteMix shows the wet mix and provides a yellowing preview, but doesn't model every pigment-specific drying behavior.
Paint on canvas looks different from paint on panel, which looks different from paint on paper. The mixing math is the same. The final appearance depends on absorbency, tooth, and what's underneath.
A mix that matches perfectly under daylight may look different under gallery spotlights, north-window studio light, or a phone screen. CIEDE2000 assumes D65, a standard daylight illuminant. Your studio isn't exactly D65.
For target colors with L* below about 20, small spectral differences translate to large visual differences. Both the Burns upsampling method and single-constant K-M lose accuracy in that range. Deep shadow colors are the genuine weak spot.
And two painters looking at the same mixed pile will perceive it slightly differently. PaletteMix gets you close enough that your brain stops fighting the reference. Your eye finishes the job.
What's being worked on
Accuracy of sRGB-to-spectral estimation for specific pigment families — particularly phthalo, quinacridone, and dioxazine pigments — is an area of active improvement. Current estimates are good for most mixes, less good for the worst-case saturated complementaries. Measured spectral data will replace estimated data where accessible.
Two-constant Kubelka-Munk support for optical mixing is planned but not yet built. The data requirements are much higher — separate K and S values per pigment rather than a single K/S ratio — and published oil-paint two-constant data is sparse.
Batch-specific and manufacturer-measured data would push typical accuracy from ΔE 3 toward ΔE 1. This requires either partnership with manufacturers willing to publish spectrophotometric measurements, or individual painters with spectrophotometer access contributing them. Both paths are open.
Further reading
Kubelka, P. and Munk, F. (1931). "Ein Beitrag zur Optik der Farbanstriche." Zeitschrift für technische Physik, 12, 593–601. The original paper, in German. English translations are available online.
CIE (2001). Improvement to industrial colour difference evaluation. CIE Publication 142. The formal definition of CIEDE2000.
Sharma, G., Wu, W., and Dalal, E. N. (2005). "The CIEDE2000 color‐difference formula: Implementation notes, supplementary test data, and mathematical observations." Color Research & Application, 30(1), 21–30. The reference implementation and test vectors PaletteMix validates against.
Berns, Roy S. (2019). Billmeyer and Saltzman's Principles of Color Technology, 4th edition. Wiley. The standard reference for applied industrial color matching. Chapters 3–5 cover Kubelka-Munk in depth.
Smits, Brian (1999). "An RGB to Spectrum Conversion for Reflectances." Journal of Graphics Tools, 4(4), 11–22. One of the foundational papers on sRGB-to-spectral upsampling.