algorithm - 根据两个字符创建均匀分布的背景颜色

标签 algorithm colors

我目前正在创建一个脚本来将用户首字母映射到背景颜色,目的是自动创建头像(如果他们没有自己设置的话)。之后,白色首字母应该出现在方形头像上,背景颜色取决于两个字符。

我想满足以下条件:

  • 两个有序的字符总是返回相同的颜色
  • 颜色(几乎)均匀分布在颜色空间中,具体取决于 26 个字母

我假设用户姓名首字母是平均分布的。

我的简单方法是将 676 (26^2) 个字母组合与 RGB 空间中的 16777216 (256^3) 个颜色组合进行线性映射。但这可能不是最好的解决方案。有什么想法吗?

最佳答案

RGB 空间是高度“感知不均匀”的。这意味着两种 RGB 颜色之间的欧几里得距离是一个可怕的指标,表明它们在人们看来会有多么不同。一个简单的例子是我们的眼睛对绿色比对蓝色敏感得多,因此我们需要在蓝色 RGB 颜色指数中有很大差异才能看到与绿色相比的差异。

因此,您应该考虑将 26^2 点映射到感知均匀空间中的不规则 3d 网格。有很多选择,因为没有人就感知均匀性到底是什么达成一致;毕竟,这是一种生物/感知特征,并不精确。

但看看 CIE 实验室空间和 CIE Luv。对于您的目的,这两种方法中的任何一种都足够接近统一:比 RGB 好 20 倍或更多。

Web 上有很多关于从这些空间到 RGB 的转换的有用信息。

一个需要注意的地方:并非所有 CIE 实验室空间指定的颜色实际上都可以由计算机显示器呈现:光发射的物理学限制了可能的情况。 (参见示例 the Wikepedia page on Lab color space。因此,您应该将统一网格限制在 Lab/Luv 空间中与显示器实际可以产生的颜色相对应的部分。最简单的方法是选择一组填满大部分空间的轴对齐框并用一个统一的网格填充它们,该网格在所有框中总共有 26^2 个点。计算每个框中的网格点。使用相对大小将 26^2 个初始空间点平均分配给它们。然后将每个初始空间点映射到一个与您已经在做的一样,使用整数算法将框添加到实验室空间网格点。

关于algorithm - 根据两个字符创建均匀分布的背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21022741/

相关文章:

Emacs 颜色。为什么它在当前行是灰色的?禅本主题

algorithm - 解决所述复发的方法?

algorithm - 调整堆栈数组大小的摊销分析

algorithm - 查找多边形内的任意点

java - 从对象的属性中找到重叠值的好算法/技术?

r - 将特定图例添加到 R 绘图中

java - 如何在 Java JPanel 中使用 Html 颜色代码

C++:难以掌握 std::next_permutation 和 std::prev_permutation 的工作

java - 如何将ImageIcon的黑色像素更改为白色像素?

Java,更改字体和文本颜色。