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一点特殊用法
May 28 Javascript
使用GruntJS构建Web程序之构建篇
Jun 04 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
Jun 03 Javascript
深入浅析JavaScript中的scrollTop
Jul 11 Javascript
高效的jQuery代码编写技巧总结
Feb 22 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
Jun 16 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
Oct 23 Javascript
Vue如何实现响应式系统
Jul 11 Javascript
JS div匀速移动动画与变速移动动画代码实例
Mar 26 Javascript
微信小程序实现禁止分享代码实例
Oct 19 Javascript
Layui数据表格之单元格编辑方式
Oct 26 Javascript
JavaScript正则表达式验证登录实例
Mar 18 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使用wordwrap格式化文本段落的方法
2015/03/17 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
2019/05/01 PHP
jQuery select的操作实现代码
2009/05/06 Javascript
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
微信小程序 地图(map)实例详解
2016/11/16 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
layer插件select选中默认值的方法
2018/08/14 Javascript
vue select 获取value和lable操作
2020/08/28 Javascript
[54:09]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
Django中的forms组件实例详解
2018/11/08 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
六道php面试题附答案
2014/06/05 面试题
C#面试常见问题
2013/02/25 面试题
土建施工员岗位职责
2014/07/16 职场文书
党委班子对照检查材料
2014/08/19 职场文书
辞职书格式样本
2015/02/26 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
运动会闭幕式通讯稿
2015/07/18 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
导游词之日月潭
2019/11/05 职场文书