Canvas识别相似图片
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>识别相似图片</title>
<style>
html { background:#F0F0F0; }
body { margin:0; padding:0; }
img { display:block; }
.panel { width:300px; height:200px; border:1px solid #CCC; background:#F5F5F5; float:left; display:-webkit-box; -webkit-box-pack:center; -webkit-box-align:center; color:#CCC; font-size:14px; position:relative; -webkit-transition:.5s opacity ease; margin:20px; margin-right:0; }
.panel img { width:100%; position:absolute; left:0; top:0; width:100%; }
.on { border:1px dashed #FFF; background-color:#369; color:#FFF; }
.similar { float:left; margin:20px; border:1px solid #4896D5; background:#D3EEFA; color:#4896D5; font-size:14px; border-radius:5px; padding:10px; opacity:.9; display:none; }
</style>
<script>
window.onload = function () {
var panel1 = document.querySelectorAll('.panel')[0];
var panel2 = document.querySelectorAll('.panel')[1]; panel1.ondragover = panel2.ondragover = function (ev) {
return false;
}; panel1.ondragenter = panel2.ondragenter = function (ev) {
var span = this.querySelectorAll('span')[0];
span.innerHTML = '松开按键将图片放入此框';
this.style.opacity = .8; var re = /\bon\b/;
if (!re.test(this.className)) this.className += ' on';
}; panel1.ondragleave = panel2.ondragleave = function (ev) {
var span = this.querySelectorAll('span')[0];
span.innerHTML = '请拖拽原始图片至此框内';
this.style.opacity = 1; var re = /\bon\b/;
if (re.test(this.className)) this.className = this.className.replace(re, '');
}; panel1.ondrop = panel2.ondrop = function (ev) {
var re = /\bon\b/;
if (re.test(this.className)) this.className = this.className.replace(re, '');
this.style.opacity = 1; var self = this,
file = ev.dataTransfer.files[0],
reader = new FileReader(); reader.onload = function (ev) {
var img = self.querySelectorAll('img')[0]; if (!img) {
img = new Image();
self.appendChild(img);
} img.onload = function () {
self.style.width = this.width + 'px';
self.style.height = this.height + 'px'; var img1 = panel1.querySelectorAll('img')[0];
var img2 = panel2.querySelectorAll('img')[0]; if (img1 && img2) {
document.querySelectorAll('.similar')[0].innerHTML = '相似度:' + searchImage(img1, img2) + '%';
document.querySelectorAll('.similar')[0].style.display = 'block';
}
}; img.src = this.result;
}; reader.readAsDataURL(file);
return false;
};
}; function searchImage(image1, image2, tmplw, tmplh) {
var canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d'),
sw = image1.width, // 原图宽度
sh = image1.height, // 原图高度
tw = tmplw || 8, // 模板宽度
th = tmplh || 8; // 模板高度 canvas.width = tw;
canvas.height = th; ctx.drawImage(image1, 0, 0, sw, sh, 0, 0, tw, th); var pixels = ctx.getImageData(0, 0, tw, th); pixels = toGrayBinary(pixels, true, null, true); var canvas2 = document.createElement('canvas');
var ctx2 = canvas2.getContext('2d'); canvas2.width = tw;
canvas2.height = th; ctx2.drawImage(image2, 0, 0, image2.width, image2.height, 0, 0, tw, th); var pixels2 = ctx2.getImageData(0, 0, tw, th); pixels2 = toGrayBinary(pixels2, true, null, true); var similar = 0; for (var i = 0, len = tw * th; i < len; i++) {
if (pixels[i] == pixels2[i]) similar++;
} similar = (similar / (tw * th)) * 100; return similar;
} // 像素数据,是否二值化(bool),二值化闵值(0-255),是否返回二值化后序列(bool)
function toGrayBinary(pixels, binary, value, sn) {
var r, g, b, g, avg = 0, len = pixels.data.length, s = ''; for (var i = 0; i < len; i += 4) {
avg += (.299 * pixels.data[i] + .587 * pixels.data[i + 1] + .114 * pixels.data[i + 2]);
} avg /= (len / 4); for (var i = 0; i < len; i += 4) {
r = .299 * pixels.data[i], g = .587 * pixels.data[i + 1], b = .114 * pixels.data[i + 2];
if (binary) {
if ((r + g + b) >= (value || avg)) {
g = 255;
if (sn) s += '1';
} else {
g = 0;
if (sn) s += '0';
}
g = (r + g + b) > (value || avg) ? 255 : 0;
} else {
g = r + g + b;
} pixels.data[i] = g, pixels.data[i + 1] = g, pixels.data[i + 2] = g;
} if (sn) return s;
else return pixels;
}
</script>
</head> <body>
<div class="panel"><span>请拖拽图片一至此框内</span></div>
<div class="panel"><span>请拖拽图片二至此框内</span></div>
<div class="similar"></div>
</body>
</html>
Canvas识别相似图片的更多相关文章
- 基于HTML5 Canvas实现的图片马赛克模糊特效
效果请点击下面网址: http://hovertree.com/texiao/html5/1.htm 一.开门见山受美国肖像画家Chuck Close的启发,此脚本通过使用HTML5 canvas元素 ...
- Android实现OCR扫描识别数字图片之图片扫描识别
[Android实例] Android实现OCR扫描识别数字图片之图片扫描识别 Android可以识别和扫描二维码,但是识别字符串呢? google提供了以下解决方案用的是原来HP的相关资料. 可以吧 ...
- canvas生成遮罩图片
首先我们知道css3中增加了不少好用.好玩的css3样式可以使用.今天我们要说到是遮罩. 它的使用方式也不复杂,和background使用方式差不多.使用mask-image就 ...
- HTML5 Canvas前台压缩图片并上传到服务器
1.前台代码: <input id="fileOne" type="file" /> <input id="btnOne" ...
- [js高手之路] html5 canvas系列教程 - 图片操作(drawImage,clip,createPattern)
接着上文[js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)继续,本文介绍的 ...
- 以API方式调用C# dll,使用OneNote2013 sp1实现OCR识别本地图片
http://www.cnblogs.com/Charltsing/p/OneNoteOCRAPI.html OneNote2013 OCR API调用使用说明2019.4.17 使用说明:1.安装干 ...
- 用canvas给视频图片添加特效
Canvas制作视频图片特效 1. Canvas介绍 1.1Canvas是html5上的一个画布标签,功能有点类似java的swing.可以在canvas上画线条 弧线, 文字 就是画布的功能. 具体 ...
- 微信小程序--canvas画布实现图片的编辑
技术:微信小程序 概述 上传图片,编辑图片大小,添加文字,改变文字颜色等 详细 代码下载:http://www.demodashi.com/demo/14789.html 概述 微信小程序--ca ...
- canvas 2.0 图片绘制
绘制图片drawImage 2013.02.21 by 十年灯·一条评论 本文属于<html5 Canvas画图系列教程> 这里的绘制图片是指把一张现成的图片,绘制到Canvas上面. 有 ...
随机推荐
- 【问题&解决】sql2012安装时卡在正在启动操作系统功能"NetFx3"上不动的解决办法
安装完windows8 后开始安装sql2012,安装过程中停在“正在启动操作系统功能"NetFx3"”不动了,很是着急,于是上网查了一下资料,原来NetFx3指的是Framewo ...
- 【Javascript Demo】JS获取当前对象大小以及屏幕分辨率等
效果如下: 代码如下: <html> <head> <title>获取当前对象大小以及屏幕分辨率等</title> <body> <d ...
- TopCoder SRM 633 Div.2 500 Jumping
题意:给一个点(x,y),给一些步长delta1,delta2...deltaN,问从(0,0)严格按照步长走完N步后能否正好到达(x,y)点. 解法:其实就是判断这些线段和(0,0)-(x,y)这条 ...
- POJ 1703 Find them,Catch them ----种类并查集(经典)
http://blog.csdn.net/freezhanacmore/article/details/8774033?reload 这篇讲解非常好,我也是受这篇文章的启发才做出来的. 代码: #i ...
- static,静态关键字的详解
一,使用static声明属性 class Person{ // 定义Person类 String name ; // 定义name属性,暂时不封装 int age ; // 定义age属性,暂时不封装 ...
- 27Spring_的事务管理_银行转账业务加上事务控制_基于tx.aop进行声明式事务管理
上一篇文章中,银行转账业务没有使用事务,会出现问题,所以这篇文章对上篇文章出现的问题进行修改. 事务 依赖 AOP , AOP需要定义切面, 切面由Advice(通知) 和 PointCut(切点) ...
- C语言 百炼成钢9
//题目25:求1+2!+3!+...+20!的和 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib ...
- [CareerCup] 4.8 Contain Tree 包含树
4.8 You have two very large binary trees: Tl, with millions of nodes, and T2, with hundreds of nodes ...
- 微信小程序全选,微信小程序checkbox,微信小程序购物车
微信小程序,这里实现微信小程序checkbox,有需要此功能的朋友可以参考下. 摘要: 加减商品数量,汇总价格,全选与全不选 设计思路: 一.从网络上传入以下Json数据格式的数组 1.标题titl ...
- 我是怎么开发一个小型java在线学习网站的
2016/1/27 11:55:14 我是怎么开发一个小型java在线学习网站的 一直想做一个自己的网站(非博客),但是又不知道做什么内容的好,又一次看到了w3schools,就萌发了开发一个在线ja ...