【问题标题】:Convert RGB color to English color name, like 'green' with Python将 RGB 颜色转换为英文颜色名称,如 Python 中的“绿色”
【发布时间】:2012-03-30 10:50:49
【问题描述】:

我想将颜色元组转换为颜色名称,例如“黄色”或“蓝色”

>>> im = Image.open("test.jpg")
>>> n, color = max(im.getcolors(im.size[0]*im.size[1]))
>>> print color
(119, 172, 152)

python中有没有简单的方法来做到这一点?

【问题讨论】:

  • 我想我找到了你要找的机器人...pypi.python.org/pypi/webcolors/…
  • 我不知道是否已经有解决方案,但是任何这样的映射都必然是启发式的并且完全是主观的......不过,有趣的问题!
  • 您想要精确颜色名称还是近似值?例如,“绿色”(显然)是(0,255,0)。你希望color((0,254,0)) 是什么?
  • @WillVousden 不一定:有些颜色有正式名称。
  • 您是否希望颜色与在 HTML 中设置字体颜色时使用的颜色相同(例如,<font color = "red">Sample text</font>)?

标签: python css image colors tuples


【解决方案1】:

看起来webcolors 将允许您这样做:

rgb_to_name(rgb_triplet, spec='css3')

将适用于 rgb() 颜色三元组的 3 元组整数转换为其对应的标准化颜色名称(如果存在此类名称);有效值为 html4、css2、css21 和 css3,默认为 css3。

例子:

>>> rgb_to_name((0, 0, 0))
'black'

反之亦然:

>>> name_to_rgb('navy')
(0, 0, 128)

要找到最接近的颜色名称:

但是,如果webcolors 找不到与请求颜色匹配的颜色,则会引发异常。我编写了一个小修复程序,为请求的 RGB 颜色提供最接近的匹配名称。它通过 RGB 空间中的欧几里得距离进行匹配。

import webcolors

def closest_colour(requested_colour):
    min_colours = {}
    for key, name in webcolors.css3_hex_to_names.items():
        r_c, g_c, b_c = webcolors.hex_to_rgb(key)
        rd = (r_c - requested_colour[0]) ** 2
        gd = (g_c - requested_colour[1]) ** 2
        bd = (b_c - requested_colour[2]) ** 2
        min_colours[(rd + gd + bd)] = name
    return min_colours[min(min_colours.keys())]

def get_colour_name(requested_colour):
    try:
        closest_name = actual_name = webcolors.rgb_to_name(requested_colour)
    except ValueError:
        closest_name = closest_colour(requested_colour)
        actual_name = None
    return actual_name, closest_name

requested_colour = (119, 172, 152)
actual_name, closest_name = get_colour_name(requested_colour)

print "Actual colour name:", actual_name, ", closest colour name:", closest_name

输出:

Actual colour name: None , closest colour name: cadetblue

【讨论】:

  • 它不适用于所有 RGB 组合,例如: print(webcolors.rgb_to_name((231, 201, 186))) 抛出错误,即“ValueError: '#e7c9ba' has no defined color name in css3"
  • @Asim,看起来此代码适用于较早的(可能是 Py2)版本。对于 webcolors-1.11.1,您需要将 for key, name in webcolors.css3_hex_to_names.items(): 替换为 for name, key in webcolors.CSS3_HEX_TO_NAMES.items():。然后其余的代码(除了打印语句,它只需要 f-stringed 并用括号括起来)应该可以工作。
  • @AndrewStewart for key, name in webcolors.CSS3_HEX_TO_NAMES.items(): 使用 webcolors-1.11.1 为我工作。我切换了keyname
【解决方案2】:

有一个叫做pynche的程序可以把RGB改成Python的英文颜色名称。

您可以尝试使用ColorDB.py中的方法ColorDB.nearest(),它可以为所欲为。

您可以在此处找到有关此方法的更多信息:ColorDB Pynche

【讨论】:

  • 提供的链接不再起作用。在这里你可以找到文件ColorDB.py
【解决方案3】:

解决问题的方法是将 RGB 值映射到 HSL 颜色空间。

在 HSL 颜色空间中获得颜色后,您可以使用 H(色调)组件将其映射到颜色。请注意,颜色是一个有点主观的概念,因此您必须定义 H 的哪些范围对应于给定颜色。

【讨论】:

    【解决方案4】:

    和我一样,想要一个更熟悉的颜色名称,可以使用CSS 2.1 colour names,同样由webcolors提供:

    • 水:#00ffff
    • 黑色:#000000
    • 蓝色:#0000ff
    • 紫红色:#ff00ff
    • 绿色:#008000
    • 灰色:#808080
    • 石灰:#00ff00
    • 栗色:#800000
    • 海军:#000080
    • 橄榄:#808000
    • 紫色:#800080
    • 红色:#ff0000
    • 银:#c0c0c0
    • 蓝绿色:#008080
    • 白:#ffffff
    • 黄色:#ffff00
    • 橙色:#ffa500

    只需使用 fraxel 的优秀答案和代码来获得最接近的颜色,适应 CSS 2.1:

    def get_colour_name(rgb_triplet):
        min_colours = {}
        for key, name in webcolors.css21_hex_to_names.items():
            r_c, g_c, b_c = webcolors.hex_to_rgb(key)
            rd = (r_c - rgb_triplet[0]) ** 2
            gd = (g_c - rgb_triplet[1]) ** 2
            bd = (b_c - rgb_triplet[2]) ** 2
            min_colours[(rd + gd + bd)] = name
        return min_colours[min(min_colours.keys())]
    

    【讨论】:

    • 您可以使用matplotlib.colors提供的CSS4列表获得更高的准确性。例如import matplotlib.colors as mcmycss4list = mc.CSS4_COLORS
    【解决方案5】:

    我发现解决此问题的最佳解决方案是 tux21b 在此帖子中提供的解决方案:
    find the colour name from a hexadecimal colour code
    通过我所做的修复(以避免除以零错误)。
    这是(根据我的理解)一种近似计算,不需要加载大量数据表即可获得接近的值,并且允许设置您自己的所需颜色集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-08
      • 2017-10-28
      • 2018-11-14
      • 2017-06-24
      • 2018-06-16
      • 2020-01-16
      • 2018-12-23
      • 1970-01-01
      相关资源
      最近更新 更多