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 相关文章推荐
html中的input标签的checked属性jquery判断代码
Sep 19 Javascript
JavaScript函数定义的常见注意事项小结
Sep 16 Javascript
纯JS代码实现一键分享功能
Apr 20 Javascript
浅谈几种常用的JS类定义方法
Jun 08 Javascript
JS实现HTML表格排序功能
Aug 05 Javascript
AngularJS模块详解及示例代码
Aug 17 Javascript
基于vuejs+webpack的日期选择插件
May 21 Javascript
js自定义QQ菜单效果
Jan 10 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
Aug 16 Javascript
JS实现Cookie读、写、删除操作工具类示例
Aug 28 Javascript
浅析vue-router原理
Oct 19 Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
Nov 29 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字符编码转换之gb2312转为utf8
2013/10/28 PHP
php字符串替换函数substr_replace()用法实例
2015/03/17 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
php如何比较两个浮点数是否相等详解
2019/02/12 PHP
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
基于MooTools的很有创意的滚动条时钟动画
2010/11/14 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
js随机生成网页背景颜色的方法
2015/02/26 Javascript
关于RequireJS的简单介绍即使用方法
2016/10/20 Javascript
干货!教大家如何选择Vue和React
2017/03/13 Javascript
ES6入门教程之Iterator与for...of循环详解
2017/05/17 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
JS实现换肤功能的方法实例详解
2019/01/30 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
js实现橱窗展示效果
2020/01/11 Javascript
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
Python断言assert的用法代码解析
2018/02/03 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
什么是Python变量作用域
2020/06/03 Python
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
2013/01/30 HTML / CSS
世界汽车零件:World Car Parts
2019/09/04 全球购物
生物学学生自我评价
2014/01/17 职场文书
售后服务承诺书范文
2014/03/26 职场文书
道路运输企业安全生产责任书
2014/07/28 职场文书
导游词开场白
2015/01/31 职场文书
财务出纳岗位职责
2015/03/31 职场文书
小学入学感言
2015/08/01 职场文书
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python
CSS中使用grid布局实现一套模板多种布局
2022/07/15 HTML / CSS