我使用compare
来比较两个相似的颜色 PNG文件。 他们得到〜27的PSNR值。
图像包含大量白色区域,这两个图像之间始终保持一致。 纠正我,如果我错了,但这些白色区域正在增加PSNR值(使图像更接近平均)。 因此,我不想考虑白色像素, 如果他们匹配。
有没有办法做到这一点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
我关于忽略白色像素的想法可能是垃圾,但我仍然想要获得更好的比较。
澄清:
想象一下这种情况:你比较两张图片,他们有点不同。 然后为这些图像添加一个大的白色边框。 你再次比较,发现PSNR值已经上升了一些。 我想要的是一种否定这种方式。 显然,两幅图像中的白色边框是一样的。
像马克·塞切尔一样,我不完全明白你的真正意图是什么。 您不提供任何(链接到)样本图片,这可能有助于我们掌握您所要做的。
这就是为什么我自己创建了4个样本图像。 这是第一对:
差异很小 – 在这里复制时,您几乎无法用肉眼看到它们。 这两个图像都是482×642像素:
这是第二对。 再次,
这些都是通过在初始对周围添加一个白色框架而扩大到1002×1002像素。 在下面的再现中,由于这个网页内部的缩放比例不同,它们显得更小:
所以第二对的“重要”部分就是黑框中所包含的部分。 外界的白色框架是相同的。
现在让我们比较两个对。 但我不想将比较限制在PSNR指标上。 我想看看所有可用的指标。 我们可以使用这个命令列出可用的指标:
compare -list metric AE Fuzz MAE MEPP MSE NCC PAE PHASH PSNR RMSE
我的命令返回第一对的指标是这样的:
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
这是第一对( 仅“重要”部分 )的结果(稍微重新格式化):
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)
我的命令返回第二对的指标是这样的:
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
这是第二对的结果(稍微重新格式化)( 通过添加大量的白色框架“淡化”差异 ):
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)
这是两个共同的表格中的结果:
+==============+=======================================+=========================================+ | 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
(infinitiv)值。
现在画出你自己的结论
了解比较指标并不是一件简单的事情。
你自己对PSNR的理解似乎有点偏离,从我如何解读你的“ 编辑: ”
澄清:
想象一下这种情况:你比较两张图片,他们有点不同。 然后为这些图像添加一个大的白色边框。 你再次比较,发现PSNR值已经上升了一些。
因为PSNR的上升值意味着两幅比较图像变得更加一致了! (当然,在比较图像之前,你有意去除图像周围的白色(或其他颜色)的边框/边框,这仍然是一个合理的方法,要看看如何做到这一点,
为了获得更好的图像比较指标的感觉,您应该首先创建一些简单的“图像”。 然后开始尝试这些。
这里有一个建议如何创建一系列单色“补丁”,每个尺寸为100×100像素:
for col in black white blue green red; do \ convert -size 100x100 xc:${col} xc-100px-${col}.png ; \ done
实验任务:将每个100×100像素的补丁相互比较。
问题:
现在对200×200像素的补丁也是这样做的:
for col in black white blue green red; do \ convert -size 200x200 xc:${col} xc-200px-${col}.png ; \ done
实验任务:将每个200×200像素的补丁相互比较。
问题:
现在,在每个100×100像素的色块周围添加一个50像素宽的红色框。 由此产生的图像也将是200×200像素的大小:
for img in xc-100px-*.png ; do \ convert \ ${img} \ -mattecolor red \ -frame 50x50 \ redframed-${img} ; \ done
实验任务:组成你自己的比较对。 (你也可以比较200×200像素的“单色”补丁和200×200像素的“红框”补丁…)
问题:
-metric phash
是唯一一个允许您使用不同尺寸( 宽x高 )比较图像的程序? 您可以移除由相同颜色的像素组成的图像周围的任何“框架”。 图像运算符-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
更新
好的,我们如何制作你想要比较的区域的面具呢? 所以,如果你想忽略两个图像都是白色的区域,你可以这样做:
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
或者像这样在bash中compare
:
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
的字里missing
了。
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
和这个图像:
但我对你想要什么都不是很明智,因为我已经完成了所有的工作,而你也没有回答我的问题。
原始答复
如果你可以发布你的图片,这样会更好,所以我们可以看到你的意思,但尝试使用像这样的convert
进行比较:
convert a.png b.png -metric PSNR -compare diff.png
那么你可以在这样的预处理中加入比较前的所有白色区域。 你也可以添加-fuzz 10%
以捕捉接近白色的颜色。
convert -fill black \( a.png +opaque white \) \ \( b.png +opaque white \) \ -metric PSNR -compare diff.png