2011-07-27 72 views
3

狀態:I am developing my own library顏色分類庫


問:

有沒有可以做顏色分類任何庫?

我想像這樣的工作流程:

>>> import colorclassification 
>>> classifier = colorclassification.Classifier 
>>> color = classifier.classify_rgb([255, 255, 0]) 
['yellow'] 
>>> color = classifier.classify_rgb([255, 170, 0]) 
['orange'] 

庫不一定必須爲Python。任何可以查看模塊/庫源代碼的語言都可以。

+1

我這個標記基於Python你的示例代碼。請在將來使用語言/平臺標記,以便人們可以提供相關答案。 '[顏色]'本身可能適用於*數量龐大的語言,並且不足以確定問題的背景。 – eldarerathis

+0

我不在乎python。因爲現在我什麼也找不到,如果我能找到一個可以做到的圖書館的鏈接,那麼這將是有價值的。 – joar

回答

9

你可以做到這一點的一種方法就是找到「最接近」的顏色。假設我們有一組顏色,它不必覆蓋所有16777216可能的rgb值,它甚至不需要在rgb中,但爲了簡單起見,它可能看起來像這樣:

colors = {'red': (255,0,0), 
      'green': (0,255,0), 
      'blue': (0,0,255), 
      'yellow': (255,255,0), 
      'orange': (255,127,0), 
      'white': (255,255,255), 
      'black': (0,0,0), 
      'gray': (127,127,127), 
      'pink': (255,127,127), 
      'purple': (127,0,255),} 

讓我們定義一個機制,通過「最接近」的顏色告訴我們我們真的是什麼意思。在這種情況下,我會使用一個簡單的笛卡爾距離,但任何能比較兩種顏色的東西都會有相似之處。

def distance(left, right): 
    return sum((l-r)**2 for l, r in zip(left, right))**0.5 

class NearestColorKey(object): 
    def __init__(self, goal): 
     self.goal = goal 
    def __call__(self, item): 
     return distance(self.goal, item[1]) 

這實際上就是我們所需要的。我們可以使用內置的min()(或最大,如果你的相似功能進行更多類似的顏色返回值越高)

>>> min(colors.items(), key=NearestColorKey((10,10,100))) 
('black', (0, 0, 0)) 
>>> min(colors.items(), key=NearestColorKey((10,10,200))) 
('blue', (0, 0, 255)) 
>>> min(colors.items(), key=NearestColorKey((100,10,200))) 
('purple', (127, 0, 255)) 
>>> 
+6

如果最終使用笛卡爾距離來比較顏色,通常應該將輸入轉換爲*線性,感知*顏色空間,例如Lab或Yuv。 RGB和HSV都不是線性的,所以笛卡爾距離實際上與相似的兩種顏色沒有多大關係。 – SingleNegationElimination

+0

謝謝你的這篇文章,這是迄今爲止最相關的。不過,我剛剛完成了[我的圖書館](https://github.com/jwandborg/py-color-classifier)。這是一種完全不同的方法,更基於條件的不是太多的魔法,可以是好的也可以是不好的,但我會明確地解決你的解決方案,因爲它比我現在更簡單,而且我有點厭倦定義顏色範圍。 – joar

+0

我完成了[我的實現](https://github.com/jwandborg/py-colorclassifier/blob/v2.0/colorclassifier.py),它完美的工作:) – joar