我想检查一下图片中的颜色。这将存储在数据库中并用于搜索表单。 (红色= 1,绿色= 1,蓝色= 0,黄色= 1,黑色= 1,白色= 1等)
img = Magick::Image.read('phosto-file.jpg').first
img = img.quantize(10
h = img.color_histogram
pp h
{red=12815, green=18494, blue=15439, opacity=0=>13007,
red=44662, green=47670, blue=51967, opacity=0=>18254,
red=17608, green=43331, blue=48321, opacity=0=>11597,
red=21105, green=25865, blue=39467, opacity=0=>10604,
red=15125, green=36629, blue=22824, opacity=0=>10223,
red=52102, green=42405, blue=10063, opacity=0=>12928,
red=39043, green=28726, blue=40855, opacity=0=>7728,
red=10410, green=8880, blue=7826, opacity=0=>13795,
red=25484, green=25337, blue=24235, opacity=0=>7351,
red=44485, green=12617, blue=11169, opacity=0=>14513}
如何将10个值转换为颜色名称?红色,绿色,NOMATCH,黄色,黑色,白色等。只需要粗糙的颜色名称 - 不是LimeGreen而是Green等。
祝你好运。 AsbjørnMorell
答案 0 :(得分:1)
简单的方法是获得RGB值列表和相应的名称,然后选择最接近的匹配颜色(在一些可接受的误差范围内)。对于基本颜色,即使每个RGB通道中的一个非常简单的差异总和也可以提供可行的结果,但我怀疑如果数据看起来那样你将会用尽颜色名称。你可以在网上找到一个list of colour names,也许剥离一个这样的列表可能有所帮助。 (请注意,这些颜色通常需要0..255的范围,因此您需要从数据中更宽的范围进行转换。)
稍微更高级的方法可以是将RGB值转换为色调,饱和度和亮度,并使用它们来生成名称,例如:当红色为红色时,“暗红色”,饱和度高到不灰色,亮度低(但不低到黑色)。
答案 1 :(得分:1)
如果您可以使用ImageMagick返回的相同数字格式表示您要查找的所有颜色。然后,您可以比较RGB值以找到它最接近的值。
因此,例如,如果您的直方图值为(假设每种颜色的值为255,则为YMMV)
{ 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,
}
所以你可以清楚地看到颜色最接近绿色
更新:在Ruby中添加了一个解决方案
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}]
答案 2 :(得分:1)
您可能会在我的博客上发现this post。它解释了如何解决您的问题。我还发布了ColorNamer gem,它可以从RGB值或HTML哈希中为您提供最接近的命名颜色。您还可以使用任何Color对象