有一款名为Roblox的游戏,其中玩家制作游戏,通常是看起来像乐高积木的游戏。
在Roblox中,对于Brick颜色,您可以使用典型的RGB值,但这需要一个在文件大小方面效率不高的附加元素。 BrickColor不是使用RGB值,而是文件大小更经济。它使用整数来解释为某种颜色。 Here is what I mean:
以下是我的代码片段:
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值的颜色代码。
如何实现这一目标?
答案 0 :(得分:6)
在表格中创建颜色列表(我称之为颜色)。 按照您要质疑的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]
答案 1 :(得分:1)
扩大mattsap的答案:
我们不需要对所有颜色进行排序,因为我们只是在寻找最接近的颜色。也就是说,我们可以避免计算量大的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
。
我们也不需要计算颜色之间的绝对距离,因为我们只对相对距离感兴趣。即我们也可以避免毕达哥拉斯的“平方根”部分。
这给出了:
{{1}}
当然,一旦您考虑了不同的色彩空间以及每种色彩成分对人眼感知的影响,就会出现整个兔子洞as per this question,但是在大多数情况下,这可能是过大的杀伤力