【问题标题】:How to quantify colors in an image like Google does (somewhat)?如何像谷歌那样量化图像中的颜色(有点)?
【发布时间】:2019-09-21 03:59:41
【问题描述】:

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

但是,我制作的脚本在某种意义上是有效的,它获得了最现成的颜色,但不一定是最重要的。

例如,以这张第一个黑洞的图像为例。它大多只有黑色,带有一些红色/白色/黄色/棕色的污迹。但是在比例上,仅检查它们的数量,它们几乎被认为是什么。

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

问题在于,尽管它们的数量不是最多的,但它们显然是图像中的主要颜色,就人眼如何看待它们而言。有没有一种算法或技术?感谢您的阅读。

【问题讨论】:

  • 这是一个非常复杂的话题,在图像处理中。我认为我们无法给出完整的答案(太长了)。简短的回答:您检测主题,然后删除背景。每个图像的大部分都是背景,所以没有用。问题:通常有不同的背景(草坪、灌木、天空,只是在简单的情况下、房子、窗户、门、汽车、草坪……)。跨度>
  • 这真的是一个非常复杂的问题,我建议您将这个问题划分成几十个问题,当且仅当您需要从 stack-over 中获得答案时-流。
  • 是的:P。这就是为什么我问是否有任何资源或文章或任何关于此的在线内容。我一直在搜寻,没有发现任何适合的。没有人可以在这里完整地回答。

标签: php image algorithm colors color-space


【解决方案1】:

假设您的图像具有 WxH 分辨率。

你说你有一个 12 种颜色的调色板。

为了制定一种算法,根据颜色在图像中的出现程度对颜色进行排序,您可以创建 3 个变量:

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

可能的算法是:

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) %");
}  

我考虑过如果你发现一种颜色与调色板中的任何颜色都不够接近,你会忽略它,但显然你可以通过简单地增加 counter 来考虑它,所以这些颜色会是剩下的百分比。

函数CloseEnough&lt; 由您选择,但它们可以像这样工作:

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);
}

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

【讨论】:

    猜你喜欢
    • 2015-05-28
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多