我有一個圖像是多色的。獲得支配顏色opencv
我要計算圖像的主色。主色是紅色的,我想過濾出紅色。我正在做opencv中的下面的代碼,但它沒有執行。
inRange(input_image, Scalar(0, 0, 0), Scalar(0, 0, 255), output);
如何才能獲得主色?我的最終項目應該自行確定對象的最大顏色。這是最好的方法是什麼?
我有一個圖像是多色的。獲得支配顏色opencv
我要計算圖像的主色。主色是紅色的,我想過濾出紅色。我正在做opencv中的下面的代碼,但它沒有執行。
inRange(input_image, Scalar(0, 0, 0), Scalar(0, 0, 255), output);
如何才能獲得主色?我的最終項目應該自行確定對象的最大顏色。這是最好的方法是什麼?
最好的方法是通過分析直方圖。
你的問題是一個經典的「找到高峯和下峯面積」。通過具有圖像文件(假設我們只需要第三通道爲簡單起見):
你必須找到在直方圖中的最高峯。最簡單的方法是簡單地查詢Y被最大化的X.更高級的方法與Windows一起工作 - 它們平均10個連續數據點的Y值等。
此外,在HSV或YCrCb色彩空間中工作。 HSV很好,因爲「色調」通道非常接近您所說的「顏色」。 RGB實際上不適合圖像分析。
在搜索最常用的顏色之前,您應該使用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;
這就是我申請之後有:
您也可以使用k均值或平均移做(這是多少有效的方式)。
R,G和B通道的單獨直方圖無助於尋找主色。你需要一個直方圖,其中一個bin是一個RGB三元組。當然,尺寸會隨着通道數量呈指數增長,但是3個通道仍然可以管理,另外,您可以使用像'std :: unordered_multiset'這樣的容器作爲合理的解決方案 –
當然,這會變成一個三維問題,它具有設置起來要複雜得多。 –