Відбиток пальця зображення для порівняння подібності багатьох зображень


94

Мені потрібно створити відбитки пальців багатьох зображень (близько 100 000 існуючих, 1000 нових на день, RGB, JPEG, максимальний розмір 800x800), щоб дуже швидко порівняти кожне зображення з кожним іншим. Я не можу використовувати двійкові методи порівняння, оскільки також слід розпізнавати зображення, які майже подібні.

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


1
Мова, для якої повинна бути бібліотека?
Ben S

Відповіді:


57

Звичайні алгоритми хешування або CRC не працюють з даними зображень. Слід враховувати розмірний характер інформації.

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

можливо кілька простих рішень:

  1. Створіть гістограму світності для зображення у вигляді відбитка пальця
  2. Створюйте зменшені версії кожного зображення як відбитки пальців
  3. Поєднайте методи (1) та (2) у гібридний підхід для поліпшення якості порівняння

Гістограма світності (особливо та, яка розділена на компоненти RGB) є розумним відбитком пальця для зображення - і може бути реалізована досить ефективно. Віднімаючи одну гістограму з іншої, вийде нова гістограма, яку ви можете обробити, щоб вирішити, наскільки схожі два зображення. Гістограми, оскільки єдині, що оцінюють розподіл та поширеність інформації про світність / колір, досить добре обробляють афінні перетворення. Якщо квантувати інформацію про світність кожного кольорового компонента до 8-бітового значення, 768 байт пам’яті достатньо для відбитка пальця зображення майже будь-якого розумного розміру. Гістограми світності створюють помилкові негативи, коли маніпулюють кольоровою інформацією на зображенні. Якщо ви застосовуєте такі перетворення, як контраст / яскравість, стерилізація, зміна кольору, інформація про світність.

Використання масштабованих зображень - ще один спосіб зменшити інформаційну щільність зображення до рівня, який простіше порівняти. Зменшення нижче 10% від початкового розміру зображення, як правило, втрачає занадто багато інформації, щоб бути корисною - тому зображення розміром 800x800 пікселів можна зменшити до 80x80 і при цьому забезпечити достатньо інформації для проведення гідних відбитків пальців. На відміну від даних гістограми, вам доведеться виконувати анізотропне масштабування даних зображення, коли роздільна здатність джерела має різне співвідношення сторін. Іншими словами, зменшення зображення 300x800 до ескізу 80x80 спричиняє деформацію зображення, так що у порівнянні із зображенням 300x500 (це дуже схоже) спричиняє помилкові негативи. Відбитки пальців на мініатюрах також часто дають помилкові негативи, коли беруть участь афінні перетворення. Якщо ви перевертаєте або обертаєте зображення,

Поєднання обох методів є розумним способом захистити свої ставки та зменшити частоту як помилкових спрацьовувань, так і помилкових негативних.


Щодо КПР, погодився. Однак, якщо хтось хоче його використовувати, краще використовувати хеш MD5, ніж CRC32
mloskot

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

34

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

Візьміть вейвлет зображення Хаара . В основному вейвлет Хаара - це послідовність відмінностей від зображень із нижчою роздільною здатністю до кожного зображення з більш високою роздільною здатністю, але зважених тим, наскільки глибоко ви знаходитесь у "дереві" мипмап. Розрахунок простий. Потім, як тільки вейвлет Хаара буде належним чином зваженим, викиньте всі, крім найбільших коефіцієнтів k (з точки зору абсолютного значення), нормалізуйте вектор і збережіть його.

Якщо взяти точковий добуток двох із цих нормованих векторів, це дає вам міру подібності, причому 1 майже ідентичний. Я відправив більше інформації по тут .


20

Вам обов’язково слід поглянути на фаш .

Для порівняння зображень є цей php- проект: https://github.com/kennethrapp/phasher

І мій маленький клон javascript : https://redaktor.me/phasher/demo_js/index.html

На жаль, це базується на "розряді бітів", але розпізнає обернені зображення. Інший підхід у javascript полягав у побудові гістограми світимості із зображення за допомогою полотна. Ви можете візуалізувати гістограму багатокутника на полотні та порівняти цей багатокутник у своїй базі даних (наприклад, просторовий MySQL ...)


це в npm? Я шукаю спосіб порівняти схожість двох зображень за допомогою JavaScript
chovy

Хм, я думав, що це "дешево за npm". Це була насправді лише демонстрація, написана швидко з нуля. Однак сміливо робіть із джерелом все, що завгодно. Якщо я зможу це зробити, я розгляну це пізніше і відправлю на github github.com/redaktor ...
sebilasse

@SebastianLasse Я щойно перевірив ваш порт JS, і це фантастично! Я просто бажаю, щоб ви могли передати URI зображення Compare()функції, замість того, щоб спочатку завантажувати зображення. Крім того, з мого тестування, поріг для "дуже подібного зображення" повинен бути> 90%, а не> 98%.
thdoan

12

Давним-давно я працював над системою, яка мала деякі подібні характеристики, і це наближення алгоритму, якого ми дотримувались:

  1. Розділіть зображення на зони. У нашому випадку ми мали справу з відео з роздільною здатністю 4: 3, тому використовували 12 зон. Це робить роздільну здатність вихідних зображень із зображення.
  2. Для кожної зони розрахуйте загальний колір - середнє значення всіх пікселів у зоні
  3. Для всього зображення обчисліть загальний колір - середнє значення всіх зон

Отже, для кожного зображення ви зберігаєте n + 1цілі значення, де nє кількість зон, які ви відстежуєте.

Для порівняння вам також потрібно розглянути кожен кольоровий канал окремо.

  1. Для загального зображення порівняйте кольорові канали для загальних кольорів, щоб побачити, чи перебувають вони в межах певного порогу - скажімо, 10%
  2. Якщо зображення перебувають у межах порогового значення, далі порівняйте кожну зону. Якщо всі зони також знаходяться в межах порогового значення, зображення досить сильні, щоб ви могли принаймні позначити їх для подальшого порівняння.

Це дозволяє швидко відкидати зображення, які не відповідають; Ви також можете використовувати більше зон та / або застосовувати алгоритм рекурсивно, щоб отримати сильнішу впевненість у відповідності.


6

Подібно до відповіді Ic - ви можете спробувати порівняти зображення з різною роздільною здатністю. Тож кожне зображення зберігається як 1x1, 2x2, 4x4 .. 800x800. Якщо найнижча роздільна здатність не збігається (залежно від порогового значення), ви можете негайно відхилити її. Якщо це збігається, ви можете порівняти їх із наступною вищою роздільною здатністю тощо.

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


Думаю, це відображає якийсь пошук по дереву. Це цікаво.
Андре Ласло

3

Отже, ви хочете виконати "збіг відбитків пальців", який значно відрізняється від "зіставлення зображень". Аналіз відбитків пальців був глибоко вивчений протягом останніх 20 років, і було розроблено декілька цікавих алгоритмів для забезпечення правильної швидкості виявлення (стосовно показників FAR та FRR - коефіцієнт помилкового прийняття та коефіцієнт помилкового відхилення ).

Я пропоную вам краще ознайомитись із класом методів виявлення LFA (Local Feature Analysis) , в основному побудованим на дрібницькому огляді. Minutiae - це специфічні характеристики будь-якого відбитка пальця, і вони класифікуються в декілька класів. Складання растрового зображення на карту дрібниць - це те, що насправді робить більшість органів державної влади, щоб подати документи на злочинців або терористів.

Дивіться тут для подальших посилань


Чи знаєте ви, як розрахувати коефіцієнт помилкового прийняття, якщо у вас є розподіл балів за Гаусом для даної біометричної системи?
GobiasKoffi

OP хоче "створити відбитки пальців багатьох зображень". Не порівнюйте зображення відбитків пальців людини.
Navin


3

Починаючи з 2015 року (назад у майбутнє ... за цим питанням 2009 року, яке зараз високо оцінене в Google), подібність зображення можна обчислити за допомогою методів глибокого навчання. Сімейство алгоритмів, відомих як автоматичні кодери, може створити векторне подання, яке можна шукати для схожості. Існує демо тут .


Чи можна згенерувати зображення відбитка пальця з двійкових даних?
SwR

Звичайно, для цього завдання є ANN, але ваша відповідь, здається, насправді нічого не відповідає. Питання: як це робиться? Сторінка, на яку пов’язано посилання, не розкриває жодної інформації, і термін „Автокодери” також не допомагає.
Саймон Штейнбергер

в оригінальному запитанні не сказано "Як це робиться?", але сказано "деякі підказки щодо існуючих алгоритмів мені дуже допомогли б", саме це я надав.
Алекс Р

Ви не прив’язали „підказку” до алгоритму, насправді на пов’язаній сторінці написано „це працює, але ніхто не знає, чому. Будь ласка, не чекайте занадто багато на результат” ...
одіт,

Цей deeplearning4j.org/deepautoencoder#use-cases надає більше ясності щодо того, як за допомогою автоматичних кодерів можна створити відбиток пальця, а також як ви можете використовувати цей відбиток пальця для пошуку схожості в інших зображеннях на основі схожості вершин.
одіт,

2

Один із способів зробити це - зменшити розмір зображення та значно зменшити роздільну здатність (можливо, до 200x200?), Зберігаючи меншу (із середнім пікселем) версію для порівняння. Потім визначте поріг допуску та порівняйте кожен піксель. Якщо RGB усіх пікселів знаходиться в межах допуску, у вас є збіг.

Вашим початковим прогоном є O (n ^ 2), але якщо ви каталогізуєте всі збіги, кожне нове зображення - це лише алгоритм O (n) для порівняння (вам потрібно лише порівняти його з кожним раніше вставленим зображенням). Однак це врешті-решт зруйнується, оскільки список зображень для порівняння стане більшим, але я думаю, що ви на деякий час у безпеці.

Після 400 днів запуску у вас буде 500 000 зображень, що означає (зниження часу на зменшення розміру зображення) 200(H)*200(W)*500,000(images)*3(RGB)= 60 000 000 000 порівнянь. Якщо кожне зображення точно відповідає, ви будете відставати, але це, мабуть, не так, правда? Пам’ятайте, ви можете знизити зображення як збіг, як тільки одне порівняння виходить за межі вашого порогу.


2

Ви буквально хочете порівняти кожне зображення з іншими? Що таке програма? Можливо, вам просто потрібна якась індексація та пошук зображень на основі певних дескрипторів? Тоді, наприклад, ви можете переглянути стандарт MPEG-7 для інтерфейсу опису мультимедійного вмісту. Тоді ви можете порівняти різні дескриптори зображень, які будуть не настільки точними, але набагато швидшими.


можливо, вибір між вичерпним та обмеженим
Джонні

0

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

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

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