Python中的颜色处理

Posted

技术标签:

【中文标题】Python中的颜色处理【英文标题】:Color handling in Python 【发布时间】:2011-04-12 15:41:53 【问题描述】:

对于我的集群 gui,我目前正在为集群使用随机颜色,因为我事先不知道最终会得到多少个集群。

在 Python 中,这看起来像:

import random
def randomColor():
    return (random.random(),random.random(),random.random())

但是,当我更新内容时,颜色会发生变化。

所以我更喜欢有一个函数,它有一个输入参数,比如

def nonrandomColor(i):
   ...
   return color

总是会为相同的 I 返回相同的颜色,同时保持生成任意多种颜色的能力。

答案不必用 Python 制定,它更像是我感兴趣的一般布局。

【问题讨论】:

显然您想要的是小便池协议blog.xkcd.com/2009/09/02/urinal-protocol-vulnerability 的三维概括,最好是在 HSL 空间中,这样您就可以限制饱和度和亮度,以保证相当大的对比度。 ...或者也许我想多了。 本着过度思考的精神,将sub-random sequences 用于颜色应该提供一些对比。 【参考方案1】:

一种方法是使用缓存。使用defaultdict:

>>> import random
>>> def randomColor():
...    return (random.random(),random.random(),random.random())
... 
>>> from collections import defaultdict
>>> colors = defaultdict(randomColor)
>>> colors[3]
(0.10726172906719755, 0.97327604757295705, 0.58935794305308264)
>>> colors[1]
(0.48991106537516382, 0.77039712435566876, 0.73707003166893892)
>>> colors[3]
(0.10726172906719755, 0.97327604757295705, 0.58935794305308264)

【讨论】:

将 dict 的前几个条目预先设置为易于区分的颜色(红色、黄色、绿色、蓝色)将减少生成带有蓝色、蓝色、蓝色和蓝色线条的图形的机会. @Jason:你的想法很有用。颜色为各种深浅不一的蓝色的风险并不高,但将前几种颜色设为静态也可以使图表更易于理解。【参考方案2】:

只需将随机生成器的seed 设置为索引,这可能比存储颜色便宜。

random.seed(i)

请注意,这会使随机数方式比以前更不随机。如果这是一个问题,例如如果您的应用程序在其他地方使用随机数,您可能需要查看其他答案建议的缓存选项。

【讨论】:

-1 因为频繁设置随机种子会导致随机数生成器高度非随机。如果您的程序还使用随机数来做其他事情,这将是一个坏主意。 避免弄乱随机数生成器的一种方法是使用专门的颜色生成器。 color_rnd = random.Random(); color_rnd.seed(i)【参考方案3】:

如果你想要可重复的非碰撞颜色,那么你可以使用类似下面的函数。它将数字分成 1、10、100,然后将它们用作颜色的 RGB 部分。

def color(i):
  r = i % 10
  g = (i//10) % 10
  b = (i//100) % 10
  return(r*25, g*25, b*25)

例如:

color(1) == (25,0,0)
color(10) == (0,25,0)
color(999) = (225,225,255)

【讨论】:

【参考方案4】:

您想将颜色存储在字典或列表中:

colors =  # int -> color
def nonrandomColor(i):
   if i not in colors:
      colors[i] = randomColor()
   return colors[i] 

【讨论】:

【参考方案5】:

您可以使用i 为随机数生成器播种。因此,只要种子保持不变,您就会得到相同的值。

>>> import random
>>> random.seed(12)
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
(121, 168, 170)
>>> random.seed(12)
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
(121, 168, 170)
>>> random.seed(10)
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
(146, 109, 147)
>>> random.seed(10)
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
(146, 109, 147)

根据您可能生成的颜色数量(即 10 种或 100 万种),缓存方法可能比 seed() 方法更好。

【讨论】:

尽可能不要乱用全局种子!创建您自己的 random.Random 对象并设置其种子。

以上是关于Python中的颜色处理的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 的 Python 图像中的颜色百分比

jpicker中的颜色更改事件处理

[OpenCV-Python] OpenCV 中的图像处理 部分 IV (四)

OpenCV中的图像处理 —— 改变颜色空间+图像几何变换

python 预测python中的颜色

将 RGB 颜色转换为英文颜色名称,如 Python 中的“绿色”