0

在计算机上选择随机颜色比我想象的要难。

对 R、G、B 进行 0..255 的均匀随机抽样的简单方法往往会画出许多相似的果岭。从像 CIELUV 这样的感知均匀空间中采样是有意义的。

一种简单的方法是在常规网格上对 L,u,v 进行采样,并确保颜色实体包含在边界中(我已经看到了不同的边界)。如果样本落在嵌入的 RGB 实体之外(通过将其映射到 XYZ 然后 RGB 进行测试),拒绝它并再次采样。如果您拒绝的次数超过某个任意阈值次数,您可以接受一个笨拙但保证终止“救助”选择(如天真的程序)。

我相信,测试样本是否在 RGB 范围内需要确保测试黑色的特殊情况(某些实现最终对除以零保持沉默)。如果 L=0 并且 u!=0 或 v!=0,则需要拒绝样本,否则您最终会在 Luv 空间中对 L=0 平面进行过采样。

这个程序有明显的缺陷吗?这似乎有效,但我确实注意到我滚黑的次数比我想象的要多,直到我想到在这种情况下发生了什么。谁能指出我在 CIELUV 网格上的正确边界以确保我包围了 RGB 实体?

对那些不知道的人有用的参考: https ://www.easyrgb.com/en/math.php

4

2 回答 2

1

这样做的关键问题是您需要边界来拒绝超出 RGB 的样本。我可以在这里找到它(页面上的演示很好,API 提供了方便的功能): https ://www.hsluv.org/

在 RGB 中对 CIELUV 进行统一采样时,我注意到了一些事情:

  • 大多数颜色是绿色和紫色(这与 RGB 界限无关)
  • 你很难对我们认为的黄色进行采样(非常小的高亮度、高色度空间)

我实施了各种策略,专注于采样色调(当我们想到“采样颜色”时,这确实是我们想要的),方法是根据该亮度下的最大色度进行加权。这使得像彩色浅黄色这样的颜色更容易捕捉,并避免过度采样绿色和紫色。您可以在此处查看这些方法的操作(选择“随机颜色”):

https://www.mysticsymbolic.art/

颜色随机器的来源: https ://github.com/mittimithai/mystic-symbolic/blob/chromacorners/lib/random-colors.ts

于 2021-08-29T19:15:20.107 回答
0

好的,虽然您没有显示用于生成随机数然后将它们应用于 CIELUV 颜色空间的代码,但我猜您正在从随机数生成器创建一个 0.0-100.0 的随机数,然后将其分配给L *

这很可能会给你很多黑色或非常暗的结果。

让我解释

L * u * v *中的L *对于光不是线性的。CIEXYZ 的Y对光是线性的。L *是感知亮度,因此对Y应用指数曲线以使其对感知呈线性,但对光呈非线性。

尝试这个

要获得具有随机值 0—100 的L * :

  • 生成一个介于 0.0 和 1.0 之间的随机数
  • 然后应用 0.42 的指数
  • 然后乘以 100 得到L *
    Lstar = Math.pow(Math.random(), 0.42) * 100;

这将获取代表光的随机数,并应用模拟人类亮度感知的功率曲线。

紫外线颜色

至于uv值,您可以将它们保留为线性随机数。将u约束到大约 -84 和 +176,将v约束到大约 -132.5 和 +107.5

    Urnd = (Math.random() - 0.5521) * 240;
    Vrnd = (Math.random() - 0.3231) * 260;

极地颜色

将 uv 转换为 LCh LUV或 Lsh LUV可能会很有趣

对于hue,它可能就像H = Math.random() * 360
For chroma contrained 0-178 一样简单:C = Math.random() * 178

下一个问题是,你应该找到色度吗​​?还是饱和?CIELUV 可以提供 Hue 或 Sat——但对于直接生成随机颜色,色度似乎要好一些。

当然,这些简单的示例并不能防止溢出,因此要测试它们的颜色值以查看它们是否是合法的 sRGB。可以做一些事情来将生成的值限制为合法颜色,但这里的目的是让您获得更好的分布,而不会产生过多的黑色/深色结果。

请让我知道任何问题。

于 2021-08-28T11:14:47.683 回答