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 相关文章推荐
Expandable &quot;Detail&quot; Table Rows
Aug 29 Javascript
js中关于new Object时传参的一些细节分析
Mar 13 Javascript
js用Date对象处理时间实现思路及代码
Jan 31 Javascript
JS实现图片翻书效果示例代码
Sep 09 Javascript
javascript等号运算符使用详解
Apr 16 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
Dec 11 Javascript
JS获取屏幕高度的简单实现代码
May 24 Javascript
jQuery 生成svg矢量二维码
Aug 09 Javascript
VUE element-ui 写个复用Table组件的示例代码
Nov 18 Javascript
新手快速上手webpack4打包工具的使用详解
Jan 28 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
Mar 05 Javascript
一些可能会用到的Node.js面试题
Jun 15 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
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
PHP批量去除BOM头内容信息代码
2016/03/11 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
JavaScript DOM 添加事件
2009/02/14 Javascript
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
iframe实用操作锦集
2014/04/22 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
2017/05/22 Javascript
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
小程序组件之自定义顶部导航实例
2019/06/12 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
python实现数组插入新元素的方法
2015/05/22 Python
Python实现求最大公约数及判断素数的方法
2015/05/26 Python
python 3.6.5 安装配置方法图文教程
2018/09/18 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
如何查看在weblogic中已经发布的EJB
2012/06/01 面试题
Structs界面控制层技术
2013/10/11 面试题
创业计划书的内容步骤和要领
2014/01/04 职场文书
贷款委托书范本
2014/04/08 职场文书
《金子》教学反思
2014/04/13 职场文书
大学生交通专业求职信
2014/09/01 职场文书
祝寿主持词
2015/07/02 职场文书
MySQL如何使用使用Xtrabackup进行备份和恢复
2021/06/21 MySQL