Як дізнатися, чи однакові два зображення? [зачинено]


20

У мене понад 10000 зображень, приблизно 2000 - це дублікати в інших форматах (як у JPEG, PNG, GIF). Обидва ці числа з кожним днем ​​збільшуються. Мені потрібно видалити ці дублікати, і для цього я повинен знати, як їх спочатку знайти.

Першою моєю думкою було перевірити пікселі зображень та знайти інші зображення, які мають однакові кольорові пікселі в однакових координатах. Але цей варіант не завжди працює. Скажімо, я шукаю дублікат. Щодо об’єкта пошуку, я вибираю 8-бітний файл PNG. У ньому знайдуться всі дублікати цього зображення, але лише 8-бітний PNG, іноді 8-бітовий GIF та рідко JPEG (через алгоритмічний образ зображень, я думаю?).

Друга моя думка полягала в тому, щоб скопіювати всі ці зображення та перефарбувати їх у сувору двоколірну палітру (скажімо, чорно-білу) та виконати те саме сканування, як зазначено вище. Але знову ж JPEG-зображення не на 100% схоже на формат PNG або GIF (та сама причина, що і вище?).

Третя думка полягала в тому, щоб зменшити відсоток на те, наскільки потрібно ознайомити зображення, і збільшити, наскільки кольори можуть змінюватись, що призводить до небажаного видалення зображення ...

Будь-які думки?



Формати з стисненням втрат призводять до появи зображень, які не на 100% ідентичні версії без втрат. Потрібно мати утиліту командного рядка або ви можете запустити програму gui, яка робить пропозиції, а потім показує зображення, які мають, скажімо,> 90% подібних пікселів (обчисліть середнє відхилення)? (і звичайно розмір пікселя повинен бути однаковим у будь-якому форматі)
thorsten müller


1
Скільки б мали однакове ім’я файлу, але різного розширення?
JeffO

4
Корисна відповідь, що не потребує тижня кодування: stackoverflow.com/questions/596262/…
mac

Відповіді:


17

Перцептуальні хеші можуть бути відповіддю:

http://www.phash.org/

Перцептивний хеш - це відбиток мультимедійного файлу, отриманий із різних можливостей його вмісту. На відміну від криптографічних хеш-функцій, які покладаються на лавинний ефект невеликих змін вхідних даних, що призводять до кардинальних змін у виході, перцептивні хеші "близькі" один до одного, якщо характеристики схожі.


9
  1. Перевірте розміри. Якщо різні => зображення не однакові.
  2. Перевірте формати. Якщо те саме => Виконайте точне порівняння, піксель за пікселем.
  3. Якщо це роблять різні формати:

Не порівнюйте RGB (червоний, зелений, синій). Порівняйте яскравість як половину ваги та порівняйте колір / відтінок з іншою половиною (або 2 / 3р проти 1/3). Обчисліть різницю значень і залежно від значення 'допуску' вони однакові або вони не є.

JPEG сильно стискає інформацію про колір, але намагається не зруйнувати значення обмежень.


6

Коли я кілька років тому переглядав купу зображень на дупах, я виявив, що зменшення всього до мініатюр 8х8, а потім обчислення оцінки подібності на основі квадрата відстані (обробка трьох кольорів окремо) між ескізами працював досить добре. Зверніть увагу , що ви можете провести БАГАТО 8х8 мініатюр в пам'яті.

Практично всі пуховики набрали нижче тих, що не були, а єдиними проблемами були деякі зображення, що мали дуже низьку контрастність та подібний загальний результат, хоча фактичний вміст був різним (фоном у кожному випадку був пляжний пісок.)

Це було також ефективним для зйомки зображень, які були дурпами, за винятком того, що хтось зменшив роздільну здатність або якість на одне, щоб зменшити розмір файлу.


1
Зазвичай YUV кращий, ніж RGB, менш чутливий до незначних змін у кольоровому балансі.
Мартін Бекетт

Ця техніка мініатюр для попереднього вибору потенційних відповідностей є дійсною, YUV - це приємний штрих, і я бачив, що він з тих же причин звернувся до чистої карти світності.
Патрік Х'юз

@Martin Beckett: Сума квадратів різниці в RGB - це перше, що я спробував, і він спрацював досить добре, що я не намагався його покращити - і тоді він виловлював дупи з редагуванням. З чітким визначенням дупа це було досить добре, що я дозволив би його автоматично видалити.
Лорен Печтел

@Loren, якщо вони були незначними редакціями пікселів того самого зображення, які повинні працювати. Просто такі речі, як jpeg, псують RGB більше, ніж кольоровий простір YUV. Тільки підказка ;-)
Мартін Бекетт

За своєю природою дуже темні малюнки, як правило, мають меншу суму різниць, навіть якщо вони зовсім не схожі. Поріг може бути відрегульований відповідно до середньої освітленості зображення. Я використовую цю середню освітленість як попередній фільтр, щоб уникнути порівняння зображень O (n ^ 2), тому воно вже є.
Габріель

1

Можливо, вам слід написати якийсь код, який сканує зображення на подобу. Ви можете перетворити всі фотографії у формат ARGB і порівняти їх. (в пам'ять)

Можливий такий підхід: розподіліть зображення по зонах. Скануйте середній колір та / або яскравість зон, щоб порівняти дві картинки на подобу.

Якщо більше, ніж скажімо, 90% зон збігаються, ви вибрали одну, щоб перейти до списку кандидатів для видалення. Таким чином у вас є список кандидатів. Ви можете використовувати співвідношення сторін зображення, щоб класифікувати зображення в горизонтальних і вертикальних зображеннях, щоб прискорити порівняння. таким чином ви можете компенсувати втрачені алгоритми, не відтворюючи потрібні кольори піксель за пікселем. Ви запускаєте програму протягом ночі, а вранці ви це зробили :) in .Net це можна зробити досить легко за допомогою GDI + lib.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.