使用 ImageMagick 对图像进行平等测试
ImageMagick 库中有相等谓词函数吗?我想比较两个图像并找出它们是否完全相同(像素的所有颜色都相同)或有任何差异。
我查了一下,好像没有这样的功能。我应该自己使用像素迭代器编写函数吗?
Is there any equality predicate function in ImageMagick library? I want to compare two images and find whether they are the exactly same (all colors of the pixels are the same) or have any differences.
I’ve looked around, but it seems not to have a such function. Should I write the function using pixel iterators by myself?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(2)
马克的回答很准确。然而,他忘记提到 compare
还可以返回“增量图像”,它将任何有差异的像素绘制为红色,而相同的像素将绘制为白色。
# Create a PNG and a JPEG from the builtin 'wizard:' image:
convert wizard: wizard.png
convert wizard: wizard.jpg
现在比较两者:
compare wizard.png wizard.jpg delta.png
这是“delta.png”:
PNG 和 JPEG 之间有很多差异!好吧,这是因为 JPEG 是一种有损图像格式...
如您所见,“delta.png”具有苍白的背景。如果您不需要此背景,而只需要红色/白色像素,请修改“比较”命令:
compare wizard.png wizard.jpg -compose src delta.png
此外,您可能希望忽略低于特定阈值的此类差异。这里 -fuzz N%
参数就派上用场了。
您想要蓝色像素而不是红色像素?还有黄色的而不是白色的?给你:
compare \
-highlight-color blue \
-lowlight-color yellow \
-fuzz 3% \
wizard.png \
wizard.jpg \
delta2.png
您想要所有与其各自坐标不同的像素的文字描述吗?这里特殊的输出格式*.txt
可能会很好。
试试这个:
compare \
-fuzz 6% \
wizard.png \
wizard.jpg \
-compose src \
delta3.txt
“delta3.txt”文件将非常大,因为它包含以下格式的每个像素一行:
# ImageMagick pixel enumeration: 480,640,255,srgba
0,0: (255,255,255,0.8) #FFFFFFCC srgba(255,255,255,0.8)
1,0: (255,255,255,0.8) #FFFFFFCC srgba(255,255,255,0.8)
2,0: (255,255,255,0.8) #FFFFFFCC srgba(255,255,255,0.8)
[....]
77,80: (241,0,30,0.8) #F1001ECC srgba(241,0,30,0.8)
[....]
第一列给出相应像素的 (row,column)
对(计数从零开始,最上面、最左边的像素的地址为(0,0)
。
相应的像素颜色。
接下来的三列以 3 种不同的常见表示法格式返回 将 delta3.txt 文件恢复为真实图像,没有任何问题:
convert delta3.txt delta3.png
因此,要将所有不同的像素(红色)放入文本文件中,您可以这样做:
compare \
-fuzz 6% \
wizard.png \
wizard.jpg \
-compose src \
txt:- \
| grep -v '#FFFFFFCC'
要计算不同像素的数量:
compare \
-fuzz 6% \
wizard.png \
wizard.jpg \
-compose src \
txt:- \
| grep -v '#FFFFFFCC' \
| wc -l
使用 -fuzz 6%
时,我得到了 2269
不同的像素。使用 -fuzz 0%
时,我得到了 122474
不同的像素。 (这些图像中的像素总数是307200
。)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
ImageMagick 提供了
compare
函数来正确比较图像。检查两个图像的
md5
校验和不是正确的方法,因为某些图像格式(例如带有 EXIF 的 PNG 和 JPEG)包含文件创建的日期和时间(请参见下面的示例 1) ,并且某些文件可能在视觉上相同,但内部表示方式完全不同(请参见示例 2),或者具有不同的位深度(请参见示例 3)。示例1
为什么这两者的MD5不同?因为日期就在其中...
示例 2
示例 3
图像的模糊比较
正如 Kurt 提到的,这也导致了以下可能性:对图像进行模糊比较。我们可以这样探索:
现在将所有像素乘以 1.01,使它们的亮度提高难以察觉的 1%:
现在通过几种不同的方式对它们进行比较:
ImageMagick provides the
compare
function to properly compare images.Checking the
md5
checksum of two images is not the correct approach, since some image formats (e.g. PNG and JPEG with EXIF for example), contain the date and time the file was created (see example 1) below, and some files can be visually identical but represented completely differently internally (see example 2), or have different bit-depths (see example 3).Example 1
Why do these two differ in MD5? Because the date is in them...
Example 2
Example 3
Fuzzy Comparison of Images
As Kurt alludes to, this also leads to the possibility of doing a fuzzy compare of images. We can explore that like this:
Now multiply all pixels by 1.01 to make them an imperceptible 1% brighter:
And now compare them, a few different ways: