如何产生随机的“绿色”的颜色

任何人有任何build议,如何使随机颜色都是绿色的? 现在我正在通过这个来产生颜色:

color = (randint(100, 200), randint(120, 255), randint(100, 200)) 

这大部分工作,但我得到很多棕色的颜色。

简单的解决scheme: 使用HSL或HSV色彩空间而不是RGB(如果需要,可以将其转换为RGB)。 区别在于元组的含义:其中RGB表示红色,绿色和蓝色的值,在HSL中H表示颜色(120度或0.33表示绿色),S表示饱和度,V表示亮度。 所以把H保持在一个固定的值(或者更随机的颜色,你可以随机添加一个小的随机数),随机化S和V.参见维基百科的文章。

正如其他人所build议的那样,在HSV色彩空间(或HSL中,生成随机颜色要容易得多)

因此,生成随机“绿色”颜色的代码(为了演示目的)将其显示为一系列简单的彩色HTML span标签:

 #!/usr/bin/env python2.5 """Random green colour generator, written by dbr, for http://stackoverflow.com/questions/1586147/how-to-generate-random-greenish-colors """ def hsv_to_rgb(h, s, v): """Converts HSV value to RGB values Hue is in range 0-359 (degrees), value/saturation are in range 0-1 (float) Direct implementation of: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_HSV_to_RGB """ h, s, v = [float(x) for x in (h, s, v)] hi = (h / 60) % 6 hi = int(round(hi)) f = (h / 60) - (h / 60) p = v * (1 - s) q = v * (1 - f * s) t = v * (1 - (1 - f) * s) if hi == 0: return v, t, p elif hi == 1: return q, v, p elif hi == 2: return p, v, t elif hi == 3: return p, q, v elif hi == 4: return t, p, v elif hi == 5: return v, p, q def test(): """Check examples on.. http://en.wikipedia.org/wiki/HSL_and_HSV#Examples ..work correctly """ def verify(got, expected): if got != expected: raise AssertionError("Got %s, expected %s" % (got, expected)) verify(hsv_to_rgb(0, 1, 1), (1, 0, 0)) verify(hsv_to_rgb(120, 0.5, 1.0), (0.5, 1, 0.5)) verify(hsv_to_rgb(240, 1, 0.5), (0, 0, 0.5)) def main(): """Generate 50 random RGB colours, and create some simple coloured HTML span tags to verify them. """ test() # Run simple test suite from random import randint, uniform for i in range(50): # Tweak these values to change colours/variance h = randint(90, 140) # Select random green'ish hue from hue wheel s = uniform(0.2, 1) v = uniform(0.3, 1) r, g, b = hsv_to_rgb(h, s, v) # Convert to 0-1 range for HTML output r, g, b = [x*255 for x in (r, g, b)] print "<span style='background:rgb(%i, %i, %i)'>&nbsp;&nbsp;</span>" % (r, g, b) if __name__ == '__main__': main() 

输出(当在networking浏览器中查看时)应该看起来如下:

示例输出,显示随机的绿色

编辑 :我不知道有关colorsys模块。 而不是上面的hsv_to_rgb函数,你可以使用colorsys.hsv_to_rgb ,这使得代码更短(这不是一个简单的替代品,因为我的hsv_to_rgb函数希望色相的度数为0-1):

 #!/usr/bin/env python2.5 from colorsys import hsv_to_rgb from random import randint, uniform for x in range(50): h = uniform(0.25, 0.38) # Select random green'ish hue from hue wheel s = uniform(0.2, 1) v = uniform(0.3, 1) r, g, b = hsv_to_rgb(h, s, v) # Convert to 0-1 range for HTML output r, g, b = [x*255 for x in (r, g, b)] print "<span style='background:rgb(%i, %i, %i)'>&nbsp;&nbsp;</span>" % (r, g, b) 

检查一下colorsys模块:

http://docs.python.org/library/colorsys.html

使用HSL或HSV色彩空间。 将色调随机化为接近绿色,然后为饱和度和V(亮度)select完全随机的东西。

如果你坚持RGB,你基本上只需要确保G值大于R和B,并尽量保持蓝色和红色值相似,使色相不会太疯狂。 从Slaks扩展,也许类似(我知道Python几乎没有):

 greenval = randint(100, 255) redval = randint(20,(greenval - 60)) blueval = randint((redval - 20), (redval + 20)) color = (redval, greenval, blueval) 

所以在这种情况下,你很幸运地想要在原色上进行变化,但对于这样的艺术用途,最好指定色轮坐标而不是原色的色阶。

你可能想从colorsys模块中得到如下的东西:

 colorsys.hsv_to_rgb(h, s, v) Convert the color from HSV coordinates to RGB coordinates. 

HSx色彩空间的解决scheme是一个非常好的解决scheme。 但是,如果您需要的东西非常简单,对色彩的分布(如均匀性)没有特别的要求,那么简单的基于RGB的解决scheme就是确保G值大于R和B

 rr = randint(100, 200) rb = randint(100, 200) rg = randint(max(rr, rb) + 1, 255) 

这会给你“绿色”的颜色。 其中一些会变得稍微带点绿色。 您可以通过增加(绝对或相对)最后一个randint调用的下限来增加绿色的保证程度。

你想要的是用HSL而不是RGB来工作。 你可以find一个满足“绿色”的色调范围,并从中select一个随机的色调。 你也可以select随机的饱和度和亮度,但是你可能想保持你的饱和度接近1,你的亮度在0.5左右,但是你可以和他们一起玩。

下面是一些将HSL转换为RGB的动作代码。 我有一段时间没有碰到python,或者会发布python版本。

我发现绿色是0.47 * PI到0.8 * PI。

  /** @param h hue [0, 2PI] @param s saturation [0,1] @param l lightness [0,1] @return object {r,g,b} {[0,1],[0,1][0,1]} */ public function hslToRGB(h:Number, s:Number, l:Number):Color { var q:Number = (l<0.5)?l*(1+s):l+sl*s; var p:Number = 2*lq; var h_k:Number = h/(Math.PI*2); var t_r:Number = h_k+1/3; var t_g:Number = h_k; var t_b:Number = h_k-1/3; if (t_r < 0) ++t_r; else if (t_r > 1) --t_r; if (t_g < 0) ++t_g; else if (t_g > 1) --t_g; if (t_b < 0) ++t_b; else if (t_b > 1) --t_b; var c:Color = new Color(); if (t_r < 1/6) cr = p+((qp)*6*t_r); else if (t_r < 1/2) cr = q; else if (t_r < 2/3) cr = p+((qp)*6*(2/3-t_r)); else cr = p; if (t_g < 1/6) cg = p+((qp)*6*t_g); else if (t_g < 1/2) cg = q; else if (t_g < 2/3) cg = p+((qp)*6*(2/3-t_g)); else cg = p; if (t_b < 1/6) cb = p+((qp)*6*t_b); else if (t_b < 1/2) cb = q; else if (t_b < 2/3) cb = p+((qp)*6*(2/3-t_b)); else cb = p; return c; } 

最简单的方法是确保红色和蓝色组件是相同的,就像这样:(原谅我的Python)

 rb = randint(100, 200) color = (rb, randint(120, 255), rb) 

我会和其他人提到的HSV方法一起使用。 另一种方法是获得一个很好的高分辨率的照片,其中绿色的部分,裁剪非绿色的部分,并从中挑选随机像素使用PIL 。