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

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

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

在 python 中有一种简单的方法来做到这一点吗?

61321 次浏览

看起来 网彩允许你这样做:

Rgb _ to _ name (rgb _ triplet,spec = ‘ css3’)

如果存在这样的名称,将一个3元组的整数(适合在 rgb () color triplet 中使用)转换为相应的标准化颜色名称; 有效值为 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

有一个程序称为 pynche,它可以改变 RGB 的颜色名称在 Python 的英语。

您可以尝试使用 ColorDB.py中的 ColorDB.nearest()方法,它可以做您想做的事情。

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

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

一旦你在 HSL 颜色空间中有了颜色,你可以使用 H (色相)组件来映射它的颜色。请注意,颜色是一个有点主观的概念,所以您必须定义哪些范围的 H 对应于给定的颜色。

对于那些像我一样想要一个更熟悉的颜色名称的人,你可以使用 CSS 2.1颜色名称,也由 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())]

我找到的解决这个问题的最佳方案是 tux21b 在这篇文章中提供的:
从十六进制颜色代码中查找颜色名称
通过我所做的修复(以避免除零错误)。
这是一个近似计算(据我的理解) ,它不需要加载大量的数据表来获得一个近似值,并且允许设置您自己需要的一组颜色。