从图像中提取颜色

时间:2009-11-24 04:07:39

标签: image-processing

我想提取图像中最常用的颜色,或者至少提取主色调 你能推荐我怎么从这个任务开始?或者指向一个类似的代码?我一直在寻找它,但没有成功。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

我同意这些评论 - 编程解决方案肯定需要更多信息。但在此之前,假设您将获得图像中每个像素的RGB值,您应该考虑可以说Hue可以表示每个像素的“色调”的HSV colorspace。然后,您可以使用histogram来识别图像中最常用的色调。

答案 2 :(得分:2)

好吧,我假设您可以访问每个像素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);
}

然后你可以看到哪个范围最重要。

我希望这些技巧对你有用。