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 相关文章推荐
js去除重复字符串两种实现方法
Jan 09 Javascript
Knockout text绑定DOM的使用方法
Nov 15 Javascript
jQuery制作效果超棒的手风琴折叠菜单
Apr 03 Javascript
JavaScript声明变量名的语法规则
Jul 10 Javascript
关于JS中的方法是否加括号的问题
Jul 27 Javascript
Angular.js中ng-if、ng-show和ng-hide的区别介绍
Jan 20 Javascript
Bootstrap实现各种进度条样式详解
Apr 13 Javascript
Node.js 使用流实现读写同步边读边写功能
Sep 11 Javascript
vue-router 路由基础的详解
Oct 17 Javascript
JavaScript两种计时器的实例讲解
Jan 31 Javascript
解决ant Design Search无法输入内容的问题
Oct 29 Javascript
React四级菜单的实现
Apr 08 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邮件发送的两种方式
2020/04/28 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
2019/04/10 PHP
JS window.opener返回父页面的应用
2009/10/24 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
浅谈jQuery中height与width
2015/07/06 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
jQuery时间插件jquery.clock.js用法实例(5个示例)
2016/01/14 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
js实现tab切换效果
2017/02/16 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
React之PureComponent的使用作用
2018/07/10 Javascript
JS闭包原理与应用经典示例
2018/12/20 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
2019/04/02 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
2019/09/25 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
Python getopt模块处理命令行选项实例
2014/05/13 Python
python批量生成本地ip地址的方法
2015/03/23 Python
Python之日期与时间处理模块(date和datetime)
2017/02/16 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
Python简单读取json文件功能示例
2017/11/30 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
python如何获取列表中每个元素的下标位置
2019/07/01 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
2020/03/01 Python
python dict乱码如何解决
2020/06/07 Python
django创建css文件夹的具体方法
2020/07/31 Python
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
物流管理毕业生自荐信范文
2014/03/15 职场文书
银行求职信
2014/05/31 职场文书
廉政承诺书2015
2015/04/28 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书