写真の主色を識別する関数を 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();
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; $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 true http://www.bkjia.com/PHPjc/444594.html 技術記事 写真の主色を識別する関数を PHP で書くのは面倒なので、PHP より 100 倍高速な K-means クラスタリングアルゴリズムを使用して写真の主色を識別する方法を紹介します。 写真を特定...
|