2010-04-05 283 views
4

我想查看圖像中存在的顏色。這將被存儲在數據庫中並用於搜索表單。 (紅= 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,而是綠色等。

此致敬意。 AsbjørnMorell

+0

您示例中的ruby代碼無效:opacity = 0 => 13007無效。 – kikito 2010-04-05 20:54:23

回答

1

如果您可以用ImageMagick返回的相同數字格式表示您正在查找的所有顏色。然後,您可以比較RGB值,找出最接近的值。

因此,舉例來說,如果你有一個直方圖值(假設每種顏色255個值,因人而異)

{ 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, 
} 

所以你可以清楚地看到col或者是最接近綠色

UPDATE:已在紅寶石


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}] 
+0

如果代碼是數組而不是散列,這段代碼可能會更容易(從數學的角度來看),但這樣可以得到更好的結果 – Fotios 2010-04-06 13:50:09

+0

非常好。謝謝你的例子。 :) – atmorell 2010-04-06 21:13:49

1

簡單的方法是獲得一個RGB值列表和相應的名稱,然後選擇最接近的匹配顏色(在一些可接受的誤差範圍內)。對於基本顏色,即使每個RGB通道的差異總和也可以得到可行的結果,但是如果數據看起來像這樣,我懷疑你會用盡顏色名稱。你可以在網上找到一個list of colour names,也許剝奪一個這樣的列表可能會有所幫助。 (請注意,這些顏色的顏色範圍通常爲0..255,因此您需要從數據範圍較寬的範圍中進行轉換。)

稍微更高級的方法可能是將RGB值轉換成色調,飽和度和亮度,並使用它們來生成名稱,例如當色調是紅色時,「暗紅色」,飽和度足夠高而不是灰色,並且亮度低(但不夠低,不足以成爲黑色)。

1

解決您可能會發現this post在我的博客有趣。它解釋瞭如何解決你的問題。我還發布了​​,它可以使您從RGB值或HTML哈希中獲得最接近的命名顏色。您也可以使用任何Color對象

相關問題