一:基本思路
对于一张RGB色彩空间的彩色图像,很多时间我们想通过程序获得该图像有几种主要的色彩,但是对一般图像来说,在色彩交界处都是通过像素混合来实现自然过渡,所以直接扫描图像的像素值,得到的不同颜色值可能多达上百中,而实际上图像可能只有3~4种的主要色彩,如何去掉那些混合颜色,准确提取出来这3~4中的主色彩,根据一般图像的特征,图像在不同色彩的边界处混合不同的颜色值,此可以视为图像的边缘特性之一,因此可以根据简单的边缘梯度算法实现这些混合像素的提取得到输出的像素值数组,然后扫描每个像素值,寻找指定半径参数R周围的像素,发现为零,而且距离中心像素最近的像素点的值做为中心像素的像素值,扫描结束以后输出像素数组,然后对数组线性扫描,即可得到图片的主要色彩RGB值。
二:实现步骤
1. 输入图像数组,对彩色图像灰度化
2. 对灰度化以后的图像,计算图像梯度,这里使用sobol算子
3. 对得到每一个非零像素点实现半径为R的范围内的扫描,找出与之最相近的为零的原像素值
4. 对得到数组进行简单的扫描,得到主色彩
其中参数R是要根据不同应用场景,找到最合适的值。理论上图像越大,R的取值也应该越大,否则算法会失准。
三:原图及运行效果

原图
算法运行之后提取到四种主要色彩
四:算法实现源代码
需要定义的常量值如下:
梯度求取使用是sobol算子,对处理以后的BufferedImage对象扫描获取主色彩的代码如下:
测试代码如下:
注意:主要的关键在于对待处理图像输入正确大小的半径,这个半径大小跟图像实际大小相关,而且算法可以近一步优化成不依赖半径参数的版本,知道找到等于零的像素为止。