我想创建一个比较两个图像的程序。它必须包含2个文件夹,每个文件夹都有图片,一个文件夹中的每个图片在另一个文件夹中都有一对(文件名相同)ex:folder1有3张图片:[a.png,b.png,c.png] ,和folder2有3张图片:[a.png,b.png,c.png]。我想取一个文件夹1 / a并将其与folder2 / a进行比较。我不知道从哪里开始。
答案 0 :(得分:2)
您提到的是images
而不是file
所以我假设您不想比较原始数据,而是图像像素,您可能还希望获得图像之间差异的阈值
Easiet方法是使用PIL比较两个图像。 PIL有histogram
函数,您可以使用它来获取两个图像的直方图,然后获得RMS(均方根),例如。
import ImageChops
import math, operator
def rmsdiff(im1, im2):
"Calculate the root-mean-square difference between two images"
h = ImageChops.difference(im1, im2).histogram()
# calculate rms
return math.sqrt(reduce(operator.add,
map(lambda h, i: h*(i**2), h, range(256))
) / (float(im1.size[0]) * im1.size[1]))
从http://effbot.org/zone/pil-comparing-images.htm
复制一旦你有一个返回rmsdiff的函数,你可以在另一个迭代所有文件的函数中使用它,例如。
def diff_folder(folder1, folder2):
for path1 in glob.glob(folder1+"/*.png"):
filename = os.path.basename(path1)
path2 = os.path.join(folder2, filename)
if not os.path.exists(path2):
continue
im1 = Image.open(path1)
im2 = Image.open(path2)
diff = rmsdiff(im1, im2)
if diff > threshold:
print "different"
答案 1 :(得分:1)
C#,Python还是C? 看看:
祝你好运答案 2 :(得分:1)
这是一个C#解决方案,它使用二进制文件比较来比较文件。但是,即使图片看起来相同,图像也可能包含不同的元信息。因此,首先将图像作为图像打开而不仅仅作为文件进行比较可能是合适的。
public void CompareImages()
{
var dir1 = new DirectoryInfo(@"C:\path1");
FileInfo[] files1 = dir1.GetFiles("*.png");
var dir2 = new DirectoryInfo(@"C:\path2");
FileInfo[] files2 = dir2.GetFiles("*.png");
Dictionary<string, FileInfo> files2Dict = files2.ToDictionary(f => f.Name);
foreach (FileInfo f1 in files1) {
FileInfo f2;
bool equal = true;
if (files2Dict.TryGetValue(f1.Name, out f2) && f1.Length == f2.Length) {
byte[] image1 = GetFileBytes(f1);
byte[] image2 = GetFileBytes(f2);
for (int i = 0; i < image1.Length; i++) {
if (image1[i] != image2[i]) {
equal = false;
break;
}
}
} else {
equal = false;
}
Console.WriteLine(f1.Name + ": " + (equal ? "Images are equal" : "Images are NOT equal"));
}
}
private static byte[] GetFileBytes(FileInfo f)
{
using (FileStream stream = f.OpenRead()) {
byte[] buffer = new byte[f.Length];
stream.Read(buffer, 0, (int)f.Length);
return buffer;
}
}