2011-10-14 85 views
7

我有大約3000個圖像和13種不同的顏色(大多數這些圖像的背景是白色的)。如果圖像的主要顏色是13種不同顏色之一,我希望它們相關聯。Python中的主要顏色檢測

我見過類似的問題,如Image color detection using python要求平均顏色算法。我已經使用Python圖像庫和直方圖非常複製了這些代碼,並且使它可以正常工作 - 但是我發現確定主色不太可靠。

任何想法?或者可以解決這個問題的庫?

在此先感謝!

:編輯: 謝謝你們 - 你們幾乎都說過同樣的事情,創建「桶」並增加每個最近像素的桶數。我似乎獲得了許多圖像,返回「白色」或「米色」,這也是大多數這些圖像的背景。有沒有辦法解決或忽略背景?

再次感謝。

+0

什麼是你定義的顏色?一個rgb三聯體? (r/g,b/g)?從hsv空間的色調? – Simon

+0

抱歉的歧義 - 我的意思是RGB三聯 – dchang

回答

9

您可以使用getcolors函數獲取圖像中所有顏色的列表。它返回形式元組的列表:

(N, COLOR) 

其中N是彩色COLOR的圖像中出現的次數。爲了獲得最大的發生顏色,你可以將列表傳遞給max功能:

>>> from PIL import Image 
>>> im = Image.open("test.jpg") 
>>> max(im.getcolors(im.size[0]*im.size[1])) 
(183, (255, 79, 79)) 

注意,我通過im.size[0]*im.size[1]到getcolors功能,因爲這是最大maxcolors值(見the docs瞭解詳細信息)。

+0

圖像庫現在叫別的東西嗎? –

+0

我明白了。 '從PIL導入圖像' –

2

就我個人而言,我會將色彩空間分成8-16種主色,然後對於每個像素,我會將最接近的彩色桶增加一個。最後,具有最高像素量的桶的顏色獲勝。

基本上,認爲中位數而不是平均。你只關心顏色圖像,而平均顏色通常會給你一個全新的顏色。

1

由於您試圖匹配少量預先存在的顏色,因此您可以嘗試不同的方法。根據所有顏色測試每個圖像,並查看哪一個是最接近的匹配。

至於做比賽,我會開始調整每個圖像的大小以減小每個圖像的工作量;我們對圖像顏色的感知不太依賴於細節的數量。對於較小圖像的每個像素,找出最接近的13種顏色中的哪一種。如果它在一定的閾值內,就會碰到該顏色的計數器。最後的13支球隊中,無論哪一支都是贏家。