利用k-means聚类算法识别图片主色调
由于使用php来写图片主色调识别功能太麻烦了,所以我给大家介绍利用利用k-means聚类算法识别图片主色调方法,比php要己100倍哦。
识别图片主色调这个,网上貌似有几种方法,不过,最准确,最优雅的解决方案还是利用聚类算法来做。。。
直接上代码。。。。不过,我测试结果表示,用PHP来做,效率不佳,PHP不适合做这种大规模运算~~~,用nodejs做 效率可以高出100倍左右。。。
代码如下 | 复制代码 |
$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 echo ‘ }
}
function run_time() { global $start; echo ‘ }
function kmeans($point=array(), $k=3, $min_diff=1) { global $ii; $point_len = count($point); $clusters = array(); $cache = array();
for ($i=0; $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 { $distance += $cache[$p1 - $clusters[$i][0][$key]]; } else { $distance += $cache[$clusters[$i][0][$key] – $p1]; } }
$ii++;
if ($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 { 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'];
}
$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; } ?> |

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이번 장에서는 CakePHP의 환경 변수, 일반 구성, 데이터베이스 구성, 이메일 구성에 대해 알아봅니다.

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는
