【问题标题】:Random Color Deviation with Normal Distribution具有正态分布的随机颜色偏差
【发布时间】:2011-07-19 17:37:23
【问题描述】:

我想根据原始颜色和正态分布生成随机颜色,因此我可以创建一个随机纹理,告诉脚本“好的,这是您应该使用的一般颜色,但如果您不同时不时地,这很好”。

我正在用 JavaScript 编写,使用 Box-Muller 变换。但是,如果我在每个 R、G 和 B 值上独立使用正态分布,我会得到不希望的尖峰。例如,如果我的基色是浅灰色,我会得到非常红色、非常绿色或非常蓝色的像素。这是我目前的脚本(“0, 255”是最小值和最大值):

function randomHex(hex, deviation){
    R = HexToR(hex);
    G = HexToG(hex);
    B = HexToB(hex);
    R = randomNormal(R, deviation, 0, 255);
    G = randomNormal(G, deviation, 0, 255);
    B = randomNormal(B, deviation, 0, 255);
    return RGBtoHex(R,G,B);
}

我认为我正在寻找的是以某种方式在 RGB 颜色的 3D 空间中定义一个点,然后在球体上选择一个(均匀分布的)随机点,该点的中心是定义的点,其半径是随机生成的正态分布。

无论如何,这就是理论。我只是不知道如何在 JavaScript 中实现这一点。

感谢您的指点!

【问题讨论】:

    标签: javascript random colors rgb normal-distribution


    【解决方案1】:

    我会尝试使用 HSV(或者可能是 HSL)而不是 RGB。您需要一个函数来转换回 RGB(参见here 示例)。在这种情况下,H 是色调,您的值是颜色圆圈上的某个位置。 S 和 V 分别控制饱和度和值/亮度。我认为这将使您有更多的控制权来获得您所追求的发行版。更多信息请参见*here

    【讨论】:

    • 有趣。我应该调查一下。我将它用于 Photoshop 脚本,并且在那里可以访问 HSB 颜色模型(据说与 HSV 相同)。但我将如何随机化?每个值会收到自己的正态分布随机数吗?这会导致色调或饱和度或亮度的飙升(并且很少会出现超过三者之一)。得试试看。谢谢! (还没有足够的声望来投票,抱歉。
    • 我认为这是您想要得到的结果。我的猜测是,您可能需要色调的正态分布,但可能需要不同的饱和度和值/亮度分布。它可以归结为调整每个标准偏差(我怀疑你是否希望所有三个值都相同)