Python - Найти цвет, наиболее близкий к цвету, из списка цветов - PullRequest
0 голосов
/ 17 января 2019

У меня есть список из 20 цветов, каждый из которых похож на (0,0,0) (rgb), но с разными значениями, и мне нужно найти наиболее близкий к цвету, который я даю, например (200, 191 231). проблема, я не уверен, как я должен проверить, какой цвет закрывает, и как я должен установить все эти значения цвета в списке? в массиве?

Я думал, может быть, добавлю все цвета для 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

А вот и функция:

def paint(pixel):
  r,g,b,a = pix[x,y]
  print(str(r) + ' '+  str(g) + ' ' + str(b))
  sleep(0.20)

Если вы нашли хорошее решение или у вас возникли какие-либо вопросы, пожалуйста, повторите благодарность за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Быстрое, эффективное и чистое решение

Допустим, у нас есть:

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

Для быстрой обработки используйте numpy и преобразуйте в numpyмассив

import numpy as np

желаемый цвет

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

0 голосов
/ 17 января 2019

Вы хотите найти сумму абсолютной разности между красным, зеленым и синим числами и выбрать наименьшее.

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)

РЕДАКТИРОВАТЬ: Улучшен код и используется Евклидово вычисление расстояния, указанное Свеном вместо базовой разницы.

...