Python PIL - 寻找最近的颜色(四舍五入颜色)
Posted
技术标签:
【中文标题】Python PIL - 寻找最近的颜色(四舍五入颜色)【英文标题】:Python PIL - Finding Nearest Color (Rounding Colors) 【发布时间】:2016-03-25 20:00:11 【问题描述】:有一个名为 Roblox 的游戏,玩家可以在其中制作游戏,通常是看起来像乐高的积木。
在 Roblox 中,对于 Brick 颜色,您可以使用典型的 RGB 值,但这需要一个额外的元素,在文件大小方面效率不高。 BrickColor 不是使用 RGB 值,而是在文件大小方面更加经济。它使用一个整数来解释为某种颜色。 Here is what I mean:
这是我的代码的 sn-p:
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 值的颜色代码。
如何实现?
【问题讨论】:
你查过乐高色彩指南吗?应该有一个包含 RGB 和 Pantone 的地方,因为两者都想匹配颜色。 【参考方案1】:在您的表格中创建一个颜色列表(我称之为颜色)。 按到您要询问的 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]
【讨论】:
我知道了,所以它会在 RGB 值表中找到最接近的 RGB 值,但是我如何将其转换为找到颜色整数(如我在问题中链接的颜色代码)? 每个 RGB 值都应该映射到一个整数作为它们的颜色代码。您可以创建一个字典,其中键是 RGB 值,值是整数。我会注意到 RGB 值必须是一个元组,而不是一个列表,以便它成为字典中的一个键。见***.com/questions/1938614/… 谢谢,我通过像这样格式化颜色表来让它工作:(27,42,53):26, (242,243,243):1, (163,162,165):194, etc.
这不是一个很好的颜色相似度函数,另见***.com/questions/5392061【参考方案2】:
扩展 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
当然,一旦您考虑到不同的色彩空间以及每种颜色成分对人眼感知的贡献,就会发现整个兔子洞,as per this question,但在大多数情况下,这可能过于矫枉过正。
【讨论】:
以上是关于Python PIL - 寻找最近的颜色(四舍五入颜色)的主要内容,如果未能解决你的问题,请参考以下文章
Python 细聊一下可以媲美 PS 的 PIL 图片处理库
使用PIL在python中旋转并将expand参数设置为true时指定图像填充颜色