javascript获取图片的top N主色值方法详解


Posted in Javascript onJanuary 26, 2018

题目要求

找出一个页面中出现次数最多的标签!!!

个人解法:

var eles = document.getElementsByTagName('*');
var rs = [];
for(var i=0; i<eles.length; i++) {
  var tag_name = eles[i].tagName.toLowerCase();
  if(undefined != tag_name) {
    if(inJsonArray(rs, tag_name)) {
      addWeight(rs, tag_name);
    }else {
      rs.push({
        tag : tag_name,
        weight : 1
      })
    }        
  }      
}
SortByWeight(rs);

思路:

拿到所有的标签--根据标签名称聚类---根据权重排序。

如果有更好的方法,欢迎交流。

下面看今天这个问题:

获取一张图片的top N主色值,和上面最多标签的问题很类似,数据大小有区别,别的都差不多的。

这个问题思路很清晰,第一步,拿到图片的数据;第二步,根据色值进行聚类;第三步,对聚类结果排序。所以这次就是根据这个思路去实现。

1、数据获取

图片数据获取使用了canvas的getImageData()方法,能获取到图片每个像素点的rgba数据。

var imgdatas=context.getImageData(0,0,150,150);//获取当前canvas数据
var imgdata = imgdatas.data;//获取rgba数据
var i = 0, len = imgdata.length;
var arr = [];
//将图片rgba数据push到新数组中
for(i ; i<len ; i+=4 ) {
  arr.push(imgdata[i]+','+imgdata[i+1]+','+imgdata[i+2]+','+imgdata[i+3]);  
}

这样就可以拿到图片的所有数据了,剩下的就是数学问题了。

2、数据聚类

去重,相同色值合并,记录该色值出现个数(权重)weight

聚类方法就比较多了,直接数学统计,或者k-means,决策树,朴素贝叶斯,支持向量机等等,喜欢哪个就用哪个就可以了,但是还是需要考虑下不同方法的适用情况和效率什么的了。
我们会得到这样一个数组 [{rgba: '21,12,45,0', weight: 12}, {...}]来记录色值和出现次数,

3、聚类结果排序

对上一步中得到的json数组进行排序,根据属性weight的值从大到小或者从小到大排序,排序算法就不用多言了。

4、结果预览

javascript获取图片的top N主色值方法详解

5、to Do

相似色值合并

rgba(234,234,234,1)和rgba(234,235,235,1)类似的这种是否有必要合并成为一个值,这里又会涉及到相似度计算等问题。

优化聚类算法

提高复杂度,提升性能,提升执行速度

结合可视化的一些东西

6、总结

数据多的处理还是放在后端比较合适,毕竟可以利用分布式框架等多端计算。

而浏览器处理数据的能力还是有限。

Javascript 相关文章推荐
javascript fullscreen全屏实现代码
Apr 09 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
Nov 25 Javascript
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
Jul 26 Javascript
javascript之querySelector和querySelectorAll使用说明
Oct 09 Javascript
jquery统计复选框选中示例
Nov 05 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
May 13 Javascript
关于JavaScript和jQuery的类型判断详解
Oct 08 Javascript
微信小程序 教程之wxapp 视图容器 view
Oct 19 Javascript
swiper自定义分页器使用方法详解
Sep 14 Javascript
vue组件横向树实现代码
Aug 02 Javascript
关于javascript中的promise的用法和注意事项(推荐)
Jan 15 Javascript
使用原生javascript开发计算器实例代码
Feb 21 Javascript
Vue中render方法的使用详解
Jan 26 #Javascript
Angular利用trackBy提升性能的方法
Jan 26 #Javascript
微信小程序版翻牌小游戏
Jan 26 #Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
Jan 26 #Javascript
微信小程序wx.getImageInfo()如何获取图片信息
Jan 26 #Javascript
微信小程序实现animation动画
Jan 26 #Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
Jan 26 #Javascript
You might like
解析php时间戳与日期的转换
2013/06/06 PHP
php查看网页源代码的方法
2015/03/13 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
JavaScript中的对象化编程
2008/01/16 Javascript
基于JQuery框架的AJAX实例代码
2009/11/03 Javascript
isArray()函数(JavaScript中对象类型判断的几种方法)
2009/11/26 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
web页面数据展示新想法(json)
2010/06/08 Javascript
复制小说文本时出现的随机乱码的去除方法
2010/09/07 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
Jquery AJAX POST与GET之间的区别详细介绍
2016/10/17 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
JavaScript中Object基础内部方法图
2018/02/05 Javascript
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
微信小程序网络请求实现过程解析
2019/11/06 Javascript
matplotlib在python上绘制3D散点图实例详解
2017/12/09 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
2019/07/19 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
python中的时区问题
2021/01/14 Python
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
计算机系毕业生推荐信
2013/11/06 职场文书
个人自我鉴定写法
2013/11/30 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
银行优秀员工事迹材料
2014/05/29 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
2015党建工作简报
2015/07/21 职场文书