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 相关文章推荐
ExtJs 3.1 XmlTreeLoader Example Error
Feb 09 Javascript
JS+CSS实现一个气泡提示框
Aug 18 Javascript
javascript手风琴下拉菜单实现代码
Nov 12 Javascript
很棒的js选项卡切换效果
Jul 15 Javascript
JS定时器用法分析【时钟与菜单中的应用】
Dec 21 Javascript
基于jPlayer三分屏的制作方法
Dec 21 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
Jan 09 Javascript
Vue.Draggable实现拖拽效果
Jul 29 Javascript
js传递数组参数到后台controller的方法
Mar 29 Javascript
浅谈Vue的响应式原理
May 30 Javascript
解决vue的router组件component在import时不能使用变量问题
Jul 26 Javascript
Swiper实现导航栏滚动效果
Oct 16 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中Socket创建与监听实现方法
2015/01/05 PHP
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
js控制href内容的连接内容的变化示例
2014/04/30 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
2016/05/16 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
JavaScript关于提高网站性能的几点建议(一)
2016/07/24 Javascript
jQuery实现简单日期格式化功能示例
2017/09/19 jQuery
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
vue使用recorder.js实现录音功能
2019/11/22 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
win与linux系统中python requests 安装
2016/12/04 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
使用Python设计一个代码统计工具
2018/04/04 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
2021/02/25 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
模具设计与制造专业应届生求职信
2013/10/18 职场文书
仓库门卫岗位职责
2013/12/22 职场文书
预备党员思想汇报范文
2014/01/11 职场文书
教师业务学习制度
2014/01/25 职场文书
公司营业员的自我评价
2014/03/04 职场文书
委托书范本
2014/04/02 职场文书
中学生寄语大全
2014/04/03 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
员工教育培训协议书
2014/09/27 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
初一数学教学反思
2016/02/17 职场文书