“图像不同”的 shell 测试?

ua4mk5z4  于 2022-11-16  发布在  Shell
关注(0)|答案(4)|浏览(108)

在shell脚本中,我想检查两个PNG图像是否不同,即图像的大小不同,或者一个图像的至少一个像素与另一个图像的相应像素具有不同的RGBA。
对两个图像文件进行散列将不起作用,因为图像可能被不同地压缩或具有不同的注解,或者可能两个像素完全透明但RGB分量不同,等等。
我知道如何使用ImageMagick的convert工具检查文件大小是否不同。至于比较像素值,我想到使用ImageMagick的compare工具,但如果命令成功处理,退出代码总是0:http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=22451
什么样的命令行测试可以用来比较两个PNG图像的像素是否相等?或者也许有一种方法可以使用compare

iyr7buue

iyr7buue1#

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

$ convert a.png a.rgba
$ convert b.png b.rgba
$ cmp {a,b}.rgba
a.rgba b.rgba differ: byte 1, line 1
tkqqtvp1

tkqqtvp12#

你不应该使用ImageMagick比较的退出代码。所有的说明都是比较函数成功退出,没有错误。你想报告比较的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.phphttps://imagemagick.org/Usage/compare/显示器

23c0lvtd

23c0lvtd3#

使用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

虽然该方法依赖于ImageMagickinstalled,并且比CMP更重,但是可以更容易地扩展以允许容差等。

提示

display -version是测试ImageMagick是否已安装的快速方法。
如果您不想写入磁盘,也可以将这些命令通过管道连接在一起。

mnowg1ta

mnowg1ta4#

在Ubuntu的idiff软件包openimageio-tools上做了我所需要的:

idiff image1.png image2.png || echo differ
Mean error = 0.012306
RMS error = 0.0486403
Peak SNR = 26.2601
Max error  = 0.231373 @ (1, 24, G)  values are 0.517647, 0.74902, 1 vs 0.435294, 0.517647, 1
241 pixels (11.8%) over 1e-06
241 pixels (11.8%) over 1e-06
FAILURE
differ

idiff image1.png image1.png && echo same
PASS
same

返回值根据差异而变化。

相关问题