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

Posted

技术标签:

【中文标题】将 RGB 颜色转换为英文颜色名称,如 Python 中的“绿色”【英文标题】:Convert RGB color to English color name, like 'green' with 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>)? 【参考方案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 通过我所做的修复(以避免除以零错误)。 这是(根据我的理解)一种近似计算,不需要加载大量数据表即可获得接近的值,并且允许设置您自己的所需颜色集。

【讨论】:

以上是关于将 RGB 颜色转换为英文颜色名称,如 Python 中的“绿色”的主要内容,如果未能解决你的问题,请参考以下文章

将十六进制颜色转换为RGB,反之亦然。

将 RGB 颜色转换为 XY

将 RGBA 颜色转换为 RGB

如何将“背景颜色”转换为 rgb() 格式?

将 RGB 颜色值转换为十进制

如何将 RGB 转换为 HTML 颜色?