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 相关文章推荐
List the Stored Procedures in a SQL Server database
Jun 20 Javascript
用Javascript评估用户输入密码的强度(Knockout版)
Nov 30 Javascript
关于JavaScript对象的动态选择及遍历对象
Mar 10 Javascript
node.js中的fs.mkdir方法使用说明
Dec 17 Javascript
jQuery获取标签文本内容和html内容的方法
Mar 27 Javascript
基于JQuery打造无缝滚动新闻步骤详解
Mar 31 Javascript
基于JS实现省市联动效果代码分享
Jun 06 Javascript
批量下载对路网图片并生成html的实现方法
Jun 07 Javascript
js中DOM三级列表(代码分享)
Mar 20 Javascript
vue双向数据绑定知识点总结
Apr 18 Javascript
js数据类型检测总结
Aug 05 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
Apr 12 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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
一个很简单的办法实现TD的加亮效果.
2006/06/29 Javascript
通过ifame指向的页面高度调整iframe的高度
2006/10/05 Javascript
jQuery TextBox自动完成条
2009/07/22 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
javascript页面倒计时实例
2015/07/25 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
vue如何通过id从列表页跳转到对应的详情页
2018/05/01 Javascript
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
jQuery实现动态添加和删除input框实例代码
2019/03/26 jQuery
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
Python中对列表排序实例
2015/01/04 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
python发送邮件脚本
2018/05/22 Python
python安装twisted的问题解析
2018/08/21 Python
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
python NumPy ndarray二维数组 按照行列求平均实例
2019/11/26 Python
python实现在内存中读写str和二进制数据代码
2020/04/24 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
意大利包包和行李箱销售网站:Bagaglio.it
2021/03/02 全球购物
工程预算与管理应届生求职信
2013/10/06 职场文书
高三语文教学反思
2014/01/15 职场文书
会计演讲稿范文
2014/05/23 职场文书
分公司任命书
2014/06/06 职场文书
大学生交通专业求职信
2014/09/01 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
对学校的意见和建议
2015/06/04 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
Python 把两层列表展开平铺成一层(5种实现方式)
2021/04/07 Python