我想将颜色元组转换为颜色名称,例如“黄色”或“蓝色”
>>> 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
它不适用于所有RGB组合,例如:print(webcolors.rgb_to_name((231,201,186)))引发错误,即“ ValueError:'#e7c9ba'在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字符串括起来并括在括号中的print语句)应该可以正常工作。@AndrewStewart
for key, name in webcolors.CSS3_HEX_TO_NAMES.items():
使用webcolors-1.11.1为我工作。我切换key
和name
。