我想将一个颜色元组转换为颜色名称,例如 'yellow' 或 'blue'
>>> im = Image.open("test.jpg")
>>> n, color = max(im.getcolors(im.size[0]*im.size[1]))
>>> print color
(119, 172, 152)
Python中是否有一种简单的方法来做到这一点?
看起来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
for key, name in webcolors.css3_hex_to_names.items():
替换为for name, key in webcolors.CSS3_HEX_TO_NAMES.items():
。 然后,剩下的代码(除了print语句只需要用f-string和括号包裹)就应该可以工作了。 - Andrew Stewartwebcolors.CSS3_HEX_TO_NAMES.items()
中的for key, name
对于使用webcolors-1.11.1的我非常有效。我只是交换了key
和name
的位置。 - Rajab Shakirov有一个名为pynche的程序,可以将Python中的RGB转换为英文颜色名称。
您可以尝试使用ColorDB.py
中的ColorDB.nearest()
方法,该方法可以实现您想要的功能。
您可以在此处找到有关此方法的更多信息:ColorDB Pynche
对于像我这样想要更熟悉颜色名称的人,可以使用由 webcolors
提供的 CSS 2.1 颜色名称:
#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
。 - loved.by.Jesusdef get_color_name(rgb):
colors = {
"red": (255, 0, 0),
"green": (0, 255, 0),
"blue": (0, 0, 255),
"yellow": (255, 255, 0),
"magenta": (255, 0, 255),
"cyan": (0, 255, 255),
"black": (0, 0, 0),
"white": (255, 255, 255)
}
min_distance = float("inf")
closest_color = None
for color, value in colors.items():
distance = sum([(i - j) ** 2 for i, j in zip(rgb, value)])
if distance < min_distance:
min_distance = distance
closest_color = color
return closest_color
# Testing
print(get_color_name((255, 0, 0))) # red
print(get_color_name((0, 255, 0))) # green
print(get_color_name((0, 0, 255))) # blue
(0,255,0)
。你希望color((0,254,0))
是什么颜色? - Katriel