6

有一个叫做 Roblox 的游戏,玩家在其中制作游戏,通常是看起来像乐高的积木。

在 Roblox 中,对于 Brick 颜色,您可以使用典型的 RGB 值,但这需要一个额外的元素,在文件大小方面效率不高。BrickColor 不是使用 RGB 值,而是在文件大小方面更加经济。它使用一个整数来解释为某种颜色。这就是我的意思: 颜色代码

这是我的代码片段:

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 值的颜色代码。

这怎么可能实现?

4

2 回答 2

9

扩展mattsap的答案:

我们不需要对所有颜色进行排序,因为我们只寻找最接近的. 即我们可以避免计算成本高昂sort而使用min

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

这给出了:

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

当然,一旦你考虑了不同的色彩空间以及每个颜色成分对其人眼感知的贡献,根据这个问题,就有一个完整的兔子洞要下去,但这对于大多数情况来说可能过于矫枉过正。

于 2019-11-01T09:20:22.863 回答
9

在表格中创建一个颜色列表(我称之为颜色)。按到您所询问的 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]
于 2015-12-19T05:05:00.697 回答