如何量化图像(类似于Google)中的颜色?

时间:2019-05-02 15:25:45

标签: php image algorithm colors color-space

我已经搜索了很长时间,我想知道你们中的任何人是否具有某种资源或某种算法的知识,可以拍摄图像并返回最重要颜色的百分比。图片。但不是任何颜色,我想使百分比适合预定义的12种颜色的恒定调色板(与您在Google上的图像搜索中用于排序的颜色相同)。

但是,我制作的脚本在某种意义上可以发挥作用,因为它所获得的颜色最清晰,但不一定最重要。

Sample image

例如,拍摄第一个黑洞的图像。它几乎只有黑色,并带有一些红色/白色/黄色/棕色的污点。但是按比例,仅检查它们的数量,它们几乎被认为是什么。

例如:红色= 1%,黄色= 3%,黑色= 96%(不是精确值,但是准确的)。

问题在于,即使它们的数量不是最多,但对于人眼如何看,它们显然是图像中的主要颜色。是否有用于该算法或技术的算法?谢谢您的阅读。

1 个答案:

答案 0 :(得分:0)

假设您的图片分辨率为WxH。

您说您有12种颜色的调色板。

要创建一种算法,可以根据颜色在图像中显示的数量对其进行排序,您可以创建3个变量:

  • 图像中有效颜色的全局计数器计数器
  • 频率的数组,其长度等于调色板的大小;
  • 代表调色板的颜色数组。

可能的算法可能是:

for(int i = 0; i < W; i++){
    for(int j = 0; j < H; j++){
        Color dif = new Color(255, 255, 255, 1);
        Color currDif;
        int minIndex = -1;
        for(int k = 0; k < palette.length; k++){
            currDif = palette[k] - image[i][j];
            if(dif > currDif){
                dif = currDif;
                minIndex = k;
            }
        }
        if( CloseEnough(dif, palette[minIndex]) ){
            frequency[minIndex]++;
            counter++;
        }
    }
}

然后,要验证百分比,您可以:

for(int i = 0; i < 12; i++){
    print("Color i appears (Palette[i] / counter) %");
}  

我考虑过,如果发现一种颜色与调色板中的任何一种颜色都不足够接近,可以忽略它,但是显然您可以通过简单地增加计数器来考虑它,因此这些颜色将是剩余的百分比。

您可以选择使用函数CloseEnough<,但是它们可以像这样工作:

bool CloseEnough(Color c1, Color c2){
    return abs(c1.r - c2.r) < 30 && abs(c1.g - c2.g) < 30 && abs(c1.b - c2.b) < 30;
    //note that 30 can be quite small
    //this value can be modified based on testing and result quality
}

//the closer to black a color is, the smaller it will be
bool < (Color c1, Color c2){
    return (c1.r + c1.g + c1.b) < (c2.r + c2.b + c2.g);
}

可能有更好的解决方案,但希望对您有所帮助。