Там какой-либо простой путь состоит в том, чтобы протестировать два PNGs на равенство?

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

Я полагаю, что это может на самом деле быть сделано надежно, так как PNGs используют сжатие без потерь, но я волнуюсь по поводу скорости. Я знаю, что могу веять вещи вниз немного путем тестирования на равные размеры сначала, но когда это прибывает время для фактического сравнения изображений друг с другом, есть ли какой-либо способ сделать это обоснованно эффективно? (т.е. быстрее, чем "двойные для цикла пиксельные значения проверки друг против друга" метод "в лоб"?)

6
задан Mason Wheeler 21 March 2010 в 18:45
поделиться

4 ответа

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

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

3
ответ дан 8 December 2019 в 05:54
поделиться
  1. фильтровать по одинаковому размеру изображения (ширине и высоте)
  2. открыть файл
  3. хэшировать несжатое содержимое (возможно, md5)
  4. сохранить хэш

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

13
ответ дан 8 December 2019 в 05:54
поделиться

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

6
ответ дан 8 December 2019 в 05:54
поделиться

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

0
ответ дан 8 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: