5

我正在为颜色创建一个快速查找表。假设您给我一个红色阴影,然后我会将其转换为最接近的网络安全颜色并执行查找。它会返回许多不同深浅的红色,这对我来说没问题。

我现在唯一的问题是如何将给定的 RGB 值转换为网络安全值?我正在使用 PIL 和 Python。我也不介意编写自己的算法,但这对我来说有点太难了。

4

3 回答 3

4

我不知道是否有使用 PIL 的特定方法,但是如果您有 rgb 颜色,并且我们将最接近的网络安全颜色定义为 rgb 空间中距离最小的颜色,您可以这样做如下:

def getwebsafe(r,g,b):
  rw = 51 * ((int(r)+25)//51)
  gw = 51 * ((int(g)+25)//51)
  bw = 51 * ((int(b)+25)//51)
  return (rw,gw,bw)

这是因为网络安全颜色对每个组件都有 6 种可能的色调:(0,51,102,153,204,255)。如果您颜色中的组件在 [0,25] 范围内,则最接近的是 0,如果它在 [26-76] 范围内,则最接近的是 51,依此类推。

或者,以列表形式表示的 rgb 颜色的较短版本:

def getwebsafe(colour):
  return [51*((int(c)+25)//51) for c in colour]

编辑:编辑以确保即使 Python 使用非整数表示颜色以及 Python 2 和 3 也能正常工作。

于 2012-10-24T22:19:54.163 回答
1

正如我在@pedrosorio 的回答下的评论中所说,我认为这可以通过使用表查找更有效地完成。这意味着几乎所有的数学计算都在创建表格时完成一次,并且只完成了 256 次,而不是针对每个像素。这就是我的意思,使用 pedrosorio 的公式:

tbl = tuple(51*((int(i)+25)//51) for i in xrange(256))

def websafe(*color):
    return tuple(tbl[c] for c in color)

safecolor = websafe(34,55,13)

但是,我不确定该公式如何映射 0-255 范围值——因为它为六种主要色调中的每一种分配了以下数量的条目:

shade count
 0x00  26
 0x33  51
 0x66  51
 0x99  51
 0xcc  51
 0xff  26

相反,我会使用这个稍微简单的公式:

tbl = tuple(51*(i//43) for i in xrange(256))

这给出了更均匀的阴影分布:

shade count
 0x00  43
 0x33  43
 0x66  43
 0x99  43
 0xcc  43
 0xff  41

一旦你知道分布计数,你甚至可以做这样的事情,它只涉及很少的数学。当然,没有什么理由去优化非速度关键的代码。

tbl = ((0x00,)*43 + (0x33,)*43 + (0x66,)*43 +
       (0x99,)*43 + (0xcc,)*43 + (0xff,)*41)
于 2012-10-25T00:00:02.563 回答
0

我有类似的问题,需要将图像中的所有像素转换为最接近的原色和二次色

为此,我使用了此答案https://stackoverflow.com/a/22478139/9799700中提到的 K 维树方法,如下所示

  # import the necessary packages
  import scipy.spatial as sp

  #Add more colors to this array if you need 
  main_colors = [(0,0,0),
              (255,255,255),
              (255,0,0),
              (0,255,0),
              (0,0,255),
              (255,255,0),
              (0,255,255),
              (255,0,255),
              ] 

  #replace r,g,b variables with your pixel rgb values
  pixelColor = (r,g,b)
  kdTree = sp.KDTree(main_colors) 
  ditsance,result = kdTree.query(pixelColor) 
  nearest_color = main_colors[result]

我的完整代码:https ://gist.github.com/ssethsara/bc4ece5f2d959e6b434b73db29959248

于 2018-10-20T15:48:55.940 回答