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基本语法分析说明
Jun 15 Javascript
JavaScript获取GridView选择的行内容
Apr 14 Javascript
向左滚动文字 js代码效果
Aug 17 Javascript
js操作输入框提示信息且响应鼠标事件
Mar 25 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
Mar 20 Javascript
基于JavaScript实现移除(删除)数组中指定元素
Jan 04 Javascript
基于JS实现仿百度百家主页的轮播图效果
Mar 06 Javascript
jQuery修改DOM结构_动力节点Java学院整理
Jul 05 jQuery
JS异步函数队列功能实例分析
Nov 28 Javascript
JS实现旋转木马轮播图
Jan 01 Javascript
vue+canvas实现移动端手写签名
May 21 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
Nov 11 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 UTF8 文件的签名问题
2009/10/30 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
IE iframe的onload方法分析小结
2010/01/07 Javascript
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
jquery实现表格本地排序的方法
2015/03/11 Javascript
详谈javascript中的cookie
2015/06/03 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
[44:41]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
PyCharm 解决找不到新打开项目的窗口问题
2021/01/15 Python
我们是伦敦女孩:WalG
2018/01/08 全球购物
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
高中生期末评语
2014/01/28 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
工商管理专业毕业生求职信
2014/05/26 职场文书
2015入党自荐书范文
2015/03/05 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
节约用水广告语60条
2019/11/14 职场文书