【问题标题】:Shell test for "images are different"?“图像不同”的外壳测试?
【发布时间】:2013-04-22 15:05:48
【问题描述】:

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

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

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

什么命令行测试可以用来比较两个PNG图像的像素是否相等?或者毕竟有办法使用compare

【问题讨论】:

  • 2 个基本步骤: 1. 识别图像格式(gif、png、jpeg、...)。这可以通过文件扩展名来完成,如果图像文件是“可信的”或以某种其他方式。 2.查找图像属性,即特定的图像格式信息,存储到处理后的文件中。您可以从Wotsit.org 找到有关文件和通用数据格式的信息。

标签: image bash shell imagemagick diff


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您不应该使用 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/

    【讨论】:

      【解决方案3】:

      使用 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 是否已安装的方法。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-09
        • 2014-06-21
        • 1970-01-01
        • 1970-01-01
        • 2015-09-24
        • 2013-09-11
        • 2014-05-10
        • 1970-01-01
        相关资源
        最近更新 更多