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 getElementsByName()的用法说明
Jul 31 Javascript
JS动态添加与删除select中的Option对象(示例代码)
Dec 25 Javascript
jQuery的选择器中的通配符使用介绍
Mar 20 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
May 06 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
May 13 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
Jun 27 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
Sep 18 Javascript
仿淘宝JSsearch搜索下拉深度用法
Jan 15 Javascript
快速搭建vue2.0+boostrap项目的方法
Apr 09 Javascript
微信小程序实现登录注册tab切换效果
Dec 29 Javascript
JavaScript实现简易聊天对话框(加滚动条)
Feb 10 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
Jun 10 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和AJAX创建RSS聚合器的代码
2007/03/13 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
JavaScript排序算法之希尔排序的2个实例
2014/04/04 Javascript
实例分析javascript中的call()和apply()方法
2014/11/28 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
javascript实现密码验证
2015/11/10 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
bootstrap flask登录页面编写实例
2016/11/01 Javascript
AngularJS递归指令实现Tree View效果示例
2016/11/07 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
vue中利用Promise封装jsonp并调取数据
2019/06/18 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
JavaScript使用canvas绘制随机验证码
2020/02/17 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
javascript实现评分功能
2020/06/24 Javascript
Python实现身份证号码解析
2015/09/01 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
python简易实现任意位数的水仙花实例
2018/11/13 Python
Python 函数返回值的示例代码
2019/03/11 Python
python如何设置静态变量
2020/09/07 Python
CSS3实现类似翻书效果的过渡动画的示例代码
2019/09/06 HTML / CSS
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
维也纳通行证:Vienna PASS
2019/07/18 全球购物
校园十大歌手策划书
2014/02/01 职场文书
运动会稿件100字
2014/02/21 职场文书
投资意向书范本
2014/04/01 职场文书
水电站项目建议书
2014/05/12 职场文书
村级个人对照检查材料
2014/08/22 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL
Python学习之os包使用教程详解
2022/03/21 Python