I'm trying to design an art print that uses overprinting to create color variations, and I want to use as few component colors as possible. Given a design, is there a way to figure out the smallest set of colors that can be overprinted to reproduce the intended colors?

For example, if given this design as a raster image:

design colors

How could you figure out that the colors can be made by overprinting these component colors?


In this example, I just made the design by combining different combinations of the components.

enter image description here

Note that the first component color doesn't appear on its own in the design, and is only an underlying part of the design.

This seems similar to CMYK separation, but with different component colors. And, there could be any number of underlying components. (Not just the standard four, like CMYK.)

Is there a known programmatic method to find the smallest set of components for a given set of colors? (Not trial and error.)

  • Welcome on GD.SE, saucewaffle! Given that there are a lot of ways to have an RGB or a CMYK separation, I'd start to separate each color obtaining a certain number of tuples, grouping the tuples with your preferred criterion (saturation, similarity, ...), searching for the greatest common divisors of the groups. Not a trivial task. See also this question Mar 2, 2020 at 9:00
  • Thanks @PaoloGibellini ! Yes, unfortunately I think it’s as complicated as it seems... I’ve taken quite a few different approaches, and I think the answer may lie in some sort of custom solver that seeks a common denominator until a specified threshold. However, the specifics of how this could be done have been beyond my capabilities... I was hoping that someone maybe had experience with this sort of thing and maybe there was a library I could use to produce usable results? Mar 2, 2020 at 19:01
  • Your question is very interesting, but I think that it is perhaps better suited for Stack Overflow or for Computer Graphics, because it is an Operational Research problem, not typically having a single solution, hence it is necessary to make some starting hypotheses. This question is very similar to your. Please, continue to investigate. Mar 3, 2020 at 7:32

2 Answers 2


Very interesting question! But also very impossible to answer I'm afraid. I'm looking forward to see other answers. In the meantime, here are some problems to consider:

Separating a given color into to solid inks is not a trivial mathematical task. There might be infinite solutions, or for some colors there might be none.

Your main problem is that you need empirical data. You say this problem resembles CMYK separation. Yes, but only on the surface. In CMYK separation you have 4 known inks which each can have different raster percentages. You want to find four solid inks which together will create the given color. So you have infinite colors to choose from. And you don't even know how many inks to use to create a given color.

The only reason we can convert an RGB color to CMYK is because we have color profiles.

RGB profiles are made by agreeing on a standard (I don't know much details about this), setting up a screen to follow this standard, displaying different RGB values on the screen and measuring the resulting colors in Lab.

CMYK profiles are made by agreeing on standard (paper type, inks, amount of ink to apply, dot gain etc.), setting up a printing device to follow this standard, printing physical samples of different mixes of CMYK and measuring the resulting colors in Lab.

All the measured data is made into a sort of lookup table which enables us to convert from a color we display on screen to a color we print on paper. For a given RGB color our applications can look up in the RGB profile which objective color it has. Then the application can look up in the CMYK profile which percentages of CMYK to mix to obtain this color when printed using a certain standard.

If the display we view the RGB color on is properly calibrated according to the RGB standard and the printing device we print with is calibrated according to the CMYK standard, the colors we get on print should look similar to the color we see on screen.

When it comes to other inks besides CMYK, we simply don't have those measurements. Even if we narrow down the possible inks from infinite to only using the 1114 Pantone colors, we still have the same problem. We know (more or less) which Lab color a printed Pantone color has on coated and uncoated paper, but we don't know how they look when they are overprinted.

Adobes's applications can give us an overprint preview which, in most cases, is pretty precise, but that preview is based on some hidden proprietary math, not measurements. It's not accurate and even if we don't care about that we can't use it in our own code because we don't know the algorithm.

The 1114 Pantone colors can be combined in many ways. There are 63824579126 4-color combinations, 229791464 3-color combinations, 619941 2-color combinations and the 1114 single inks. If you had access to a giant table of all the resulting colors of these combinations then you could make a script which trough trial and error found the best set of 4 colors to reproduce a given set of colors.

To print and measure so many combinations seems to be impossible, so you need to dig deeper into color science to find some mathematical way of approximating overprints. Maybe other can point you in the right direction. It's beyond my understanding and beyond the color theory designers normally use in their work.


I do not quite understand your question.

I. The smallest number of inks to be printed can be just 1.

II: To combine colors would be 2.

You can simulate the colors using gradients and multiply blending mode.

enter image description here

III. But when you are using 3 inks... probably you want to change to CMY. You will not get a deep black, but you will get a good amount of tones. And the savings using 3 inks instead of 4 is not that much so...

A "programmatic way?

You can let's say have increments of ink of about 1/100, so that would be for two inks

100x100 = 10,000 diferent colors...

But it is really difficult to identify an increment of 1% so probably a 5% increment is more detectable, that would be:

20x20 = 400

In the example I posted is on a 10x10 grid = 100 values.

On a 3 color matrix do an (X)(Y)(Z) multiplication.

But it is hard to say in the colors you have because for example the gray you have is very light. Can you perceive a 10% increment in that light color? Probably not. Let's say you can safely distinguish just 4 different tones of that ink. 100%, 75%, 50% and 25%? Or more like 100% 50% 25% 12%?

Color perception is not linear, it is more logarithmic. This translates to we perceive more easily a change in white colors than in dark ones. On a 3 ink combination, the dark colors will be harder to differentiate, so probably we can adjust our color increments.

  • Thanks for the quick reply! I think the key part is that I’m looking to overprint the component colors, not a halftone. Since the inks are transparent, they create the intended final design colors. My question is specifically about finding the minimum components if you’re only given the final design. Mar 2, 2020 at 18:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.