文件交换

图片缩略图

最大明显的颜色生成器

版本2.2.0 (190 KB) Stephen Cobeldick
在RGB颜色图中生成最大的不同颜色。
5.0
5的评级

22下载

更新2020年11月25日

查看版本历史记录

查看许可协议

MAXDISTCOLOR生成最大不同颜色的RGB颜色贴图。

MAXDISTCOLOR有两个必需的输入参数:
1.所需的颜色数。
2.从sRGB转换为统一颜色空间的函数句柄(如CIELAB, DIN99, CAM02-UCS, CAM16-UCS, OSA-UCS等)。

可选输入参数允许用户:
*限制亮度范围。
*限制色度范围。
*提供被排除的颜色的颜色图(例如背景色)。
*提供要包括的颜色的颜色图(例如公司配色方案)。
*指定RGB位深度(例如每通道8位,TrueColor)。
*对色彩图进行排序(例如,通过色相,亮度,最远的颜色等)。

有关必需和可选输入参数的解释,请参见Examples选项卡(HTML文档)。

% % % %的警告

在大范围内要求多种颜色可能需要数小时/几天/..的处理。有些期权组合是不容易处理的。

% % % %

>>N=5;
>>乐趣=@(m)sRGB_to_OSAUCS(m,真,真);%推荐OSA-UCS
>> rgb = maxdistcolor(N,fun)
rgb =
1.0000 0.0000 1.0000
0.0000 0.0000 1.0000
0.3016 0.0000 0.3492
1.0000 0.0000 0.0000
0.0000 0.4331 0.0000
> >轴(ColorOrder, rgb,“NextPlot”、“replacechildren”)
> X = linspace(0,pi*3,1000);
>>Y=bsxfun(@(x,n)n*sin(x+2*n*pi/n),x(:),1:n);
> >的情节(X, Y,“线宽”,4)

>>maxdistcolor(5,fun,'exc',[0,0,0])%不包括黑色(例如背景)。
ans =
1.0000 0.0000 1.0000
0.0000 0.0000 1.0000
0.0000 1.0000 0.0000
1.0000 0.0315 0.0000
0.7619 0.8189 1.0000

>> maxdistcolor(5,fun, 'inc',[1,0,1]) %包含品红。
ans =
1.0000 0.0000 1.0000 %洋红
0.0000 0.0000 1.0000
0.3016 0.0000 0.3492
1.0000 0.0000 0.0000
0.0000 0.4331 0.0000

> > (rgb、实验室)= maxdistcolor (6 @sRGB_to_CIELab Lmin, 0.5,“Lmax”,0.7)
rgb =
0.7619 0.0000 1.0000
1.0000 0.0000 0.0000
0.0000 0.7795 0.0000
0.0000 0.5591 1.0000
0.8254 0.6457 0.0794
0.8254 0.2835 0.5397
实验室=
50.3682 89.7713 -77.4020
53.2408 80.0925 67.2032
69.9953 -71.4448 68.9550
58.7226 09.8163 -64.4545
69.9008 05.1696 70.3753
52.1421 59.8639 -06.6541

% % % %的动力

MAXDISTCOLOR的开发是由以下因素推动的:
1.现有的“独特颜色”生成器使用不充分的颜色空间和/或算法,导致不佳的颜色清晰度。
2.实现了64位pc与8gb RAM可以操作的全部1600万种颜色的24位TrueColor,允许整洁和简单的矢量化MATLAB代码。

这两种动机与两个非琐碎任务紧密相关,这两个任务必须得到解决,才能产生最大程度的不同颜色:
1.寻找最佳颜色组合的算法需要找到全局最优的颜色组合,这个任务随着所请求颜色的数量和色域的大小呈指数增长。在MAXDISTCOLOR中,我使用了一个简单的贪婪算法来反复应用来寻找最大清晰的颜色:重复贪婪算法不是特别快,也不是寻找全局最优的一般解决方案,但幸运的是,它对定期采样的RGB立方体给出了良好的结果。注意,该算法不包含随机数:它是完全确定的和可重复的。
2.定义一个真正统一的颜色空间:古老的CIELAB(我能找到的大多数现有工具都使用它)并不是真的非常统一。对于MAXDISTCOLOR,我推荐OSA-UCS或CAM02-UCS或CAM16-UCS,它们都能提供更准确的颜色距离测量。

引用为

斯蒂芬·科贝迪克(2021年)。最大明显的颜色生成器(//www.tatmou.com/matlabcentral/fileexchange/70215-maximally-distinct-color-generator),MATLAB中心文件交换

意见及评分(12)

zhian雪

Stephen Cobeldick

注意,自2020年11月以来,所有的colorspace转换函数都被重命名为使用基于colorspace名称的一致命名格式,不再使用colorspace单位(因为单位不是唯一的,例如有许多RGB colorspace)。这也解决了下面评论中提出的请求。

佩尔·伊萨克森

丹尼尔·萨维奇

Stephen Cobeldick

但是在当前版本中,演示和文档仍然需要更新,以不包含sgrb_to_Jab函数。如果你只是从演示版本或文档中复制内容,这是行不通的……”

实际上,在默认情况下,演示使用DIN99 colorspace。从sRGB到DIN99的转换是由函数SRGB_TO_LAB和LAB_TO_DIN99提供的,这两个函数都包含在本次提交中。因此,实际上演示脚本可以直接开箱即用。

演示脚本还包含默认情况下**注释掉**的代码行。其中一些代码行涉及必须单独下载的CAM02颜色空间转换函数SRGB_to_JAB。演示脚本的第三行明确指出:“一些示例使用CAM02颜色空间函数,必须单独下载。”。必须假设用户可以阅读文档。

HTML示例的第一部分还使用了SRGB_TO_LAB(包括前面提到的)然后在第二节中解释了这不是首选的颜色空间,并给出了一个链接,指向可以下载推荐的CAM02转换函数的位置。其余示例使用CAM02,因为它比CIELAB更统一。当然,使用SRGB_to_LAB或任何其他合适的颜色空间转换函数都很简单,只要提供所需的转换函数作为第二个输入参数。

“…人们可能会忽略“实验室”和“戳”之间的区别”

CIELAB颜色空间具有轴L*、a*和b*。

CAM02-UCS颜色空间具有轴J',a',和b'。

任何使用颜色表示模型的人都必须仔细注意不同的颜色空间及其参数等。它不是在这一个FEX提交的范围内提供介绍颜色理论或颜色表示模型。任何想了解不同颜色空间的用户都可以在网上找到大量信息。

Sascha Duczek

对不起,Stephen,我没有看到你之前的帖子。但在当前版本中,演示和文档仍应更新为不包含sgrb_to_Jab功能。如果你只从演示或文档复制,它将无法工作,人们可能会像我一样错过_Lab和_Jab之间的区别。

欢呼,
萨沙

Stephen Cobeldick

_“这个比例好吗?”_

就像其他随着项数呈指数增长的问题一样…这就是为什么我写了,发现很多颜色从一个大范围可能会很慢,而且发现maximally-distinct点离散空间的问题是一个np难(声明:我没有做一个深入的分析准确分类的问题这是什么,很可能我错了这一类)。

时间取决于您使用的特定选项:从1001个色域中查找1000种颜色比从1600万个色域中查找1000种颜色要快得多。在我的旧计算机上,从1001个色域中查找1000种最大不同的颜色需要1分40秒来识别。如果使用默认值[6,7,6]位深度和整个RGB立方体然后色域包含524288种颜色:以下是使用该色域的一些计时(基于N的对数增加):

N时间(年代)
1 0.56
2 0.63
5 2.35
10 9.29
22日73.38
46 784.75
100年2597.60
215年10246.20

根据这个指数轨迹,我估计1000种颜色的生成需要大约一周的时间。

这就是为什么我提供了控制位深度的选项,并限制亮度和色度范围:使用这些选项来减小色域的大小。没有一个参数设置适用于所有情况,您需要进行实验,并对什么是可处理的有一种感觉。

阿迪蒂亚坦努

这个规模好吗?我试图生成超过1000种颜色,任何超过50种颜色的都需要很长时间才能完成。

endystrike

太棒了!谢谢,它解决了我的问题!

帕特里克Morhai

Stephen Cobeldick

@Yu Li:我怀疑你重新命名了一些函数,试图让这个例子工作。我可以从两个方面看出你的错误:

1.函数SRGB_TO_LAB与此提交一起提供。它只有一个输入参数,并且它不会像您试图使用它那样工作(文档中有如何使用它的示例)。

2.我的CIECAM02存储库的早期版本包括一个名为SRGB_2_JAB的函数,它只接受两个输入参数,并且它不会像您试图使用它那样工作(它没有第二个输入)。

注意,这与MAXDISTCOLOR完全没有区别。MAXDISTCOLOR将与几乎任何RGB->UCS转换函数工作,只要您阅读并遵循您使用的转换函数的文档!

在任何情况下,最简单的解决方案是下载当前的CIECAM02版本并使用它。我刚刚尝试了一下:我将CIECAM02和MAXDISTCOLOR压缩文件下载到一个新文件夹中,解压缩后,没有任何错误:

> >目录CIECAM02-master
>>N=5;
>> fun = @(m)srgb_to_Jab(m,true,'LCD');
>> rgb = maxdistcolor(N,fun)
rgb =
1.0000 0.3228 0.0000
0.8730 0.0000 1.0000
0.0000 0.0000 0.7937
0.0000 0.5512 0.0000
0.2222 0.0000 0.0000

于李

你好:

我尝试了测试代码:
>>N=5;
>> fun = @(m)srgb_to_Jab(m,true,'LCD');% CAM02-LCD,推荐的色彩空间。
>> rgb = maxdistcolor(N,fun)

但它报告说:
使用srgb_-to_-Jab时出错
输入参数太多。

@(m)srgb_to_Jab中的错误(m,true,'LCD')

maxdistcolor错误(第157行)
地图=乐趣([0,0,0,1,1,1]);

我的手术有什么问题吗?

最好的,