Colors 在加工中获得主色

Colors 在加工中获得主色,colors,processing,average,Colors,Processing,Average,我试图得到一幅图像中最主要的颜色(完美的例子:按最常用的颜色排序5种主要颜色)。有没有办法在加工过程中做到这一点?我已经尝试了我找到的一个代码,但是我只得到了平均颜色: color extractColorFromImage(PImage img) { img.loadPixels(); int r=0,g=0,b=0; 对于(int i=0;i>16&0xFF; g+=c>>8&0xFF; b+=c&0xFF; } r/=img.pixels.length;g/=img.pixels.le

我试图得到一幅图像中最主要的颜色(完美的例子:按最常用的颜色排序5种主要颜色)。有没有办法在加工过程中做到这一点?我已经尝试了我找到的一个代码,但是我只得到了平均颜色:

color extractColorFromImage(PImage img)
{ 
img.loadPixels();
int r=0,g=0,b=0;
对于(int i=0;i>16&0xFF;
g+=c>>8&0xFF;
b+=c&0xFF;
} 
r/=img.pixels.length;g/=img.pixels.length;b/=img.pixels.length;
返回颜色(r、g、b);
}
所以这并不是我真正需要的。我已经读到我可以用HSV、k-means等做这件事……在处理过程中有什么方法可以做到吗


示例:这里我想用红色作为主色,上面的示例我得到了一个深橙色。

将问题分解为几个小步骤

步骤1:您可以迭代图像中的像素吗?请查看帮助。或者您可以在代码中使用for循环。但首先,请尝试打印每个单元格的RGB值

步骤2:当你工作时,试着跟踪你看到的每种颜色的计数。这样做的方式完全取决于你想做什么:应该(255,0,0)和(200,0,0)都计为红色吗?但一种方法可能是使用跟踪每种颜色计数的
哈希映射

步骤3:给定每种颜色的计数,现在可以输出主色。如何输出取决于步骤2中使用的数据结构


如果您在某个特定步骤上遇到困难,请发布一条消息,我们将从那里开始。祝您好运!

RGB颜色空间在混合/平均颜色方面可能并不总是像您所期望的那样工作。您应该转换到像CIE LAB这样的感知颜色空间。要做到这一点,您需要首先从RGB转换到CIE XYZ,然后从CIE XYZ转换到CIE RGB。有关详细信息,请参阅查看和上的这些页面

在处理方面,这里有一个使用RGBCIE XYZCIE实验室颜色转换代码的原型(在处理IDE中有一些小的调整要编译(对于使用
static
关键字很不方便)):

void setup(){
PImage src=loadImage(“http://i.stack.imgur.com/0H1OM.png");
尺寸(型钢宽度*4,型钢高度);
仰泳();
//显示原始图像
图像(src,0,0);
//显示RGB平均颜色
填充(从图像中提取颜色(src));
矩形(src.width,0,src.width,src.height);
//显示(感知)实验室平均颜色
填充(extractAverageColorFromImage(src));
矩形(型钢宽度*2,0,型钢宽度,型钢高度);
//显示最主要的颜色
填充(从图像中提取主要颜色(src));
矩形(型钢宽度*3,0,型钢宽度,型钢高度);
}
颜色提取主要颜色来自图像(PImage img){
//创建hashmap-关键是颜色,关联的值是每种颜色的像素数
HashMap colorCounter=新HashMap();
int numPixels=img.pixels.length;
对于(inti=0;i这个呢?
在位图中设置图像并分析每个像素。只需将像素在图像中的次数相加即可

static Dictionary<Color, int> CalcImageColors(Bitmap image)
    {
        var frequency = new Dictionary<Color, int>();
        for (var h = 0; h < image.Height; h++)
        {
            for (var w = 0; w < image.Width; w++)
            {
                var pixel = image.GetPixel(w, h);
                if (frequency.ContainsKey(pixel))
                {
                    frequency[pixel]++;
                }
                else
                {
                    frequency.Add(pixel, 1);
                }
            }
        }
       return frequency.OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value);
    }
静态图像颜色(位图图像)
{
var frequency=新字典();
对于(var h=0;hx.Value).ToDictionary(x=>x.Key,x=>x.Value);
}

您可能想在上查看本教程。-这是一个更数学化的问题。其思想是使用图像的统计信息来计算主颜色。OpenCV提供了源代码-因此应该可以对其进行调整以用于处理!

尝试编辑您的问题,改进其格式。除此之外,tr我希望自己做一些事情,而不是要求现成的代码。对不起,我试图格式化它,但没有什么效果。这是我的第一篇文章。第二,我从几天开始就在做这件事(对处理来说还是很新的),事实上,我没有要求现成的解决方案,只有在有人知道如何在处理中实现它的情况下(因为我在python等其他工具中发现了很多东西……这是一个优雅的答案(+1)。我只是想提一下,它依赖于一个旧版本的JRE,它不支持lambdas这样的奇特功能:/我也想到了,但我不确定是否有一个优雅的方法来实现它。就像另一个答案一样,我明天将不得不做这件事,所以我也会尝试。谢谢你的回答,我明天会检查它,当我看到它的时候我必须去做。对处理还是个新手,我想理解你在那里写的东西需要一段时间^^
static Dictionary<Color, int> CalcImageColors(Bitmap image)
    {
        var frequency = new Dictionary<Color, int>();
        for (var h = 0; h < image.Height; h++)
        {
            for (var w = 0; w < image.Width; w++)
            {
                var pixel = image.GetPixel(w, h);
                if (frequency.ContainsKey(pixel))
                {
                    frequency[pixel]++;
                }
                else
                {
                    frequency.Add(pixel, 1);
                }
            }
        }
       return frequency.OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value);
    }