【含源码】在RGB贴图中生成最大不同色差程度的颜色
MAXDISTCOLOR生成最大不同颜色的RGB贴图。
MAXDISTCOLOR generates an RGB colormap of maximally-distinct colors.
MAXDISTCOLOR has two required input arguments:
1. 需要的颜色数量the required number of colors.
2. 从sRGB转换为统一颜色空间的函数句柄a function handle that converts from sRGB to a uniform colorspace (e.g. CIELAB, DIN99, CAM02-UCS, CAM16-UCS, OSA-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).
* Provide a colormap of colors to be included (e.g. company colorscheme).
* Specify the RGB bit depth (e.g. 8 bits per channel, TrueColor).
* Sort the colormap (e.g. by hue, lightness, farthest colors, etc.).
See the Examples page for information on the required and optional input arguments, together with examples of the generated colormaps.
%% Warning %%
Requesting many colors from a large gamut can require hours/days/.. of processing. Some option combinations are not tractable.
%% Examples %%
>> N = 5;
>> fun = @(m)sRGB_to_OSAUCS(m,true,true); % recommended OSA-UCS
>> rgb = maxdistcolor(N,fun)
rgb =
1.0000 0 1.0000
0 0 1.0000
0.3016 0 0.3492
1.0000 0 0
0 0.4331 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 black (e.g. background).
ans =
1.0000 0 1.0000
0 0 1.0000
0 1.0000 0
1.0000 0.0315 0
0.7619 0.8189 1.0000
>> maxdistcolor(5,fun, 'inc',[1,0,1]) % Include magenta.
ans =
1.0000 0 1.0000 % magenta
0 0 1.0000
0.3016 0 0.3492
1.0000 0 0
0 0.4331 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.3682 89.7713 -77.4020
53.2408 80.0925 67.2032
69.9953 -71.4448 68.9550
58.7226 9.8163 -64.4545
69.9008 5.1696 70.3753
52.1421 59.8639 -6.6541
%% 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. For MAXDISTCOLOR I recommend OSA-UCS or CAM02-UCS or CAM16-UCS, all of which provide a more accurate measure of the color distance.