Python PIL-查找最近的颜色(舍入颜色)

Python PIL-查找最近的颜色(舍入颜色),python,colors,python-imaging-library,rounding,roblox,Python,Colors,Python Imaging Library,Rounding,Roblox,有一种叫做Roblox的游戏,玩家通常用乐高积木制作游戏 在Roblox中,对于砖块颜色,可以使用典型的RGB值,但这需要一个额外的元素,当涉及到文件大小时,该元素不是非常有效。与使用RGB值不同,BrickColor在文件大小方面更经济。它使用一个整数来解释为某种颜色。 以下是我的代码片段: import Image f = raw_input('Image:\n') im = Image.open(f) rgb_im = im.convert('RGB') r, g, b = rgb_im

有一种叫做Roblox的游戏,玩家通常用乐高积木制作游戏

在Roblox中,对于砖块颜色,可以使用典型的RGB值,但这需要一个额外的元素,当涉及到文件大小时,该元素不是非常有效。与使用RGB值不同,BrickColor在文件大小方面更经济。它使用一个整数来解释为某种颜色。

以下是我的代码片段:

import Image
f = raw_input('Image:\n')
im = Image.open(f)
rgb_im = im.convert('RGB')
r, g, b = rgb_im.getpixel((x, y))
在我的程序中,我需要找到最接近RGB值的颜色代码


这是如何实现的?

在您的表格中创建一个颜色列表(我称之为颜色)。 根据到您要询问的r、g、b点的距离对列表进行排序 列表中的第一个元素是最接近的颜色

def distance(c1, c2):
    (r1,g1,b1) = c1
    (r2,g2,b2) = c2
    return math.sqrt((r1 - r2)**2 + (g1 - g2) ** 2 + (b1 - b2) **2)

colors = list(rgb_code_dictionary.keys())
closest_colors = sorted(colors, key=lambda color: distance(color, point))
closest_color = closest_colors[0]
code = rgb_code_dictionary[closest_color]

扩展mattsap的答案:

我们不需要对所有颜色进行排序,因为我们只寻找最接近的颜色。i、 e.我们可以避免计算上昂贵的
排序
,而是使用
min

我们也不需要计算颜色之间的绝对距离,因为我们只对相对距离感兴趣。i、 我们也可以避免毕达哥拉斯的“平方根”部分

这使得:

colours = ( (255, 255, 255, "white"),
            (255, 0, 0, "red"),
            (128, 0, 0, "dark red"),
            (0, 255, 0, "green") )


def nearest_colour( subjects, query ):
    return min( subjects, key = lambda subject: sum( (s - q) ** 2 for s, q in zip( subject, query ) ) )


print( nearest_colour( colours, (64, 0, 0) ) ) # dark red
print( nearest_colour( colours, (0, 192, 0) ) ) # green
print( nearest_colour( colours, (255, 255, 64) ) ) # white

当然,一旦你考虑了不同的颜色空间和每个颜色成分对人眼的感知的贡献,就有一个完整的兔子洞要去,但是对于大多数情况来说,这可能是过于夸张了。

你查过乐高颜色指南了吗?应该有一个包含RGB和Pantone的地方,因为两者都希望匹配颜色。我得到了它,因此它可以在RGB值表中找到最近的RGB值,但我如何将其转换为查找颜色整数(如我在问题中链接的颜色代码)?每个RGB值都应该映射到一个整数作为其颜色代码。您可以创建一个字典,其中键是RGB值,值是整数。我要注意,RGB值必须是元组,而不是列表,才能成为字典中的键。谢谢,我是这样格式化颜色表的:
{(27,42,53):26,(242243243):1,(163162165):194,等等。}
这不是一个很好的颜色相似性函数,另请参见