我已经搜索了很长时间,我想知道你们中的任何人是否具有某种资源或某种算法的知识,可以拍摄图像并返回最重要颜色的百分比。图片。但不是任何颜色,我想使百分比适合预定义的12种颜色的恒定调色板(与您在Google上的图像搜索中用于排序的颜色相同)。
但是,我制作的脚本在某种意义上可以发挥作用,因为它所获得的颜色最清晰,但不一定最重要。
例如,拍摄第一个黑洞的图像。它几乎只有黑色,并带有一些红色/白色/黄色/棕色的污点。但是按比例,仅检查它们的数量,它们几乎被认为是什么。
例如:红色= 1%,黄色= 3%,黑色= 96%(不是精确值,但是准确的)。
问题在于,即使它们的数量不是最多,但对于人眼如何看,它们显然是图像中的主要颜色。是否有用于该算法或技术的算法?谢谢您的阅读。
答案 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);
}
可能有更好的解决方案,但希望对您有所帮助。