<!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识别相似图片的更多相关文章

  1. 基于HTML5 Canvas实现的图片马赛克模糊特效

    效果请点击下面网址: http://hovertree.com/texiao/html5/1.htm 一.开门见山受美国肖像画家Chuck Close的启发,此脚本通过使用HTML5 canvas元素 ...

  2. Android实现OCR扫描识别数字图片之图片扫描识别

    [Android实例] Android实现OCR扫描识别数字图片之图片扫描识别 Android可以识别和扫描二维码,但是识别字符串呢? google提供了以下解决方案用的是原来HP的相关资料. 可以吧 ...

  3. canvas生成遮罩图片

         首先我们知道css3中增加了不少好用.好玩的css3样式可以使用.今天我们要说到是遮罩.        它的使用方式也不复杂,和background使用方式差不多.使用mask-image就 ...

  4. HTML5 Canvas前台压缩图片并上传到服务器

    1.前台代码: <input id="fileOne" type="file" /> <input id="btnOne" ...

  5. [js高手之路] html5 canvas系列教程 - 图片操作(drawImage,clip,createPattern)

    接着上文[js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)继续,本文介绍的 ...

  6. 以API方式调用C# dll,使用OneNote2013 sp1实现OCR识别本地图片

    http://www.cnblogs.com/Charltsing/p/OneNoteOCRAPI.html OneNote2013 OCR API调用使用说明2019.4.17 使用说明:1.安装干 ...

  7. 用canvas给视频图片添加特效

    Canvas制作视频图片特效 1. Canvas介绍 1.1Canvas是html5上的一个画布标签,功能有点类似java的swing.可以在canvas上画线条 弧线, 文字 就是画布的功能. 具体 ...

  8. 微信小程序--canvas画布实现图片的编辑

    技术:微信小程序   概述 上传图片,编辑图片大小,添加文字,改变文字颜色等 详细 代码下载:http://www.demodashi.com/demo/14789.html 概述 微信小程序--ca ...

  9. canvas 2.0 图片绘制

    绘制图片drawImage 2013.02.21 by 十年灯·一条评论 本文属于<html5 Canvas画图系列教程> 这里的绘制图片是指把一张现成的图片,绘制到Canvas上面. 有 ...

随机推荐

  1. java获取Json和http状态码

    最近再做接口自动化测试,其中有几个方法比较重要 1.获取http状态码 /* * 返回接口状态码 * */ public static String getHttpCode(String url) { ...

  2. UVALive 6663 Count the Regions --离散化+DFS染色

    题意:给你n(n<=50)个矩形(左上角坐标和右下角坐标),问这些矩形总共将平面分成多少个部分.坐标值可能有1e9. 分析:看到n和坐标的范围,容易想到离散化,当时就没想到离散化以后怎么判断区域 ...

  3. Codeforces 13C Sequence --DP+离散化

    题意:给出一个 n (1 <= n <= 5000)个数的序列 .每个操作可以把 n 个数中的某一个加1 或 减 1.问使这个序列变成非递减的操作数最少是多少 解法:定义dp[i][j]为 ...

  4. JavaWeb学习----JSP内置对象详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. 项目管理工具Redmine各功能测试

      Redmine 是一个开源的.基于Web的项目管理和缺陷跟踪工具.它用日历和甘特图辅助项目及进度可视化显示.同时它又支持多项目管理.Redmine是一个自由开放 源码软件解决方案,它提供集成的项目 ...

  6. 2014Ember带来怎样的变化?

    每隔几个月的时间,Ember的核心团队就会聚在一起讨论目前遇到的各种问题,并决定下一季度需要优先处理的各种事务. 这一次,在俄勒冈州的波特兰,大家聚在一起,商讨2014年的发展方向. 开发工具 &am ...

  7. 监控Mysql主从环境下Slave延迟状态的操作记录

    在MySQL主从环境下,通常会根据Seconds_Behind_Master的值来判断slave的延迟状态,这么做在大部分情况下尚可接受,但其实是并不够准确的.对于Slave延迟状态的监控,应该考虑多 ...

  8. Web知识总结

    一)window.location.href和window.location.replace的区别 1.window.location.href=“url”:改变url地址: 2.window.loc ...

  9. 学习node.js 第4篇 建立一个最小的web聊天系统

    我们生活在一个实时的世界里,有什么比聊天更加实时吗?那就让我们先写一个基于TCP 的聊天服务器吧,并且支持Telnet 连接.这很容易,而且能够完全用Node来编写.首先,我们需要在Node 中包含T ...

  10. [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项

    2.1 Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow would you solve this p ...