免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
利用k-means聚類算法識別圖片主色調(diào)

[導(dǎo)讀] 由于使用php來寫圖片主色調(diào)識別功能太麻煩了,所以我給大家介紹利用利用k-means聚類算法識別圖片主色調(diào)方法,比php要己100倍哦。識別圖片主色調(diào)這個,網(wǎng)上貌似有幾種方法,不過,最準(zhǔn)確,最優(yōu)雅的解決方案還是利由于使用php來寫圖片主色調(diào)識別功能太麻煩了,所以我給大家介紹利用利用k-means聚類算法識別圖片主色調(diào)方法,比php要己100倍哦。

識別圖片主色調(diào)這個,網(wǎng)上貌似有幾種方法,不過,最準(zhǔn)確,最優(yōu)雅的解決方案還是利用聚類算法來做。。。

直接上代碼。。。。不過,我測試結(jié)果表示,用PHP來做,效率不佳,PHP不適合做這種大規(guī)模運(yùn)算~~~,用nodejs 效率可以高出100倍左右。。。

 代碼如下     復(fù)制代碼

<?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(http://www.sm136.com);

 

$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><spanstyle=“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;

}

 

# 隨機(jī)生成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;

 

# 求出距離最小的點(diǎn)

# 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;

# 11個迭代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值與隊列所在點(diǎn)的位置

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

}

 

# 判斷是否已足夠聚合

if ($diff < $min_diff)

{

break;

> 

}

 

}

echo ‘—>’.$ii;

 

return $clusters;

}

 

# 計算2點(diǎn)距離

$ii = 0;

function euclidean($p1, $p2)

{

 

$s = 0;

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

{

 

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

$s += $temp*$temp;

}

 

return sqrt($s);

 

}

 

# 移動k值到所有點(diǎn)的中心

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;

}

?>

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
某人寫的php算法優(yōu)化
python——算法快速理解
經(jīng)典機(jī)器學(xué)習(xí)算法-第十四章Affinity Propagation聚類
聚類分析(三)——層次聚類算法
利用輪廓系數(shù)評價不同類簇數(shù)量的k-means聚類實(shí)例 (Python 機(jī)器學(xué)習(xí)及實(shí)踐)))
Monocle2 | 單細(xì)胞測序的擬時序分析(細(xì)胞軌跡分析)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服