亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

利用k-means聚類算法識別圖片主色調

2024-09-04 11:44:30
字體:
來源:轉載
供稿:網友

 

由于使用php來寫圖片主色調識別功能太麻煩了,所以我給大家介紹利用利用k-means聚類算法識別圖片主色調方法.

識別圖片主色調這個,網上貌似有幾種方法,不過最準確,最優雅的解決方案還是利用聚類算法來做.

直接上代碼,不過,我測試結果表示,用PHP來做,效率不佳,PHP不適合做這種大規模運算,用nodejs做效率可以高出100倍左右,代碼如下:

  1. <?php  
  2.  
  3. $start = microtime(TRUE);  
  4.  
  5. main(); 
  6.  
  7. function main($img = ‘colors_files/T1OX3eXldXXXcqfYM._111424.jpg’)  
  8.  
  9. {  
  10.     
  11. list($width$height$mime_code) = getimagesize($img);  
  12. //開源代碼Vevb.com 
  13.  
  14.  
  15. $im = null;  
  16.  
  17. $point = array();  
  18.  
  19. switch ($mime_code)  
  20.  
  21. {  
  22.  
  23. # jpg  
  24.  
  25. case 2:  
  26.  
  27. $im =imagecreatefromjpeg($img);  
  28.  
  29. break;  
  30.  
  31.  
  32.  
  33. # png  
  34.  
  35. case 3:  
  36.   
  37. default:  
  38.  
  39. exit(‘擦 ,什么圖像?解析不了啊’);  
  40.  
  41. }  
  42.   
  43. $new_width = 100;  
  44.  
  45. $new_height = 100;  
  46.  
  47. $pixel = imagecreatetruecolor($new_width$new_height);  
  48.  
  49. imagecopyresampled($pixel$im, 0, 0, 0, 0, $new_width$new_height$width$height);  
  50.   
  51. run_time();  
  52.   
  53. $i = $new_width;  
  54.  
  55. while ($i–)  
  56.  
  57. {  
  58.  
  59. # reset高度  
  60.  
  61. $k = $new_height;  
  62.  
  63. while ($k–)  
  64.  
  65. {  
  66.  
  67. $rgb = ImageColorAt($im$i$k);  
  68.  
  69. array_push($pointarray(‘r’=>($rgb >> 16) & 0xFF, ‘g’=>($rgb >> 8) & 0xFF, ‘b’=>$rgb & 0xFF));  
  70.  
  71. }  
  72.  
  73. }  
  74.  
  75. imagedestroy($im);  
  76.  
  77. imagedestroy($pixel); 
  78.  
  79. run_time();  
  80.   
  81. $color = kmeans($point);  
  82.   
  83. run_time();
  84.   
  85. foreach ($color as $key => $value)  
  86.  
  87. &nb 
  88. sp; {  
  89.  
  90. echo ‘<br><span style=“background-color:’ . RGBToHex($value[0]) . ‘” >’ . RGBToHex($value[0]) . ‘</span>’;  
  91.  
  92. }  
  93.   
  94. }  
  95.   
  96. function run_time()  
  97.  
  98. {  
  99.  
  100. global $start;  
  101.  
  102. echo ‘<br/>消耗:’, microtime(TRUE) – $start;  
  103.  
  104. }  
  105.   
  106. function kmeans($point=array(), $k=3, $min_diff=1)  
  107.  
  108. {  
  109.  
  110. global $ii;  
  111.  
  112. $point_len = count($point);  
  113.  
  114. $clusters = array();  
  115.  
  116. $cache = array();  
  117.     
  118. for ($i=0; $i < 256; $i++)  
  119.  
  120. {  
  121.  
  122. $cache[$i] = $i*$i;  
  123.  
  124. } 
  125.  
  126. # 隨機生成k值  
  127.  
  128. $i = $k;  
  129.  
  130. $index = 0;  
  131.  
  132. while ($i–)  
  133.  
  134. {  
  135.  
  136. $index = mt_rand(1,$point_len-100);  
  137.  
  138. array_push($clustersarray($point[$index], array($point[$index])));  
  139.  
  140. }  
  141.  
  142. run_time();  
  143.  
  144. $point_list = array();  
  145.   
  146. $run_num = 0;  
  147.   
  148. while (TRUE)  
  149.  
  150. {  
  151.  
  152. foreach ($point as $value)  
  153.  
  154. {  
  155.  
  156. $smallest_distance = 10000000;  
  157.   
  158. # 求出距離最小的點  
  159.  
  160. # index用于保存point最靠近的k值  
  161.  
  162. $index = 0;  
  163.  
  164. $i = $k;  
  165.  
  166. while ($i–)  
  167.  
  168. {  
  169.  
  170. $distance = 0;  
  171.  
  172. foreach ($value as $key => $p1)  
  173.  
  174. {  
  175.  
  176. &n 
  177. bsp; if ($p1 > $clusters[$i][0][$key])  
  178.  
  179. {  
  180.  
  181. $distance += $cache[$p1 - $clusters[$i][0][$key]];  
  182.  
  183. }  
  184.  
  185. else  
  186.  
  187. {  
  188.  
  189. $distance += $cache[$clusters[$i][0][$key] – $p1];  
  190.  
  191. }  
  192.  
  193. } 
  194.  
  195. $ii++;  
  196.  
  197.  
  198. if ($distance < $smallest_distance)  
  199.  
  200. {  
  201.  
  202. $smallest_distance = $distance;  
  203.  
  204. $index = $i;  
  205.  
  206. }  
  207.  
  208. }  
  209.  
  210. $point_list[$index][] = $value;  
  211.  
  212. }  
  213.   
  214. $diff = 0;  
  215.  
  216. # 1個1個迭代k值  
  217.  
  218. $i = $k;  
  219.  
  220. while ($i–)  
  221.  
  222. {  
  223.  
  224. $old = $clusters[$i];  
  225.   
  226. # 移到到隊列中心  
  227.  
  228. $center = calculateCenter($point_list[$i], 3);  
  229.  
  230. # 形成新的k值集合隊列  
  231.  
  232. $new_cluster = array($center$point_list[$i]);  
  233.  
  234. $clusters[$i] = $new_cluster;  
  235.   
  236. # 計算新的k值與隊列所在點的位置  
  237.  
  238. $diff = euclidean($old[0], $center);  
  239.  
  240. } 
  241.  
  242. # 判斷是否已足夠聚合  
  243.  
  244. if ($diff < $min_diff)  
  245.  
  246. {  
  247.  
  248. break;  
  249.  
  250. }  
  251. }  
  252.  
  253. echo ‘—>’.$ii;  
  254.   
  255. return $clusters;  
  256.  
  257. }  
  258.   
  259. # 計算2點距離  
  260.  
  261. $ii = 0;  
  262.  
  263. function euclidean($p1$p2)  
  264.  
  265. {  
  266.   
  267. $s = 0;  
  268.  
  269. foreach ($p1 as $key => $value)  
  270.  
  271. {  
  272.   
  273. $temp = ($value – $p2[$key]);  
  274.  
  275. $s += $temp*$temp;  
  276.  
  277. } 
  278.  
  279. return sqrt($s);  
  280. }  
  281.   
  282. # 移動k值到所有點的中心  
  283.  
  284. function calculateCenter($point_list$attr_num) {  
  285.  
  286. $vals = array();  
  287.  
  288. $point_num = 0;  
  289.  
  290.  
  291.  
  292. $keys = array_keys($point_list[0]);  
  293.  
  294. foreach($keys as $value)  
  295.  
  296. {  
  297.  
  298. $vals[$value] = 0;  
  299.  
  300. }  
  301. foreach ($point_list as $arr)  
  302.  
  303. {  
  304.  
  305. $point_num++;  
  306.  
  307. foreach ($arr as $key => $value)  
  308.  
  309. {  
  310.  
  311. $vals[$key] += $value;  
  312.  
  313. }  
  314.  
  315. }    
  316. foreach ($keys as $index)  
  317.  
  318. {  
  319.  
  320. $vals[$index] = $vals[$index] / $point_num;  
  321.  
  322. }  
  323.   
  324. return $vals;  
  325.  
  326. }     
  327.  
  328. function RGBToHex($r$g=”, $b=”)  
  329.  
  330. {  
  331.  
  332. if (is_array($r))  
  333.  
  334. {  
  335.  
  336. $b = $r['b'];  
  337.  
  338. $g = $r['g'];  
  339.  
  340.  
  341. $r = $r['r'];  
  342.  
  343. }  
  344.   
  345. $hex = “#”;  
  346.  
  347. $hex.= str_pad(dechex($r), 2, ’0′, STR_PAD_LEFT);  
  348.  
  349. $hex.= str_pad(dechex($g), 2, ’0′, STR_PAD_LEFT);  
  350.  
  351. $hex.= str_pad(dechex($b), 2, ’0′, STR_PAD_LEFT);  
  352.   
  353. return $hex;  
  354.  
  355. }  
  356.  
  357. ?>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频久| 欧美黄色www| 亚洲男人天堂久| 在线免费观看羞羞视频一区二区| 激情久久av一区av二区av三区| 久久久久久久色| 在线亚洲午夜片av大片| 国产视频观看一区| 欧美国产日本高清在线| 91免费人成网站在线观看18| 日韩欧美精品在线观看| 国产精品久久久久9999| 91牛牛免费视频| 亚洲福利视频免费观看| 亚洲福利在线看| www.日韩不卡电影av| 日韩欧美国产一区二区| 欧美精品激情blacked18| 欧美美女15p| 亚洲一区二区三区乱码aⅴ| 91精品成人久久| 91高清视频免费观看| 在线观看欧美日韩国产| 亚洲国产成人在线视频| 国产91精品黑色丝袜高跟鞋| 欧美极品美女电影一区| 国产91精品久久久| 久久免费国产视频| 国产精品久久久久免费a∨大胸| 欧美日韩在线观看视频小说| 亚洲xxxx做受欧美| 亚洲石原莉奈一区二区在线观看| y97精品国产97久久久久久| 欧美又大又粗又长| 欧美日韩亚洲精品内裤| 国产在线视频一区| 亚洲在线视频观看| 久久精品人人做人人爽| 亚洲天堂第一页| 国产热re99久久6国产精品| 97人洗澡人人免费公开视频碰碰碰| 欧美日韩亚洲视频| 欧美日韩国产综合视频在线观看中文| 亚洲欧美三级在线| 久久视频这里只有精品| 亚洲天堂av在线免费观看| 国产精品成人一区二区| 国产成人av在线| 国产精品日韩在线观看| 亚洲18私人小影院| 久久91亚洲精品中文字幕| 日韩欧美中文字幕在线观看| 欧美电影免费观看电视剧大全| 日韩精品在线观看一区| 日韩精品免费视频| 精品露脸国产偷人在视频| 国色天香2019中文字幕在线观看| 高清亚洲成在人网站天堂| 91精品久久久久久久久久| 亚洲欧美色图片| 国产美女久久精品香蕉69| 欧美日韩亚洲视频一区| 亚洲男人av在线| 欧美激情欧美狂野欧美精品| 国产美女91呻吟求| 久久免费视频这里只有精品| 亚洲激情小视频| 欧美在线视频网站| 国产精品电影观看| 欧美成人精品一区二区| 欧美三级免费观看| 正在播放国产一区| 亚洲精品视频久久| 亚洲精品98久久久久久中文字幕| 色先锋久久影院av| 久热精品视频在线| 亚洲影视九九影院在线观看| 国产精品久久久久久久电影| 91久久精品久久国产性色也91| 97色在线播放视频| 欧美视频专区一二在线观看| 北条麻妃一区二区在线观看| 日本精品一区二区三区在线| 亚洲精品久久久久| 欧美激情一级二级| 成人乱色短篇合集| 亚洲久久久久久久久久| 亚洲男人的天堂在线播放| 在线日韩第一页| 国产丝袜一区视频在线观看| 国产精品亚洲欧美导航| 国产精品国产三级国产专播精品人| 日韩av手机在线| 欧美成人免费在线视频| 日韩中文字幕免费看| 亚洲成人网久久久| 在线丨暗呦小u女国产精品| 高清一区二区三区四区五区| 亚洲国产成人精品久久久国产成人一区| 日韩精品在线视频| 亚洲国产91精品在线观看| 欧美激情一区二区三级高清视频| 久久久www成人免费精品张筱雨| 91日本在线视频| 色综合色综合久久综合频道88| 91久久在线视频| 欧美激情视频在线| 欧美激情啊啊啊| 庆余年2免费日韩剧观看大牛| 91豆花精品一区| 欧美成人黑人xx视频免费观看| 成人午夜高潮视频| 国产欧美精品va在线观看| 久久精品国产99国产精品澳门| 亚洲字幕一区二区| 国产精品美女呻吟| 亚洲精品丝袜日韩| 国产精品入口免费视频一| 欧美激情第三页| 亚洲精品资源在线| 久久久久久国产三级电影| 色阁综合伊人av| 成人在线视频网| 国产香蕉精品视频一区二区三区| 国产日韩在线一区| 97国产真实伦对白精彩视频8| 欧美大肥婆大肥bbbbb| 久久免费成人精品视频| 日产精品久久久一区二区福利| 久久亚洲综合国产精品99麻豆精品福利| 日韩精品亚洲视频| 91av视频在线免费观看| 热99精品里视频精品| 久久激情视频久久| 欧美www视频在线观看| 久久视频这里只有精品| 久久久久中文字幕2018| 91国产中文字幕| 久久99久久99精品中文字幕| 久久视频这里只有精品| 69久久夜色精品国产7777| 亚洲色图17p| 欧美日韩在线免费观看| 国产日韩av在线播放| 国产91色在线|| 精品视频偷偷看在线观看| 久久久久久尹人网香蕉| 亚洲跨种族黑人xxx| 日韩欧美视频一区二区三区| 精品国产区一区二区三区在线观看| 九九热这里只有精品免费看| 成人福利在线观看| 91精品国产乱码久久久久久久久| 欧美国产亚洲视频| 久久中文字幕国产| 国模gogo一区二区大胆私拍| 久久精品在线播放| 日韩免费观看av| 成人免费视频a| 欧美黑人性生活视频| 国产亚洲视频在线观看| 亚洲影院色在线观看免费| 精品一区二区电影| 欧美性色视频在线|