2012-01-23 3 views
-2

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

+7

Вы хотите сравнить имена файлов или содержимое изображения? –

+1

, если вы хотите найти одинаковые изображения, вы можете сравнить CRC32 файла. Если вам нужен полноценный сопоставитель изображений, я думаю, вам понадобится нечто большее (декодирование изображения на необработанные пиксели и сравнение пикселя по пикселям) – BigMike

+0

Сравнить файлы или изображения? –

ответ

2

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

Простой способ сделать это - сравнить два изображения с помощью 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

Это 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; 
    } 
} 
+0

Я не вижу ничего, кроме сравнения двоичных файлов –

Смежные вопросы