如何使用js实现两张图片的相似度比较

news/2024/11/9 1:53:59/

最近换季容易感冒,小伙伴们及各位大佬一定要注意身体,每年的这个时候都要渡一次劫。

进博会马上就要来临,最近公司在做一个关于进博会的活动。我是不负责这个项目的。但是看到我们给甲方的稿子甲方老是不满意,老是让修改,我就想参与一下,看看问题到底是出在哪里。

是这样的,我先来简单说下活动的流程,用户刚进入页面呢,会给你展现一个图形(底图),用户要在这个底图上画出相应的图形。然后对比相似度进行奖励。

画图阶段就不多说了,我们直奔重点,这个活动的关键点在于如何进行用户画出的图和底图进行相似度的比较,大家都清楚底图是死的,然而用户画的一坨坨可是大小形都不一样的。我在想,刚开始我直接的想法就是把底图转成一段线段,用用户画出的线段走过的点进行比较,存两个数组进行比较,给一个误差值,只要不超过误差值就算是相似的。但是转头一想,你丫的不对啊,如果说用户超出你的误差值,画的图比你的底图要大很多或者小很多,但是形状上又很相似,那你的程序就是错误判断。后来,我就在想有没有另一种实现方案,如果把他转成图片会怎么样,他该如何进行相似度的比较,接下来就是我们今天的要讲的如何进行图片相似度的比较,我也不解释了,做法我是参考网上的。目前我能想到的比较合适的就这一版解决方案。之所以发这篇帖子是因为我想得到这里大神推荐的更优方案。不说了,直接贴代码了。逻辑你们自己理解下吧。


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;        
}复制代码


在此欢迎各位大佬指正及推荐更优方案。本人不才,只能借力发力。还望以后能多多交流。互加关注➕


转载于:https://juejin.im/post/5bcc1e4de51d450e805bc484


http://www.ppmy.cn/news/357412.html

相关文章

微信小程序 - 完美解决 rich-text 富文本解析图片无法自适应宽高问题,图片超出屏幕宽度且不受控(详细示例源码,简单快速无需任何第三方插件)

前言 本文将提供一个函数,帮助您解决图片无法适应的问题,另外函数中还提供了一些常见的样式处理。 使用官方 <rich-text> 组件或第三方插件解析富文本时,当内容包含图片时显示的结果就会超出父容器宽度, 会导致出现横向滚动条与图片变形,如下图所示对比情况。 解决…

python读取、显示、保存图片的几种方法

目录 读取图像使用opencv读取使用PIL包读取 保存图片显示图片代码总结 读取图像 读取图像我一般采用的有两种方法&#xff0c;如果想要读成numpy数组格式就用opencv方式&#xff0c;想要读成Image对象格式就用PIL包读取。 使用opencv读取 如果是读取灰度图&#xff0c;需要指…

Latex中插入图片

1、Latex的插图 在Latex中使用插图一般有两种方式&#xff0c;一种是插入事先准备好的图片&#xff0c;另一种是使用Latex代码直接在文档中画图。我们一般常见的使用都是第一种&#xff0c;准备好图片&#xff0c;然后直接插入在我们文档当中。只有一些特殊情况需要用大量代码…

前端|加载的图片太多五种优化方法

摘要 web性能的终极目标是减少资源到客户端的延迟,但是我们在HTTP1.0/HTTP1.1协议中经常会遇到加载的图片太多或者太大导致页面加载完成慢的问题:图片太多导致向服务器请求的次数太多,图片太大导致每次请求的时间过长. 本篇将针对图片太多或者太大总结几种优化方案. 一.当图片…

安卓图片适配

接着上一篇安卓适配详解之后&#xff0c;本篇文章介绍一下图片的适配&#xff0c;大致分为两个部分&#xff1a; deawable 文件适配.9图片的使用 drawable 首先根据设备的dpi建立相应的文件夹&#xff0c;放置不同大小的图片&#xff0c;如下图&#xff1a; 这里可以看出…

vue导入及使用本地图片

MSite.vue导入本地图片 图片所在位置&#xff1a; 1.直接使用 <template><img src"./image/1.jpg"/> </tempalte>2.data里使用require <template><img :src"imgUrl"> </template> <script> export default …

C++读取图片

C读取图片 以C风格&#xff08;文件流&#xff09;而不是C风格&#xff08;FILE&#xff09;读取图片。 补充&#xff1a;也可以使用opencv的cv::imread()函数读取图片&#xff0c;这个函数返回的是cv:Mat类型&#xff0c;在计算机视觉(CV)领域用的比较多。 使用到的头文件主要…

(Word论文插入高清图片)软件设置教程

文章目录 0. 需求1. 设置Word&#xff0c;避免过度压缩图片2. 导出高清图片2.1 MATLAB2.2 Visio2.3 PPT 3. 导出PDF3.1 利用Word导出功能&#xff0c;创建 PDF3.1.1 优缺点&#xff1a;3.1.2 具体操作&#xff1a; 3.2 利用Word打印功能&#xff0c;选择 Adobe PDF3.2.1 优缺点…