ImageMagick 比较:忽略 PSNR 结果中的白色匹配项

ImageMagick compare: Disregard white matches from the PSNR result

我使用的是 compare to diff two similar color PNG files. They get a PSNR ~27 的值。

图像包含很多白色区域,两幅图像始终匹配。如果我错了,请纠正我,但这些白色区域正在增加 PSNR 值(使图像与平均值更相似)。因此我不想考虑白色像素,IF 它们匹配。

有没有办法使用 compare 或通过考虑其他工具来做到这一点?

我尝试将 -transparent-color 设置为白色,但这没有效果。

这是我的命令:

compare -compose src -metric PSNR img1.png img2.png diff.png

编辑:

compare --version
Version: ImageMagick 6.6.9-7 2014-03-06 Q16 http://www.imagemagick.org

convert --version
Version: ImageMagick 6.6.9-7 2014-03-06 Q16 http://www.imagemagick.org

我关于忽略白色像素的想法可能是垃圾,但我仍然想实现更好的比较。

澄清一下:
想象一下这种情况:你比较两个图像,它们有点不同。然后为这些图像添加一个大的白色边框。你再次 diff 并发现结果 PSNR 值上升了一些。我想要的是一种否定这一点的方法。显然两张图片的白边是一样的...

已更新

好的,我们先把你要比较的区域做个遮罩怎么样?所以,如果你想忽略两个图像都是白色的区域,你可以这样做:

convert a.png b.png                   \
       -colorspace gray               \
       -compose multiply -composite   \
       -threshold 65534               \
       -negate PNG8:mask.png

然后,当你进行比较时,预先屏蔽图像:

convert \( a.png mask.png -compose copy-opacity -composite \) \
        \( b.png mask.png -compose copy-opacity -composite \) \
        -metric PSNR -compare diff.png

compare 在 bash 中像这样:

compare -metric PSNR \
    <(convert a.png mask.png -compose copy-opacity -composite PNG:-) \
    <(convert b.png mask.png -compose copy-opacity -composite PNG:-) \
    diff.png

我仍然不明白你在做什么,我仍然想看看你的图片和你期望的结果...但是,我听取了你的建议并从这个页面制作了两张相似的图片单词 missing 中的两个 s 字母被删除。

a.png

b.png

所以,如果我现在比较它们,我会得到:

convert a.png b.png -metric PSNR -compare -format "%[distortion]" info:
33.4539

和这张图片:

或者如果我按照我说的去做,我会得到这个:

convert -fill black \( a.png +opaque white \) \( b.png +opaque white \) -metric PSNR -compare -format "%[distortion]" info:
7.25418

和这张图片:

但我仍然none更了解你想要什么,因为我已经完成了所有的工作而你还没有回答我。

原答案

如果你能 post 你的图片就更好了,这样我们就能明白你的意思了,但是试试像这样使用 convert 来做比较:

convert a.png b.png -metric PSNR -compare diff.png

然后你可以像这样添加pre-processing来让所有的白色区域在比较之前变成黑色。您还可以添加 -fuzz 10% 来捕获 near-white 颜色。

convert -fill black 
   \( a.png +opaque white \) \
   \( b.png +opaque white \) \
   -metric PSNR -compare diff.png

和Mark Setchell一样,我不完全理解你的真实意图。您没有提供任何可能有助于我们了解您的工作的示例图片(链接)。

准备

这就是为什么我自己创建了 4 个样本图像。这是第一对:

  • 左边一张是JPEG。
  • 右边一张是PNG。

差别很小 -- 在这里复制时,您几乎无法用肉眼发现它们。两张图片都是 482x642 像素:

第二对来了。再次,

  • 左边一张是JPEG;
  • 右边的是 PNG。

通过在初始对周围添加白框,将它们都放大到 1002x1002 像素。在下面的复制品中,由于该网页内部的缩放比例不同,它们显得更小:

因此第二对的 "important" 部分是包含在黑框中的内容。外边界上的白框是相同的。

比较

现在让我们比较一下这两对。但我不想将比较仅限于 PSNR 指标。我想查看所有可用指标。我们可以使用此命令列出可用指标:

compare -list metric
 AE
 Fuzz
 MAE
 MEPP
 MSE
 NCC
 PAE
 PHASH
 PSNR
 RMSE

我对return 第一个 对的指标的命令是这样的:

for metric in $(compare -list metric) ; do  \
   echo -n "Metric ${metric} :  " ;         \
   compare                                  \
      -metric ${metric}                     \
       http://i.stack.imgur.com/TEjAd.jpg   \
       http://i.stack.imgur.com/p8JsE.png   \
       null: ;                              \
   echo ;                                   \
done

这是第一对的结果(略re-formatted)("important"部分):

Metric AE    :  123789
Metric Fuzz  :     948.522      (0.0144735)
Metric MAE   :     381.318      (0.00581854)
Metric MEPP  :       3.5399e+08 (0.000209349, 0.32549)
Metric MSE   :      13.7285     (0.000209483)
Metric NCC   :       0.998307
Metric PAE   :   21331          (0.32549)
Metric PHASH :       5.43771
Metric PSNR  :      36.7885
Metric RMSE  :     948.522      (0.0144735)

我对 return second 对的指标的命令是这样的:

for metric in $(compare -list metric) ; do  \
   echo -n "Metric ${metric} :  " ;         \
   compare                                  \
      -metric ${metric}                     \
       http://i.stack.imgur.com/gBruS.jpg   \
       http://i.stack.imgur.com/8NJeB.png   \
       null: ;                              \
   echo ;                                   \
done

这是第二对的结果(略re-formatted)("watered down" 加入大量白框的差异):

Metric AE    :  133609
Metric Fuzz  :     611.952       (0.00933779)
Metric MAE   :     143.849       (0.00219499)
Metric MEPP  :       4.33273e+08 (8.71895e-05, 0.341176)
Metric MSE   :       5.71428     (8.71944e-05)
Metric NCC   :       0.998137
Metric PAE   :   22359           (0.341176)
Metric PHASH :       0.360076
Metric PSNR  :      40.5951
Metric RMSE  :     611.952       (0.00933779)

这两个结果都是通用的 table:

+==============+=======================================+=========================================+
| Metric Type  | Results for "important" image parts   | Results including "unimportant" frames  |
+==============+=======================================+=========================================+
| Metric AE    | 123789                                | 133609                                  |
| Metric Fuzz  |    948.522      (0.0144735)           |    611.952       (0.00933779)           |
| Metric MAE   |    381.318      (0.00581854)          |    143.849       (0.00219499)           |
| Metric MEPP  |      3.5399e+08 (0.000209349, 0.32549)|      4.33273e+08 (8.71895e-05, 0.341176)|
| Metric MSE   |     13.7285     (0.000209483)         |      5.71428     (8.71944e-05)          |
| Metric NCC   |      0.998307                         |      0.998137                           |
| Metric PAE   |  21331          (0.32549)             |  22359           (0.341176)             |
| Metric PHASH |      5.43771                          |      0.360076                           |
| Metric PSNR  |     36.7885                           |     40.5951                             |
| Metric RMSE  |    948.522      (0.0144735)           |    611.952       (0.00933779)           |
+==============+========================================+=========================================+

注意: 将两张相同的图像与 PSNR 指标进行比较会得到 inf(无穷大) 值。

现在得出你自己的结论...

讨论

了解比较指标并不是一件简单的事情。

从我对你的'Edit:'

的解释来看,你自己对 PSNR 的理解似乎有点偏差

To clarify:
Imagine this situation: you compare two images, they differ a bit. You then add a big white border to those images. You diff again and find that the resultant PSNR value has risen some amount.

因为 PSNR 的 上升 值意味着两个比较图像变得更加相似! (当然,您打算在比较图像之前移除图像周围的白色(或其他颜色)frames/borders 仍然是一种合理的方法。 要了解如何做到这一点,请查看我的回答结束...)

为了更好地了解图像比较指标,您应该先创建一些简单的 "images"。然后开始尝试这些。

这里是关于如何创建一系列 mono-colored "patches" 的建议,每个大小为 100x100 像素:

for col in black white blue green red; do               \
  convert -size 100x100 xc:${col} xc-100px-${col}.png ; \
done

实验任务:将每个 100x100 像素的补丁相互比较。
问题:

  • 如果将 "black-white" 指标与 "black-blue" 或 "red-green" 指标并列,什么是不table?
  • 有些结果是不是出乎你的意料?为什么会这样?

现在对 200x200 像素的补丁执行相同的操作:

for col in black white blue green red; do               \
  convert -size 200x200 xc:${col} xc-200px-${col}.png ; \
done

实验任务: 将每个 200x200 像素块相互比较。
问题:

  • 200x200 图像的相应 "color1-color2" 指标是否偏离 100x100 图像的相同 "color1-color2" 指标?
  • 是否有一些指标 return 与其各自 counter-parts 相同的结果?为什么会这样?

现在在每个 100x100 像素的色块周围添加一个 50 像素宽的红框。生成的图像也将是 200x200 像素的大小:

for img in xc-100px-*.png ; do \
   convert                     \
     ${img}                    \
    -mattecolor red            \
    -frame 50x50               \
     redframed-${img} ;        \
done

实验任务:自己做比较对。 (你知道也可以将 200x200 像素 'mono-color' 补丁与 200x200 像素 'redframed' 补丁进行比较...)
问题:

  • 哪些比较合理?
  • 您是否知道 -metric phash 是唯一允许您使用不同尺寸(宽度 x 高度)比较图像的工具?

如何'trim' mono-colored 图像周围的框架

您可以删除图像周围由相同颜色像素组成的任何 'frame'。图像运算符 -trim 将自动为您完成此操作。 (它也适用于不同于白色的颜色。)

convert reframed-xc-100px-blue.png -trim +repage output.png

identify redframed-xc-100px-blue.png  output.png
 redframed-xc-100px-blue.png PNG 200x200 200x200+0+0 8-bit sRGB 3c 322B 0.000u 0:00.000
               output.png[1] PNG 100x100 100x100+0+0 8-bit sRGB 2c 285B 0.000u 0:00.000