Maximally Distinct Color Generator

Version 2.5.0 (452 KB) by Stephen23
Generate maximally-distinct colors in an RGB colormap.
1.8K Downloads
Updated 10 Apr 2024

View License

MAXDISTCOLOR generates an RGB colormap of maximally-distinct colors.
MAXDISTCOLOR has two required input arguments:
  1. the number of colors, specified as a positive number.
  2. a function handle that converts from sRGB to some kind of uniform colorspace (e.g. CIELab, OKLab, DIN99, DIN99o, OSA-UCS, CAM02-LCD, CAM02-UCS, CAM16-LCD, CAM16-UCS, etc.).
Optional input arguments allow the user to:
  • Limit the lightness range.
  • Limit the chroma range.
  • Provide a colormap of colors to be excluded (e.g. background colors, existing plot colors).
  • Provide a colormap of colors to be included (e.g. company colorscheme).
  • Specify the class (double/single) used for the RGB calculations.
  • Specify the bit/color depth to control the number of samples of each color channel.
  • Sort the colormap (e.g. by hue, chroma, lightness, farthest colors, etc.).
See the Examples tab (HTML documentation) for explanations of the required and optional input arguments.
Warning
Requesting many colors from a large gamut can require hours/days/... of processing. Some option combinations are not tractable.
Examples
>> N = 5;
>> fun = @sRGB_to_OKLab;
>> rgb = maxdistcolor(N,fun)
rgb =
0 0 0.8095
1.0000 0.3858 0
0.8254 0 1.0000
0.4286 0 0.0159
0 0.8189 0
>> axes('ColorOrder',rgb, 'NextPlot','replacechildren')
>> X = linspace(0,pi*3,1000);
>> Y = bsxfun(@(x,n)n*sin(x+2*n*pi/N), X(:), 1:N);
>> plot(X,Y, 'linewidth',4)
>> maxdistcolor(5,fun, 'exc',[0,0,0]) % Exclude only black.
ans =
1.0000 1.0000 1.0000
0 0 1.0000
0 0.6772 0
1.0000 0.1969 1.0000
0.5238 0 0.0635
>> maxdistcolor(5,fun, 'inc',[1,0,1]) % Include magenta.
ans =
1.0000 0 1.0000 % <------ magenta!
0 0.8583 0
0.1111 0 1.0000
0 0.2677 0
0.8254 0.3858 0
>> [rgb,Lab] = maxdistcolor(6,@sRGB_to_CIELab, 'Lmin',0.5, 'Lmax',0.7)
rgb =
0.7619 0 1.0000
1.0000 0 0
0 0.7795 0
0 0.5591 1.0000
0.8254 0.6457 0.0794
0.8254 0.2835 0.5397
Lab =
50.3665 89.7838 -77.4181
53.2329 80.1146 67.2197
69.9972 -71.4422 68.9560
58.7262 9.8332 -64.4628
69.8987 5.1753 70.3783
52.1378 59.8804 -6.6667
Motivation
The development of MAXDISTCOLOR was prompted by:
  1. Existing "distinct color" generators use inadequate colorspaces and/or algorithms, leading to suboptimal color distinctiveness.
  2. The realization that 64 bit PCs with >8 GB of RAM can operate on the entire 16 million colors of 24 bit TrueColor, allowing for neat and simple vectorized MATLAB code.
These two motivations are closely linked to two non-trivial tasks that have to be solved in order to generate maximally-distinct colors:
  1. An algorithm to find the best color combination requires finding the global optimum, a task which grows exponentially with the number of requested colors and with the color gamut size. In MAXDISTCOLOR I use repeated application of a simple greedy algorithm to find the maximally-distinct colors: the repeated greedy algorithm is not particularly fast and is not a general solution for finding a global optimum, but luckily it gives good results for the regularly sampled RGB cube. Note that this algorithm contains no random numbers: it is entirely deterministic and repeatable.
  2. Defining a true uniform colorspace: the venerable CIELab (used by most existing tools I could find) is not really very uniform, particularly around the blues/greens. For MAXDISTCOLOR I recommend CAM02-LCD or CAM02-UCS or CAM16-LCD or CAM16-UCS or OKLab or OSA-UCS, all of which provide a more accurate measure of the color distance.

Cite As

Stephen23 (2024). Maximally Distinct Color Generator (https://www.mathworks.com/matlabcentral/fileexchange/70215-maximally-distinct-color-generator), MATLAB Central File Exchange. Retrieved .

MATLAB Release Compatibility
Created with R2010b
Compatible with R2009b and later releases
Platform Compatibility
Windows macOS Linux

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!
Version Published Release Notes
2.5.0

- VIEW: remove alphashape, improve pointcloud.
- sRGB conversion functions: document XYZ,etc. optional input arguments.
- DIN99: integrate sRGB conversion and all DIN99 variants into one function.
- OSAUCS: fix scale bug (Ymax 1->100).

2.4.4

* Improve FEX & HTML descriptions

2.4.3

* Improve options parsing.
* Add "class" option.

2.4.2

* Colorspace detection moved to within the main function.
* Improved HTML documentation.
* Improved display text.
* Improved status output distance calculation.

2.4.1

* Minor edits to help and documentation.

2.4.0

* Add OKLab colorspace conversion function.
* Add test functions for all colorspace conversions.
* Improve <Cmax>&<Cmin> filter.
* Improve <disp> text.
* Change default <exc> value to [0,0,0;1,1,1].
* Standard matrix for sRGB to XYZ.

2.3.1

* Add <sort> option 'chroma'.
* Tweaks to HTML documentation.

2.3.0

* Text arguments can be string scalar or char vector.
* Remove integer support for INC and EXC.
* Fix INC and EXC table sizes in _VIEW.

2.2.0

* Third output is a structure of greedy algorithm status information.

2.1.3

Update image

2.1.2

Update example image.

2.1.1

* Spelling corrections.

2.1.0

* Add OSA-UCS function.
* Add pointcloud to _VIEW.
* Add error IDs.

2.0.6

* Improve FEX examples.

2.0.5

* Add error codes.

2.0.4

* Update screenshot

2.0.3

* Add DIN99 conversion function.
* Improve time display.
* Iteration limit based on reaching a stable solution.
* _VIEW: new RGB values on colorbands plot.
* _VIEW: show excluded colors in RGB cube.

2.0.2

Fix time display.

2.0.1

Add correct screenshot.

2.0.0

* Use new CIECAM02 version for documentation.
* Faster VIEW function (plot gamut only on demand).

1.2.0

Add interactive viewer function

1.1.0

Change default to [6,7,6] bits.

1.0.2

Add FEX image

1.0.1

Add links to HTML.

1.0.0