Если бы вы могли представить все цвета, которые вы ищете, в том же числовом формате, который возвращает ImageMagick.Затем вы можете сравнить значения RGB, чтобы определить, к какому из них оно ближе всего.
Так, например, если у вас есть значение гистограммы (при условии 255 значений для каждого цвета, YMMV) * 1003 *
{ red => 10, green => 255, blue => 10 }
Тогда вы можете сравнить его с каждым из
{
red => {red => 255, green => 0, blue => 0},
green => {red => 0, green => 255, blue => 0},
blue => {red => 0, green => 0, blue => 255}
}
Таким образом, если вы сложите разницу между всеми элементами, вы получите
{
red => 510,
green => 20,
blue => 510,
}
Таким образом, вы сможете ясно увидеть, что цвет ближе всего к зеленому
ОБНОВЛЕНИЕ: добавлено решениев рубине
def compare_color(color_val)
colors = {
:red => [255,0,0],
:green => [0,255,0],
:blue => [0,0,255]
}
difference = {}
def compare_array(a1,a2)
total = 0
a1.each_index do |x|
total += (a1[x]-a2[x]).abs
end
total
end
colors.each do |color,hex|
difference[color] = compare_array(color_val,hex)
end
closest = difference.sort{|a,b| a[1] b[1]}.first [closest,difference]
end
p compare_color([10,255,10])
# [[:green, 20], {:red=>510, :green=>20, :blue=>510}]