• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
Prev

利用PHP给图片按照颜色进行分类

Data: 2014-06-01 01:35:59Form: JournalClick: 11

我是 视觉 设计师
利用PHP给图片按照颜色进行分类-开发技巧-郭俊杰的设计魔方

    最近很火的egale图片管理工具里头有个入库图片颜色自动分类的功能。可以快速在一堆图里头按照颜色进行图片筛选,非常好用!我也想给我的图库也增加这个功能。同样是开始代码构思,我先要获取图片的颜色再把颜色进行计算。开始入手制作时感觉挺简单的,只要获取颜色、按照分类、入库完事。

    网上有个好用的组件叫color-thief可以获取图片的RGB值,我用composer加载好导入生成的autoload.php文件就算加载好color-thief组件啦,使用方法如下

$palette = ColorThief::getPalette(图片地址, 获取颜色数量上线, 按照多少像素平均值来计算[即提取精度1像素为最高,精度越高越卡]);

返回结果:

Array(
    [0]=>Array
    (
        [0]=>115
        [1]=>60
        [2]=>166
    )
)

现在颜色参数有了,开始数据分类时发现了难点,因为RGB三原色比较复杂,算法会难以计算,寻思把颜色转换成HSV模式会比较好运算,利用网上找的包进行转换下载颜色转换包,使用方法:

//转换颜色模式
require_once './hsl/RBG.php';
$HSV = new RGB(红,绿,蓝);//导入刚才获得的RGB值
$HSV=$HSV->toHSV();
$HSV=(array)$HSV;
$HSV_h=round($HSV["*_hue"]);
$HSV_s=round($HSV["*_saturation"]*100);
$HSV_v=round($HSV["*_value"]/255*100);

这样我们就得到了RGB转换好的HSV颜色值,剩下的就好办了。饱和度跟亮度太低的就是黑白灰无颜色图片,有颜色的部分在判断色相就可以得到颜色,代码如下:

//以hsv模式判断颜色
function is_colors($h,$s,$v) {
	//误差率2%
	if($s>=15 && $v>=25){
		//有饱和度&有亮度 =有颜色
		if(($h>=0 && $h<=20) || ($h>310 && $h<=360)){
			//红色
			return '红色';
		}elseif($h>20 && $h<=35){
			//橙色
			return '橙色';
		}elseif($h>35 && $h<=75){
			//黄色
			return '黄色';
		}elseif($h>75 &&  $h<=160){
			//绿色
			return '绿色';
		}elseif($h>160 && $h<=200){
			//青色
			return '青色';
		}elseif($h>200  && $h<=260){
			//蓝色
			return '蓝色';
		}elseif($h>260 && $h<=310){
			//紫色
			return '紫色';
		}
	}else{
		//判断黑白灰
		if($v>90){
			//白色
			return '白色';
		}else if($v<25){
			//黑色
			return '黑色';
		}else{
			//灰色
			return '灰色';
		}
	}
}

还是有一点点的误差率,毕竟颜色太接近的颜色每个人的评估标准是不一样的,但目前绝大多数图片都可以准确的判断分类,已经很满足了。

Name:
<提交>