Python从给出的颜色列表中找到最接近颜色的颜色

2024-04-25 19:01:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个20种颜色的列表,每种颜色都是这样的(0,0,0)(rgb),但是值不同,我需要找到最接近我给出的颜色,例如(20019123131)。问题是我不确定应该如何检查关闭的颜色,以及如何设置列表中的所有这些颜色值?在阵列中?在

我一直在想也许把exmaple(1,2,3)=4加上所有的颜色,然后找到最接近的,但我不确定这是否是个好主意。。在

下面是颜色列表:

#(0, 0, 0) - Black
#(127, 127, 127) - Gray
#(136, 0, 21) - Bordeaux
#(237, 28, 36) - red
#(255, 127, 39) - orange
#(255, 242, 0) - yellow
#(34, 177, 76) - green
#(203, 228, 253) - blue
#(0, 162, 232) - dark blue
#(63, 72, 204) - purple
#(255, 255, 255) - white
#(195, 195, 195) - light gray
#(185, 122, 87) - light brown
#(255, 174, 201) - light pink
#(255, 201, 14) - dark yellow
#(239, 228, 176) - light yellow
#(181, 230, 29) - light green
#(153, 217, 234) - light blue
#(112, 146, 190) - dark blue
#(200, 191, 231) - light purple

功能如下:

^{pr2}$

如果你想出一个好的解决方案或有任何问题,请重播谢谢你的帮助!在


Tags: 列表颜色greenbluergbred主意light
2条回答

快速、高效、清洁的解决方案

假设我们有:

list_of_colors = [[255,0,0],[150,33,77],[75,99,23],[45,88,250],[250,0,255]]

为了快速处理,使用numpy并转换成numpy数组

^{pr2}$

所需颜色

color = [155,155,155]

完整代码

import numpy as np

list_of_colors = [[255,0,0],[150,33,77],[75,99,23],[45,88,250],[250,0,255]]
color = [155,155,155]

def closest(colors,color):
    colors = np.array(colors)
    color = np.array(color)
    distances = np.sqrt(np.sum((colors-color)**2,axis=1))
    index_of_smallest = np.where(distances==np.amin(distances))
    smallest_distance = colors[index_of_smallest]
    return smallest_distance 

closest_color = closest(list_of_colors,color)
print(closest_color )

此算法没有循环,由于使用numpy,因此速度非常快

你要找出红、绿、蓝三个数字的绝对差之和,然后选择最小的一个。在

from math import sqrt

COLORS = (
    (181, 230, 99),
    (23, 186, 241),
    (99, 23, 153),
    (231, 99, 29),
)

def closest_color(rgb):
    r, g, b = rgb
    color_diffs = []
    for color in COLORS:
        cr, cg, cb = color
        color_diff = sqrt(abs(r - cr)**2 + abs(g - cg)**2 + abs(b - cb)**2)
        color_diffs.append((color_diff, color))
    return min(color_diffs)[1]

closest_color((12, 34, 156))
# => (99, 23, 153)

closest_color((23, 145, 234))
# => (23, 186, 241)

编辑:改进了代码,使用了上面提到的欧几里得距离计算Sven,而不是基本的差和。在

相关问题 更多 >