将 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 为我工作。我切换了key
和name
。【参考方案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 mc
和mycss4list = mc.CSS4_COLORS
【参考方案5】:
我发现解决此问题的最佳解决方案是 tux21b 在此帖子中提供的解决方案:find the colour name from a hexadecimal colour code 通过我所做的修复(以避免除以零错误)。 这是(根据我的理解)一种近似计算,不需要加载大量数据表即可获得接近的值,并且允许设置您自己的所需颜色集。
【讨论】:
以上是关于将 RGB 颜色转换为英文颜色名称,如 Python 中的“绿色”的主要内容,如果未能解决你的问题,请参考以下文章