0

我有以下图片:

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

我有以下方法可以从这个图像的位图中返回调色板颜色:

 public static int getPredominantColorFromPokemon(String pokemonId, Context context) {
    int pokemonImage = PokemonUtils.getPokemonSugimoriImageById(pokemonId, context);
    if (pokemonImage == 0) {
        return Color.WHITE;
    }
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), pokemonImage);
    Palette palette = Palette.from(bitmap).generate();
    int colorPalette1 = palette.getLightVibrantColor(Color.WHITE);
    int colorPalette2 = colorPalette1 == -1 ? palette.getVibrantColor(Color.WHITE) : colorPalette1;//Fallback
    int colorPalette3 = colorPalette2 == -1 ? palette.getLightMutedColor(Color.WHITE) : colorPalette2; //Fallback
    int colorPalette4 = colorPalette3 == -1 ? palette.getDominantColor(Color.WHITE) : colorPalette3;//Fallback
    return colorPalette4;
}

这 3 张图像的结果颜色如下:

但是,这不是我要找的,我想要的输出是这样的:

在此处输入图像描述

第一个和第二个图像结果还可以,背景是一种绿色,因为主要颜色是绿色,但在第三个图像(Venusaur)的情况下不是因为结果是一种粉红色/紫色,我想要调色板改为检测绿色。如何修改我的方法以检测主要颜色?

4

1 回答 1

1

颜色是非常主观的,并不总是一个明确的决定哪种颜色是主导颜色。关键因素是 lumincane 和直方图。显然google的实现认为粉色比蓝色更重要。这甚至是可以理解的,因为红色/橙色/黄色是人眼感知更重要的信号颜色(与图像中它们的数量无关)。

想象一个灰色的大矩形,里面有一个霓虹粉色的小圆圈。您可能会将霓虹粉红色而不是灰色视为主要颜色。即便如此,灰色的量也更大。

简而言之:如果你想使用 Palette API,你必须处理它给你的结果。

但是由于 Palette API 提供了几种提取颜色,您可以将它们的色调与图像的直方图进行比较,并相应地选择您最喜欢的调色板颜色。

这是一个关于如何将颜色从 RGB 转换为 HSV 并返回的示例。

  • H = Hue = 您正在处理的基本颜色类型(红色、绿色、橙色等)
  • S = 饱和度(色调有多强烈。重红色或浅红色)
  • V = 值(色调有多亮。从完全黑暗到完全明亮)
int color = Color.rgb(206, 43, 55);

int red = Color.red(color);
int green = Color.green(color);
int blue = Color.blue(color);
System.out.println(red + ", " + green + ", " + blue);
//prints: 206, 43, 55 (as expected)

float[] hsv = new float[3];
Color.RGBToHSV(red, green, blue, hsv);

float hue = hsv[0];
float sat = hsv[1];
float val = hsv[2];

int outputColor = Color.HSVToColor(hsv);
red = Color.red(outputColor);
green = Color.green(outputColor);
blue = Color.blue(outputColor);
System.out.println(red + ", " + green + ", " + blue);

我会尝试仅使用 HSV 作为初学者,因为创建直方图非常慢,因为您基本上必须遍历图像的每个像素并将其颜色累积到列表中。3次。对于红色、绿色和蓝色。

这是您找不到“第一个完美解决方案”的地方。相反,您可能必须在可维护代码、速度和应用程序要求之间做出权衡。

祝你好运!

于 2020-07-28T13:36:07.107 回答