我想提取图像中最常用的颜色,或者至少提取主色调 你能推荐我怎么从这个任务开始?或者指向一个类似的代码?我一直在寻找它,但没有成功。
答案 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);
}
然后你可以看到哪个范围最重要。
我希望这些技巧对你有用。