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的开源工具PACKER2.0.2
Nov 04 Javascript
JavaScript的eval JSON object问题
Nov 15 Javascript
jquery中:input和input的区别分析
Jul 13 Javascript
javascript常用代码段搜集
Dec 04 Javascript
js实现漂浮回顶部按钮实例
May 06 Javascript
JS绘制生成花瓣效果的方法
Aug 05 Javascript
AngularJS 中的指令实践开发指南(一)
Mar 20 Javascript
require简单实现单页应用程序(SPA)
Jul 12 Javascript
JavaScript异步上传图片文件的实例代码
Jul 04 Javascript
JavaScript中发出HTTP请求最常用的方法
Jul 12 Javascript
微信小程序如何加载数据库真实数据的实现
Mar 04 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
Oct 30 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
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
php防止网站被刷新的方法汇总
2014/12/01 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
JS中如何判断传过来的JSON数据中是否存在某字段
2014/08/18 Javascript
jQuery中removeData()方法用法实例
2014/12/27 Javascript
js中的触发事件对象event.srcElement与event.target详解
2017/03/15 Javascript
微信小程序之选项卡的实现方法
2017/09/29 Javascript
详解封装基础的angular4的request请求方法
2018/06/05 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
2013/11/27 Python
Python比较两个图片相似度的方法
2015/03/13 Python
Python简单删除目录下文件以及文件夹的方法
2015/05/27 Python
python图像处理之镜像实现方法
2015/05/30 Python
Django框架下在视图中使用模版的方法
2015/07/16 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
python实现彩票系统
2020/06/28 Python
python 字典的打印实现
2019/09/26 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
Python matplotlib实时画图案例
2020/04/23 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
CSS3让登陆面板3D旋转起来
2016/05/03 HTML / CSS
canvas之自定义头像功能实现代码示例
2017/09/29 HTML / CSS
巴西化妆品商店:Lojas Rede
2019/07/26 全球购物
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
上课迟到检讨书
2014/01/19 职场文书
大班开学家长寄语
2014/04/04 职场文书
学雷锋月活动总结
2014/04/25 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
社团招新宣传语
2015/07/13 职场文书
竞选稿之小学班干部
2019/10/31 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
手残删除python之后的补救方法
2021/06/26 Python
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL
box-shadow单边阴影的实现
2023/05/21 HTML / CSS