如何使用Node.js比较两个图像

如何使用Node.js比较两个图像,node.js,image-processing,automated-tests,image-comparison,Node.js,Image Processing,Automated Tests,Image Comparison,我正在寻找一种方法来比较两幅图像,看看它们有多相似。谷歌搜索它会产生大量的图像处理结果(裁剪、重新调整大小等),但不会对图像进行近似比较。有一个Node.js库,但它是版本0.0.1,并且依赖于各种第三方系统包,因此不稳定或不可移植 大致如下: var imgComparator = require('some-awesome-image-comparator-module'); // result would be between 1.0 and 0.0, where 1.0 would me

我正在寻找一种方法来比较两幅图像,看看它们有多相似。谷歌搜索它会产生大量的图像处理结果(裁剪、重新调整大小等),但不会对图像进行近似比较。有一个Node.js库,但它是版本0.0.1,并且依赖于各种第三方系统包,因此不稳定或不可移植

大致如下:

var imgComparator = require('some-awesome-image-comparator-module');
// result would be between 1.0 and 0.0, where 1.0 would mean exact match
var result = imgComparator.compare('/path/to/image/1.png', '/path/to/image/2.png');

有一个模块,您可以使用它来执行诸如图像比较之类的繁重操作。这里有一个很好的主题:

我找到了这个库,它可能对您有用

还有一款看起来很有前途的手机,它是由优步制造的

var imageDiff = require('image-diff')

imageDiff({
  actualImage: 'checkerboard.png',
  expectedImage: 'white.png'
}, function (err, imagesAreSame) {
  // error will be any errors that occurred
  // imagesAreSame is a boolean whether the images were the same or not
  // diffImage will have an image which highlights differences
})
不推荐使用

从他们的github:

我们在这个项目上不再有任何活跃的维护人员,作为一个整体 结果导致维修中断

作为替代,请参见类似“外观相同”和“外观相同”的替代项目 像素匹配:

我个人使用pixelmatch:

最小、最简单、最快的JavaScript像素级图像 比较库,最初创建用于比较中的屏幕截图 测试

具有精确的抗锯齿像素检测和感知颜色 差异度量

灵感来源于like.js和Blink-diff。与这些库不同, pixelmatch大约有150行代码,没有依赖项,可以正常工作 在原始类型的图像数据数组上,它的速度非常快,可以 用于任何环境(节点或浏览器)

请在此处查找演示:


请让我了解最新情况,因为我还没有让它工作:)。下面是一个如何使用“bin/imagediff”中的lib的示例。将canvas模块的保存版本用作imagediff,最新版本似乎不兼容。阅读如何安装canvas和cairo的手册。我被困了很长一段时间,因为我错过了我需要添加一个文件夹到我的路径。这需要图像相同吗?我想比较两张图片是否相似。ie:同一栋建筑的同一张照片,但略有不同,因为它不是同一张照片。fwiw,image diff是imagemagick/graphicsmagick的
比较
工具的薄包装。不赞成使用和。但像素匹配仅适用于PNG,我与作者有类似的问题,我需要使用nodeJS比较2张jpg图像,像素匹配对此不起作用。。。
const fs = require('fs');
const PNG = require('pngjs').PNG;
const pixelmatch = require('pixelmatch');

const img1 = PNG.sync.read(fs.readFileSync('img1.png'));
const img2 = PNG.sync.read(fs.readFileSync('img2.png'));
const {width, height} = img1;
const diff = new PNG({width, height});

const difference = pixelmatch(img1.data, img2.data, diff.data, width, height, {threshold: 0.1});

fs.writeFileSync('diff.png', PNG.sync.write(diff)); // see diff.png for the difference

const compatibility = 100 - dif * 100 / (width * height);
console.log(`${difference} pixels differents`);
console.log(`Compatibility: ${compatibility}%`);