You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio结合OpenCV提取图像主色调的问题与解决

Android Studio中获取图像主色调并统计指定颜色的解决方案

我之前也踩过一模一样的坑——最开始直接遍历图像像素,用color == Color.RED这种方式判断颜色,代码能跑但统计结果完全不符合预期;后来换成RGB转HSV按色相区间判断,还是没解决问题。折腾了一阵后,终于找到一个高效又准确的方法,核心思路是先提取图像的平均主色调,再做颜色分类统计。

问题根源

  • 直接用Color.RED这类纯颜色值判断几乎没意义:实际图像里的目标颜色很少是完全纯净的,大多是深浅不一的同色系,全等判断会漏掉绝大多数有效像素。
  • 遍历整张高分辨率图像的像素效率极低,而且细节过多会让统计结果偏离图像的整体主色调。

解决方案:缩图提取主色调+HSV分类

我们可以先把原图缩成1x1的Bitmap,这个像素的颜色就是整张图的平均主色调,再将其转为HSV格式,通过色相(hue)区间来归类颜色,代码如下:

int red = 0; 
int green = 0; 
int yellow = 0; 
int orange = 0; 
int other = 0;

// 将原图缩为1x1,提取平均主色调
Bitmap newBitmap = Bitmap.createScaledBitmap(imageBitmap, 1, 1, true);
final int color = newBitmap.getPixel(0, 0);
newBitmap.recycle(); // 及时回收Bitmap避免内存泄漏

// 拆分RGB通道值并转为HSV格式
int redValue = Color.red(color);
int greenValue = Color.green(color);
int blueValue = Color.blue(color);
float[] hsv = new float[3];
Color.RGBToHSV(redValue, greenValue, blueValue, hsv);

float hue = hsv[0]; // 色相,范围0-360
// float saturation = hsv[1]; // 饱和度,可选:可以过滤低饱和的灰/白色系
// float value = hsv[2]; // 明度,可选:可以过滤低明度的深色

// 按色相区间归类颜色
if(hue > 340 || hue < 20){ 
    red++; 
} else if(hue > 20 && hue < 45){ 
    orange++; 
} else if(hue > 45 && hue < 70){ 
    yellow++; 
} else if(hue > 90 && hue < 140){ 
    green++; 
} else{ 
    other++; 
}

// 输出对应首字母
String result = red > 0 ? "r" : 
                orange > 0 ? "o" : 
                yellow > 0 ? "y" : 
                green > 0 ? "g" : "x";
Log.d("MainColor", "主色调首字母:" + result);

补充说明

如果需要统计整张图的像素占比(而不是只取平均主色调),可以把缩放尺寸改成比如100x100(平衡效率和准确性),然后遍历这个小图的每个像素,重复上述HSV判断并累加对应颜色的计数,最后比较计数最大值来确定主色调。

内容的提问来源于stack exchange,提问作者Antonio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:42:07