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 相关文章推荐
jQuery select控制插件
Aug 17 Javascript
jQuery 动画弹出窗体支持多种展现方式
Apr 29 Javascript
深入理解Javascript中的循环优化
Nov 09 Javascript
JavaScript实现大数的运算
Nov 24 Javascript
js实现顶部可折叠的菜单工具栏效果实例
May 09 Javascript
AngularJS表达式讲解及示例代码
Aug 16 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
May 02 Javascript
详解webpack 多入口配置
Jun 16 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
Nov 09 jQuery
vue 之 .sync 修饰符示例详解
Apr 21 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
Jun 04 Javascript
JavaScript实现PC端四格密码输入框功能
Feb 19 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生成缩略图的代码
2011/01/12 PHP
php加速器eAccelerator的配置参数、API详解
2014/05/05 PHP
php实现文件管理与基础功能操作
2017/03/21 PHP
JQuery toggle使用分析
2009/11/16 Javascript
JS读取cookies信息(记录用户名)
2012/01/10 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
js 获取、清空input type=&quot;file&quot;的值示例代码
2014/02/19 Javascript
javascript动态设置样式style实例分析
2015/05/13 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
JavaScript遍历求解数独问题的主要思路小结
2016/06/12 Javascript
利用纯js + transition动画实现移动端web轮播图详解
2017/09/10 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
Vue中如何实现proxy代理
2018/04/20 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
2019/09/18 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
初步解析Python下的多进程编程
2015/04/28 Python
将Python代码打包为jar软件的简单方法
2015/08/04 Python
python2 与 pyhton3的输入语句写法小结
2018/09/10 Python
Python项目跨域问题解决方案
2020/06/22 Python
德国奢侈品网上商城:Mytheresa
2016/08/24 全球购物
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
竞职演讲稿范文
2014/01/11 职场文书
婚礼新郎父母答谢词
2014/01/16 职场文书
致铅球运动员加油稿
2014/02/13 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
个人总结怎么写
2015/02/26 职场文书
开会通知
2015/04/20 职场文书
中学教师读书笔记
2015/07/01 职场文书
国家助学金受助感言
2015/08/01 职场文书
MySQL 服务和数据库管理
2021/11/11 MySQL
nginx内存池源码解析
2021/11/20 Servers