2013-06-03 110 views
5

我有一個圖像是多色的。獲得支配顏色opencv

enter image description here

我要計算圖像的主色。主色是紅色的,我想過濾出紅色。我正在做opencv中的下面的代碼,但它沒有執行。

inRange(input_image, Scalar(0, 0, 0), Scalar(0, 0, 255), output); 

如何才能獲得主色?我的最終項目應該自行確定對象的最大顏色。這是最好的方法是什麼?

回答

7

最好的方法是通過分析直方圖。

你的問題是一個經典的「找到高峯和下峯面積」。通過具有圖像文件(假設我們只需要第三通道爲簡單起見):

histogram

你必須找到在直方圖中的最高峯。最簡單的方法是簡單地查詢Y被最大化的X.更高級的方法與Windows一起工作 - 它們平均10個連續數據點的Y值等。

此外,在HSV或YCrCb色彩空間中工作。 HSV很好,因爲「色調」通道非常接近您所說的「顏色」。 RGB實際上不適合圖像分析。

+0

R,G和B通道的單獨直方圖無助於尋找主色。你需要一個直方圖,其中一個bin是一個RGB三元組。當然,尺寸會隨着通道數量呈指數增長,但是3個通道仍然可以管理,另外,您可以使用像'std :: unordered_multiset'這樣的容器作爲合理的解決方案 –

+1

當然,這會變成一個三維問題,它具有設置起來要複雜得多。 –

9

在搜索最常用的顏色之前,您應該使用quantize(減少顏色數量)圖像。

爲什麼?想像一下具有100個像素(0,0,255)(藍色int RGB),100像素(0,0,254)(幾乎是藍色 - 你甚至不會找到差異)以及(0,255,0)(綠色)的150像素的圖像。這裏最常見的顏色是什麼?顯然,它是綠色的。但是在量化之後,您將獲得200像素的藍色和150像素的綠色。

閱讀此討論:How to reduce the number of colors in an image with OpenCV?。下面是簡單的例子:

int coef = 200; 
Mat quantized = img/coef; 
quantized = quantized*coef; 

這就是我申請之後有:

enter image description here

您也可以使用k均值或平均移做(這是多少有效的方式)。