Сравнение файлов изображений - PullRequest
0 голосов
/ 24 января 2012

Я хотел бы создать программу, которая сравнивает два изображения. Он должен содержать 2 папки, каждая из которых заполнена изображениями, и у каждого изображения в одной папке есть пара в другой папке (с тем же именем файла), например: folder1 имеет 3 изображения: [a.png, b.png, c.png] и папка 2 имеет 3 изображения: [a.png, b.png, c.png]. Я хотел бы взять folder1 / a и сравнить его с folder2 / a. Я не знаю с чего начать.

Ответы [ 3 ]

2 голосов
/ 24 января 2012

Вы упомянули images вместо file, поэтому я предполагаю, что вы не хотите сравнивать необработанные данные, а только пиксели изображения, и вам также может потребоваться пороговое значение для разницы между изображениями

Простой способсделать это сравнить два изображения с помощью PIL.PIL имеет функцию histogram, вы можете использовать ее, чтобы получить гистограмму для обоих изображений, а затем получить среднеквадратическое значение (например,

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 голос
/ 24 января 2012

Вот решение 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;
    }
}
1 голос
/ 24 января 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...