Graphicsmagick 图像比较阈值

Graphicsmagick Image Comparison threshold value

我在测试台设置中使用 grunt,目前它会为给定的测试用例生成一堆屏幕截图,然后将这些屏幕截图与我已经使用 graphicsmagick 存储在不同存储库中的基准进行比较。但不同版本的 linux(CentOS 和 Ubuntu)的屏幕截图似乎存在细微差别,其中屏幕截图验证通过 Ubuntu 但在 CentOS 上,只有一个屏幕截图不同由于我的测试用例失败而导致的 1e-9 的幅度。

有没有办法在使用 gm compare 时,我可以为图像比较指定一个阈值,这样我们只有在差异超过阈值时才会抛出错误,否则不会?我一直在浏览 graphicsmagick 教程,但无法做到这一点。有什么指点吗?

我正在使用以下代码进行图像比较:

gm.compare(screenshot1, screenshot2, options, function (err, isEqual, equality, raw) {
            assert(!err,filename + ' is different');
            equality.should.be.exactly(0);
            if err done(err);
})

原始值是一个字符串,它具有归一化的 RGB 差异和总 difference.Any 我可以控制阈值的其他选项,所以如果差异小于阈值,相等性为零?

docs 指出

You may wish to pass a custom tolerance threshold to increase or decrease the default level of 0.4.

gm.compare('/path/to/image1.jpg', '/path/to/another.png', 1.2, function (err, isEqual) {
  ...
})

您还可以在 options-object

中传递公差
var options = {
  file: '/path/to/diff.png',
  tolerance: 1.2
}

编辑:由于这似乎行不通,如果相等性在您自己的范围内(任意阈值),您可以将相等性向下舍入:

 gm.compare(screenshot1, screenshot2, options, function (err, isEqual, equality, raw) {
            var threshold = 0.0001;
            equality = equality < threshold ? 0 : equality;
            assert(!err,filename + ' is different');
            equality.should.be.exactly(0);
            if err done(err);
})

只是插话,因为我也在为这个问题挠头,"tolerance" 选项有点不清楚。如果你在任何不完全相同的图像上输出 'equality' 回调参数,你将得到一个非零值(其中零是完美匹配),但是即使是非常不相似的图像也会是非常小的值(我有一个 2000 像素高的精灵 sheet 与一个 256x256 的小图像相比,相等值为 0.12)。

什么是公差,它是 isEqual 回调参数 return true 或 false 的级别,因为它属于 equality 参数。

因此,如果您想确定要比较的图像完全相同,请像这样将公差设置为 0

gm.compare('/path/to/image1.jpg', '/path/to/another.png', 0, function (err, isEqual) {
      ...
})

如果您不需要它们完全相等而只是接近,请忽略阈值并输出相等以确定您的阈值以备后用。