The common mixing of RGB colors is very different from mixing colors for paintings, it's mixing of light instead mixing of pigments.
For example:
Blue (0,0,255) + Yellow (255,255,0) = Grey (128,128,128)
(It should be Blue + Yellow = Green)
Is there any known algorithm for color mixing that works like mixing real colors?
I've already tried following:
Converting both colors to HSV and mixing hues (multiplied by coefficient computed from saturation), and a simple average for saturation and value channels. Then I computed average luminance from both colors and adjusted the resulting color to match this luminance. This worked quite well, but the hue mixing was sometimes wrong, e. g.:
Red (Hue 0°) + Blue (Hue 240°) = Green (Hue 120°)
I've figured out that sometimes I need to shift the hue value by 360° (when the difference between hues is greater than 180°).
Red (Hue 360°) + Blue (Hue 240°) = Magenta/fuchsia (Hue 300°)
But this shifting wasn't very good too, e.g.:
Cyan (Hue 179°) + Red (Hue 0°) = Hue 89.5°
Cyan (Hue 181°) + Red (Hue 0°) --> shifting is performed (the difference is greater than 180°)
Cyan (Hue 181°) + Red (Hue 360°) = Hue 270.5°
(Hue 179 + Red) and (Hue 181 + Red) results in two completely different colors.
Then I tried CIE Lab color space (as in Photoshop), which is designed to be closer to how humans perceive the colors.
I used just a simple average for each corresponding two channels, but the results weren't satisfying, for example, I got pink (64, 26, -9.5) out of blue (98, -16, 93) and yellow (30, 68, -112). These coefficients were taken from Photoshop.
Maybe if I used some different operation than average, it could work, but I don't know what.
CMYK didn't work too, results are just like in RGB or LAB.
It seems that neither the trivial additive nor subtractive color mixing in any of these color spaces yields natural results.
Raster graphics editor Krita had a working implementation of more realistic color mixing at some point: http://commit-digest.org/issues/2007-08-12/ (Painterly mixer plugin)
They say it is the first public application that implements special technology using Kubelka and Munk equations that describe the behavior of pigments.
Here's a video of Krita color mixing: https://www.youtube.com/watch?v=lyLPZDVdQiQ
There's also article about color blending in the Paper app for iOS developed by FiftyThree. They describe how they innovate and experiment in the area and also offer samples of mixing blue and yellow that results in green. However, the actual process or algorithm isn't really described there.
Quoting:
"In searching for a good blending algorithm, we initially tried interpolating across various color-spaces: RGB, HSV, and HSL, then CieLAB and CieLUV. The results were disappointing," says Chen. "We know red and yellow should yield orange, or that red and blue should make purple—but there isn't any way to arrive at these colors no matter what color-space you use. There's an engineering axiom: Do the simplest thing that could possibly work. Well, we had now tried the easiest possible approaches and they didn't feel even remotely right."
It seems that same as Krita, Paper implements the Kubelka-Munk model:
[...] the Kubelka-Munk model had at least six values for each color, including reflection and absorption values for each of the RGB colors. "While the appearance of a color on a screen can be described in three dimensions, the blending of color actually is happening in a six-dimensional space," explains Georg Petschnigg, FiftyThree's co-founder and CEO. The Kubelka-Munk paper had allowed the team to translate an aesthetic problem into a mathematical framework. [...]
From all this information, it seems that implementation based on the Kubelka-Munk model could be the way forward and offer results that are much closer to reality.
Even though it looks like a complicated process, I haven't yet seen much good information on how to implement something like this.
These questions were posted after this one all relating to the same thing.
None of them really has the answer.