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
我使用的是 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