我需要一个命令行工具来比较2张图像,并说它们的内容是否相同,而不管编码是什么-即一个可能是* .bmp,另一个可能是* .png,只要它们的宽度,高度和所有对应的像素都相同。


需要精确的图形相同性
即使几乎不可见,压缩损失也会产生不同的图像
相同的alpha透明度是同样重要的
EXIF / etc不相关


评论

只是为了澄清一下,元数据(例如EXIF)不相关,对吧?

@CristianCiupitu是的,只是图像在任何背景上都显示相同(即alpha透明度是不同的)。

#1 楼

使用ImageMagick(apt-get install imagemagick),您可以比较独立于编码和元数据的图像,如下所示:

identify -quiet -format "%#" images...


请注意,使用JPEG(*)等有损压缩编码的图像。 jpg)具有细微的,通常是看不见的变化。

另请参见ImageMagick示例:图像签名。

严格来说,您需要比较颜色模型和像素值的缩放比例,太。它们可能不属于图像中的元数据。

评论


好答案。只是为了澄清一下:这将为图像中的每个图像打印级联的校验和。然后,您需要检查这些校验和是否相同。

–Clément
16年7月10日在14:52

#2 楼

如果您有MATLAB,则可以使用:

% Reading images as array to variable 'a' & 'b'. 
a = imread('MIMICDatacollection.bmp'); 
b = imread('MIMICDatacollection.png'); 

% Flatten multidimensional arrays to 1D
c=a(:);
d=b(:);

% Perform comparison
if length(c) ~= length(d)
    disp('The images do not have the same size') 
else
    e = corr2(c,d);           
    if e==1 
        disp('The images are same')
    else 
        disp('The images are not same') 
    end; 
end


我个人将其与PNG和BMP一起使用,但它应适用于imread支持的任何格式。 >
如果需要在没有Matlab的计算机上运行它,可以将其转换为函数并进行编译以使其成为CLI。

如果没有使用像样的映像库(例如Python Imaging Library(PIL))之类的映像库,可以轻松以任何高级语言移植的Matlab。

相关:如何确定我是否正在下载/保存重复映像?

评论


> 0.95会比== 1更好地补偿有损压缩时的压缩伪影吗?

–vsz
2014年7月14日,下午3:12

@vsz我还没有尝试过,但这听起来很合理。

–弗朗克·德农库尔
14年7月14日在3:29

@vsz实际上,问问者希望在图形上完全相同,因此== 1是正确的。

–尼古拉斯·拉乌尔(Nicolas Raoul)♦
2014年7月17日下午5:43

#3 楼

findimagedupes-查找视觉上相似或重复的图像


findimagedupes是一种命令行实用程序,对两个图像执行粗略的“视觉差异”。这使您可以比较两个图像或整个图像树,并确定是否相似或相同。在常见的图像类型上,findimagedupes似乎准确度约为98%。


评论


不幸的是,不适用于我的情况,因为它报告的视觉上相似(但不相同)的图像为重复图像。我需要它来验证自动化测试的结果,因此需要完全相同,而不仅仅是相似性。

– sashoalm
14年7月13日在14:29

#4 楼

最终,我创建了一个名为imgdiff的小型Qt程序,该程序使用2个文件名并执行逐像素比较。如果它们不同,它将打印出一条错误消息,并以1退出,如果相同则无提示退出。

示例用法为:

imgdiff img1.png img2.bmp


链接到Google Code项目-https://code.google.com/p/imgdiff/。

#5 楼

在此处尝试dupeguru:https://dupeguru.voltaicideas.net/。在图片模式下,它会检查相似的图像,即使它们的大小不同,它也会设置阈值,创建相似文件组,然后选择最大的文件为主文件,但也可以设置另一个文件作为参考。能够将文件移动到某个路径或回收站,或者将其完全删除。它是跨平台的。
WinMerge是另一个可以用于各种合并操作的有趣工具:https://winmerge.org/。它具有一个有趣的功能,可突出显示图像中的差异区域,但能够一次最多比较三个文件,或三个包含文件的路径,但是,如果在这些路径上找到具有相同名称的文件,它只会比较它们。这对文件夹同步很有用。这仅是Windows,可以在Wine中正常运行,但是有一个QT版本似乎处于早期阶段:https://github.com/OzzieIsaacs/winmerge-qt。

评论


您可以添加有关该软件相关功能的详细信息吗?

–亚历杭德罗
20年7月6日在20:38

#6 楼

假设您有一个名为before的文件夹,其中包含原始图像,一个名为after的文件夹,其中应包含具有相同文件名的外观相同的图像。使用ImageMagick的compare可以执行以下操作:

for file in before/*.png; do
    result=$(compare -metric AE "${file}" "${file/before/after}" /tmp/diff.png 2>&1);
    if [ "${result}" != '0' ]; then
        echo "${result} incorrect pixels in ${file}";
    fi;
done;


#7 楼

可能需要进行调整以适当地处理Alpha通道,但转换为ppm并校验和似乎可行:

#!/bin/bash

find "${@:-.}" -type f -print |\
while IFS= read -r file; do
    hash=$(convert 2>&- "${file}" -strip ppm:- | md5sum) 
    # we get this hash if convert fails and produces no output
    [ "$hash" = 'd41d8cd98f00b204e9800998ecf8427e  -' ] \
    || echo "$hash ${file}"
done |\
sort | uniq -w32 --all-repeated=separate | sed 's/^.\{36\}//'