ホームページ >バックエンド開発 >PHPチュートリアル >K 平均法クラスタリング アルゴリズムを使用して、picture のメイン カラーを識別する_PHP チュートリアル

K 平均法クラスタリング アルゴリズムを使用して、picture のメイン カラーを識別する_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:12:141212ブラウズ

写真の主色を識別する関数を PHP で書くのは面倒なので、PHP より 100 倍高速な K-means クラスタリングアルゴリズムを使用して写真の主色を識別する方法を紹介します。

オンラインで画像の主要な色を識別する方法はいくつかあるようですが、最も正確でエレガントな解決策は、クラスタリング アルゴリズムを使用することです。 。 。

コードに直接移動します。 。 。 。ただし、私のテスト結果では、PHP を使用してこれを行うのは効率的ではないことがわかりました。nodejs を使用すると、約 100 倍効率的になる可能性があります。 。 。

コードは次のとおりです コードをコピーします

$start = microtime(TRUE)

function main($img = 'カラーファイルs/T1OX3eXldXXXcqfYM. _111424.jpg')

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

$ポイント = array();

スイッチ ($mime_code)

# jpg

$im =imagecreatefromjpeg($img);

# png

ケース 3:

default :

exit('何の画像ですか? 解析できません')

$new_width = 100;

$pixel = imagecreatetruecolor; _幅、$ new_height);

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

while ($i–)

{

# 高さをリセット

$k = $new_height;

while ($k–)

{

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

array_push($point, array('r'=>($rgb >> 16) & 0xFF, 'g'=>($rgb >> 8) & 0xFF, ' b'= & gt; $ rgb & 0xff));

ImageDestroy ($ ピクセル);

run_time(); color:' .RGBToHex($value[0]) .'" >' .RGBToHex($value[0]) .'';

関数 run_time ()

{

global $start;

echo '
Consumption:', microtime(TRUE) – $start;

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

{

$point_len = count($point);

$cache = array();

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

{

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

}

# k 個の値をランダムに生成します

$i = $k;

$index = 0;

while ($i–)

{

$index = mt_rand($point_len-100); $point[$index], array($point[$index])));

run_time();


$point_list = array();

while (TRUE)

{

foreach ($point as $value)

{

$smallest_ distance = 10000000

# 最小距離の点を見つけます

# インデックスは次の目的で使用されますポイントを保存 最も近い k 値

$i = $k;

{

$ distance = 0; ; $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 = $index = $i;

}

}

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

$diff = 0;

# 1 回の反復 k 値

$i = $k;

while ($i–)

{

$clusters[$i];

# キューセンターに移動

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

# 新しい k 値セット キューを作成します

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

; # 新しい k 値とキュー ポイントの位置を計算します

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

}

# 十分な集約があるかどうかを判断します

if ($diff < ; $min_diff)

{

break;


# 2 点間の距離を計算します

$ii = 0;

{

$s = 0;

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

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

}

return sqrt($s);

# k 値をすべての点の中心に移動

function CalculateCenter($point_list, $attr_num) {

$vals = array();

$point_num = 0;

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

foreach($keys を $value) ] = 0;

}

foreach ($point_list as $arr)

{

$point_num++;

{ $key => $vals[ $key] += $value;

}

}

for each ($keys as $index)

{

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

}

return $vals;

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

{ _array($r ))

{

$b = $r['b'];

$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);

http://www.bkjia.com/PHPjc/444594.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/444594.html

技術記事

写真の主色を識別する関数を PHP で書くのは面倒なので、PHP より 100 倍高速な K-means クラスタリングアルゴリズムを使用して写真の主色を識別する方法を紹介します。 写真を特定...

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。