2010-03-21 3 views
6

У меня есть куча изображений PNG, и я ищу способ идентифицировать дубликаты. Под дублированием я имею в виду, в частности, два файла PNG, данные несжатого изображения идентичны, а не обязательно, файлы которых идентичны. Это означает, что я не могу сделать что-то простое, например, сравнивать хэш-значения CRC.Есть ли простой способ проверить два PNG для равенства?

Я полагаю, что это действительно можно сделать надежно, поскольку PNG используют сжатие без потерь, но я беспокоюсь о скорости. Я знаю, что я могу немного разузнать вещи, сначала проверяя одинаковые размеры, но когда приходит время фактически сравнивать изображения друг с другом, есть ли способ сделать это достаточно эффективно? (То есть. Быстрее, чем «значений проверка пиксельных дважды для цикла друг против друга» метод грубой силы?)

+0

Зачем вам 2 петли? 1 достаточно. – kennytm

+0

Один для X, один для Y –

+0

Несомненно, если вы поместите изображение через сжатие PNG, оно получится так же, если вы сделаете это дважды, то есть вы должны иметь возможность напрямую сравнивать два PNG? – Chris

ответ

3

Если вы не ожидаете большого количества дубликатов, в среднем вы не собираетесь сравнивать много пикселей, прежде чем определять, что 2 файла отличаются друг от друга. Особенно, если каждый пиксель, который вы тестируете, находится далеко от уже проверенных пикселей. Это поможет, например, которые имеют одинаковый цвет фона.

Кроме того, насколько точно вы должны быть? Например, если 10 пикселей, проверенные таким образом, одинаковы, можете ли вы спокойно сделать вывод, что изображения идентичны? 10 RGB пикселей = 240 бит, поэтому частота ложных совпадений со случайными изображениями должна быть 1 в 2^240 = 1 в 10^72!

+0

Они не случайные изображения, и я ожидаю довольно высокую долю дубликатов. Но идея тестирования случайных значений в качестве метода фильтрации является хорошей. –

13
  1. фильтр одинакового размера изображения (ширина & высота)
  2. открытого файла
  3. хэш несжатое содержание (md5 бы возможна)
  4. магазин хэша

  5. сравнить хэш, чтобы найти идентичные те

+1

Зачем сортировать по одинаковому размеру? – zneak

+3

Я думаю, что это надежный ответ. После фильтра некоторые быстрые пиксельные выборки/сравнения на нескольких случайных точках могут также отсеивать некоторые изображения. –

+0

О, ладно. Я думал, что это «размер», как в «размере файла». – zneak

0

Я полагаю, что вы можете настроить размер считываемых данных, даже если формат хранения полностью отличается. Таким образом, если ваше изображение 24-битное, вы можете использовать 32-разрядный или 64-разрядный (если 64-разрядный скомпилированный) тип данных и продолжать упаковывать данные из двух переменных этих типов из обоих изображений и сравнивать их для равенства , Это может немного ускорить работу :)

6

Вместо того, чтобы перебирать все пиксели, чтобы проверить равенство, возможно, стоит начать с середины и работать наружу. Большинство фотографий имеют объект в середине, поэтому здесь больше данных о характеристиках. По сути, будет намного быстрее узнать, есть ли разные картины.

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