利用k-means聚类算法识别图片主色调

识别图片主色调这个,网上貌似有几种方法,不过,最准确,最优雅的解决方案还是利用聚类算法来做。。。

直接上代码。。。。不过,我测试结果表示,用PHP来做,效率不佳,PHP不适合做这种大规模运算~~~,用nodejs做 效率可以高出100倍左右。。。

 代码如下 复制代码

<?php 

$start = microtime(TRUE); 

main(); 

 

function main($img = ‘colors_files/T1OX3eXldXXXcqfYM._111424.jpg’) 

 

 

list($width, $height, $mime_code) = getimagesize($img); 

 

$im = null; 

$point = array(); 

switch ($mime_code) 

# jpg 

case 2: 

$im =imagecreatefromjpeg($img); 

break; 

 

# png 

case 3: 

 

default: 

exit(‘擦 ,什么图像?解析不了啊’); 

 

$new_width = 100; 

$new_height = 100; 

$pixel = imagecreatetruecolor($new_width, $new_height); 

imagecopyresampled($pixel, $im, 0, 0, 0, 0, $new_width, $new_height, $width, $height); 

 

run_time(); 

 

$i = $new_width; 

while ($i–) 

# reset高度 

$k = $new_height; 

while ($k–) 

$rgb = ImageColorAt($im, $i, $k); 

array_push($point, array(‘r’=>($rgb >> 16) & 0xFF, ‘g’=>($rgb >> 8) & 0xFF, ‘b’=>$rgb & 0xFF)); 

imagedestroy($im); 

imagedestroy($pixel); 

 

run_time(); 

 

$color = kmeans($point); 

 

run_time(); 

 

foreach ($color as $key => $value) 

&nb
sp; { 

echo ‘<br><span style=“background-color:’ . RGBToHex($value[0]) . ‘” >’ . RGBToHex($value[0]) . ‘</span>’; 

 

 

function run_time() 

global $start; 

echo ‘<br/>消耗:’, microtime(TRUE) – $start; 

 

function kmeans($point=array(), $k=3, $min_diff=1) 

global $ii; 

$point_len = count($point); 

$clusters = array(); 

$cache = array(); 

 

 

for ($i=0; $i < 256; $i++) 

$cache[$i] = $i*$i; 

 

# 随机生成k值 

$i = $k; 

$index = 0; 

while ($i–) 

$index = mt_rand(1,$point_len-100); 

array_push($clusters, array($point[$index], array($point[$index]))); 

 

 

run_time(); 

$point_list = array(); 

 

$run_num = 0; 

 

while (TRUE) 

foreach ($point as $value) 

$smallest_distance = 10000000; 

 

# 求出距离最小的点 

# index用于保存point最靠近的k值 

$index = 0; 

$i = $k; 

while ($i–) 

$distance = 0; 

foreach ($value as $key => $p1) 

&n
bsp; if ($p1 > $clusters[$i][0][$key]) 

$distance += $cache[$p1 - $clusters[$i][0][$key]]; 

else 

$distance += $cache[$clusters[$i][0][$key] – $p1]; 

 

$ii++; 

 

if ($distance < $smallest_distance) 

$smallest_distance = $distance; 

$index = $i; 

$point_list[$index][] = $value; 

 

$diff = 0; 

# 1个1个迭代k值 

$i = $k; 

while ($i–) 

$old = $clusters[$i]; 

 

# 移到到队列中心 

$center = calculateCenter($point_list[$i], 3); 

# 形成新的k值集合队列 

$new_cluster = array($center, $point_list[$i]); 

$clusters[$i] = $new_cluster; 

 

# 计算新的k值与队列所在点的位置 

$diff = euclidean($old[0], $center); 

 

# 判断是否已足够聚合 

if ($diff < $min_diff) 

break; 
>

 

echo ‘—>’.$ii; 

 

return $clusters; 

 

# 计算2点距离 

$ii = 0; 

function euclidean($p1, $p2) 

 

$s = 0; 

foreach ($p1 as $key => $value) 

 

$temp = ($value – $p2[$key]); 

$s += $temp*$temp; 

 

return sqrt($s); 

 

 

# 移动k值到所有点的中心 

function calculateCenter($point_list, $attr_num) { 

$vals = array(); 

$point_num = 0; 

 

$keys = array_keys($point_list[0]); 

foreach($keys as $value) 

$vals[$value] = 0; 

 

foreach ($point_list as $arr) 

$point_num++; 

foreach ($arr as $key => $value) 

$vals[$key] += $value; 

 

 

foreach ($keys as $index) 

$vals[$index] = $vals[$index] / $point_num; 

 

return $vals; 

 

 

 

function RGBToHex($r, $g=”, $b=”) 

if (is_array($r)) 

$b = $r['b']; 

$g = $r['g']; 

$r = $r['r']; 

 

$hex = “#”; 

$hex.= str_pad(dechex($r), 2, ’0′, STR_PAD_LEFT); 

$hex.= str_pad(dechex($g), 2, ’0′, STR_PAD_LEFT); 

$hex.= str_pad(dechex($b), 2, ’0′, STR_PAD_LEFT); 

 

return $hex; 

?> 

时间: 2024-10-26 10:31:55

利用k-means聚类算法识别图片主色调的相关文章

python实现k均值算法示例(k均值聚类算法)_python

简单实现平面的点K均值分析,使用欧几里得距离,并用pylab展示. 复制代码 代码如下: import pylab as pl #calc Euclid squiredef calc_e_squire(a, b):    return (a[0]- b[0]) ** 2 + (a[1] - b[1]) **2 #init the 20 pointa = [2,4,3,6,7,8,2,3,5,6,12,10,15,16,11,10,19,17,16,13]b = [5,6,1,4,2,4,3,1,

k-means聚类算法介绍 k-means聚类算法怎么用

前提条件 特定领域的经验要求:无 专业经验要求:无行业经验 不需要机器学习的知识,但是读者应该熟悉基本的数据分析(如,描述性分析).为了实践该示例,读者也应该熟悉Python. K-means聚类简介 K-means聚类是一种无监督学习,用于有未标记的数据时(例如,数据没有定义类别或组).该算法的目标是在数据中找到分组,变量K代表分组的个数.该算法迭代地分配每个数据点到提供特征的K分组中的一个.数据点基于特征相似性聚集.K-means聚类算法的结果是: 1. K聚类的质心,它可以用来标记新数据

K-均值聚类算法的种群初始化

问题描述 K-均值聚类算法的种群初始化 K-均值聚类算法的种群初始化时候,java代码里面,怎么加入预先设定好的2维数组,而不是随机生成?拜托各位大神了,马上就要交毕业设计,答辩了.拜托拜托. 解决方案 K-均值聚类算法K-均值聚类算法K-均值聚类算法 解决方案二: package org.algorithm; import java.util.ArrayList; import java.util.Random; /** * K均值聚类算法 */ public class Kmeans { p

机器学习算法实践 K均值聚类的实用技巧

Bilal Mahmood:我们最常做的分析之一,便是在数据中提取模式. 比方说,某公司的客户可被划分入哪些细分市场? 我们如何在用户网络中找到特定群体的聚类? 通过机器学习的方式,我们可以得到这些问题的答案. 即使当我们不知道需要查找哪些特定数据段,亦或我们的数据格式是非结构化数据,我们都可以有这么一种技术手段,在算法上,分析出数据中合理的数据模式,合适的数据段和分类结果. 在本文中,我们将会详细介绍一种算法,K-Means Clustering(K均值聚类),包括如何衡量其效果,以及如何确定

机器学习算法与Python实践之(五)k均值聚类(k-means)

       机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法.恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了.        机器学习中有两类的大问题,一个是分类,一个是聚类.分类是根据一些给定的已知类别标号的样本,训练某种学习机器,使它能够对未知类别的样本进行分类.这属于supervised learning(监督学习).而聚类指事先

android-安卓里识别图片模糊的并且清晰度不高的残次图片的算法是什么

问题描述 安卓里识别图片模糊的并且清晰度不高的残次图片的算法是什么 安卓里识别图片模糊的并且清晰度不高的残次图片的算法是什么,最好能将其删除 解决方案 http://www.zhihu.com/question/23636965 解决方案二: 干货分享,图片模糊算法,解析xml绘制图片

php算法-如何利用php把上传的图片压缩?

问题描述 如何利用php把上传的图片压缩? 如图.是用post提交的图片,上传的sae数据库,怎么才能把图片压小一点,一张图几m实在受不了 解决方案 高清图啊,这个是没办法压缩的,你可以试试限制上传大小,上传的时候检测图片大小啊 解决方案二: PHP压缩上传图片PHP图片上传PHP 上传图片 解决方案三: http://blog.csdn.net/jayxujia123/article/details/18801839

[python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像

0 前言 本文主要讲述以下几点:        1.通过scikit-learn计算文本内容的tfidf并构造N*M矩阵(N个文档 M个特征词):        2.调用scikit-learn中的K-means进行文本聚类:        3.使用PAC进行降维处理,每行文本表示成两维数据:        4.最后调用Matplotlib显示聚类效果图. 文章更详细的内容参考:http://blog.csdn.net/eastmount/article/details/50473675由于涉及

利用Python实现简单的相似图片搜索的教程

  利用Python实现简单的相似图片搜索的教程         这篇文章主要介绍了利用Python实现简单的相似图片搜索的教程,文中的示例主要在一个图片指纹数据库中实现,需要的朋友可以参考下 大概五年前吧,我那时还在为一家约会网站做开发工作.他们是早期创业公司,但他们也开始拥有了一些稳定用户量.不像其他约会网站,这家公司向来以洁身自好为主要市场形象.它不是一个供你鬼混的网站--是让你能找到忠实伴侣的地方. 由于投入了数以百万计的风险资本(在US大萧条之前),他们关于真爱并找寻灵魂伴侣的在线广告