1

在 shell 脚本中,我想检查两个 PNG 图像是否不同,即图像具有不同的大小,或者一个图像的至少一个像素的 RGBA 与另一张图像的相应像素的 RGBA 不同。

散列两个图像文件将不起作用,因为图像可能被不同地压缩或具有不同的注释,或者可能两个像素是完全透明的但 RGB 分量不同等。

convert我知道如何使用 ImageMagick 的实用程序检查文件大小是否不同。至于比较像素值,我想到了使用 ImageMagick 的compare实用程序,但如果命令成功处理,退出代码始终为 0:http ://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t =22451

可以使用什么命令行测试来比较两个 PNG 图像的像素是否相等?或者也许有一种方法可以使用compare

4

3 回答 3

5

找到一种允许未压缩 RGBA 的图像格式,转换两个文件,然后比较输出。也许是这样的:

$ convert a.png a.rgba
$ convert b.png b.rgba
$ cmp {a,b}.rgba
a.rgba b.rgba differ: byte 1, line 1
于 2013-04-22T16:05:21.017 回答
3

您不应该使用 ImageMagick compare 的退出代码。所有这一切都是比较功能成功退出,没有错误。您想通过比较报告 AE 指标,它会告诉您有多少像素不同。或者使用其他一些指标,例如 MAE 或 RMSE。

compare -metric AE image1 image2 null:


这将向终端返回一个值,即计数。

例如:

compare -metric AE lena.png lena.jpg null:
65100


65100像素不同

您可以将其返回给变量:

var=`compare -metric AE lena.png lena.jpg null: 2>&1`
echo $var
65100


ImageMagick 将其输出写入 stderr,这就是我添加 2>&1 的原因

https://imagemagick.org/script/compare.php https://imagemagick.org/Usage/compare/

于 2018-11-17T01:02:32.963 回答
1

使用 ImageMagick 和 grep 的另一种方法

compare -compose src -highlight-color "#FF0000FF" -lowlight-color "#00000000" a.png b.png delta.png

convert delta.png -define histograme:unique-colors=true -format %c histogram:info:- > histogram.info

if grep --quiet "#FF0000 red" histogram.info : then
   echo "different"
else
   echo "same"
fi

虽然这种方法依赖于安装ImageMagick,并且比cmp更重,但它可能更容易扩展以允许容差等......

TIPS
display -version是一种快速测试 ImageMagick 是否已安装的方法。

如果您想避免写入磁盘,这些命令也可以通过管道传输。

于 2018-11-16T19:02:44.087 回答