2009-11-24 60 views
5

我想提取圖像中最常用的顏色,或至少是初級色調 您能推薦我如何從這項任務開始?或者指向我一個類似的代碼?我一直在尋找它,但沒有成功。從圖像中提取顏色

+1

您正在使用哪種語言或框架? – jheddings 2009-11-24 04:11:09

+0

答案很大程度上取決於你的環境。 – 2009-11-24 04:16:20

+0

那麼,我正在考慮處理只是爲了一個概念證明,然後把它翻譯成Python的批處理 – biquillo 2009-11-25 03:28:05

回答

4

使用Octree Color Quantization algorithm可以獲得非常好的結果。其他量化算法可在Wikipedia上找到。

+0

這正是我期待的!非常感謝你! – biquillo 2009-11-25 03:33:45

+0

你可以發送樣本代碼在目標c – dineshprasanna 2012-09-10 08:50:52

+0

@dineshprasanna,不,我不能。如果Google無法幫助您,那麼您可能需要使用鏈接中提供的信息編寫自己的代碼。 – 2012-09-10 12:14:18

3

我同意評論 - 編程解決方案肯定需要更多信息。但是在那之前,假設您將獲得圖像中每個像素的RGB值,您應該考慮可以說Hue可以表示每個像素的「色調」的HSV colorspace。然後,您可以使用histogram來識別圖像中最常用的色調。

+0

NB「HSV colorspace」你很可能會說「HSV模式RGB模型」 - HSV(和它的兄弟姐妹雙HSL)是一個RGB失真color _model_;幾乎任何引用RGB模型(或錯誤地爲「RGB顏色空間」)的人都在處理CIE-XYZ'39顏色空間_space_中的值的表示形式,而不是專門挑選您的答案,但是在那裏你去。 – fish2000 2012-03-24 15:48:04

1

那麼,我假設你可以訪問每個像素的RGB顏色。根據你想要的方式,你可以有兩種方法。

首先,您可以簡單地創建一些像素的R,G和B.像這樣。

僞代碼。


int Red = 0; 
int Green = 0; 
int Blue = 0; 
foreach (Pixels as aPixel) { 
    Red += aPixel.getRed(); 
    Green += aPixel.getGreen(); 
    Blue += aPixel.getBlue(); 
}

然後看哪個更多。

這給你只有圖片更紅,綠或藍。

通過簡單地創建每個RGB組合的直方圖,另一種方法也會爲您提供組合顏色的靜態(如橙色)。

僞代碼。


Map ColorCounts = new(); 
foreach (Pixels as aPixel) { 
    const aRGB = aPixel.getRGB(); 
    var aCount = ColorCounts.get(aRGB); 
    aCount++; 
    ColorCounts.put(aRGB, aCount); 
}

然後看哪一個有更多的計數。 您也可以降低色彩分辨率,因爲普通的RGB着色會帶來670萬種顏色。

這可以很容易地通過給RGB的顏色範圍來完成。例如,假設RGB是8步而不是256.

一個僞代碼。



function Reduce(Color) { 
    return (Color/32)*32; // 32 is 256/8 as for 8 ranges. 
} 
function ReduceRGB(RGB) { 
    return new RGB(Reduce(RGB.getRed()),Reduce(RGB.getGreen() Reduce(RGB.getBlue())); 
} 

Map ColorCounts = new(); 
foreach (Pixels as aPixel) { 
    const aRGB = ReduceRGB(aPixel.getRGB()); 
    var aCount = ColorCounts.get(aRGB); 
    aCount++; 
    ColorCounts.put(aRGB, aCount); 
}

然後你可以看到哪個範圍有最多的計數。

我希望這些技術對你有意義。

+0

很好!非常感謝你,真的很有用! – biquillo 2009-11-25 03:29:04