Алгоритм порівняння двох зображень


158

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

Чи знаєте ви якийсь алгоритм для виконання подібної роботи?


12
Як визначити, який із оригіналів?
jfs

1
Я здогадуюсь, що у нього є оригінал, і він повинен перевірити, чи є закордонний файл перетвореною копією чи не пов'язаний з оригіналом.
несправжній

Відповіді:


304

Це просто ідеї, про які я думав над проблемою, ніколи не пробував її, але мені подобається думати про такі проблеми!

Перед тим як ти почнеш

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

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

Matlab - відмінний інструмент для тестування та оцінки зображень.

Тестування алгоритмів

Вам слід перевірити (як мінімум) великий аналізований набір людських даних тестових даних, де заздалегідь відомі відповідники. Якщо, наприклад, у тестових даних у вас є 1000 зображень, на яких 5% відповідають, тепер у вас є досить надійний орієнтир. Алгоритм, який знаходить 10% позитивних результатів, не такий хороший, як той, який виявляє 4% позитивних результатів у наших тестових даних. Однак один алгоритм може знайти всі збіги, але також має велику 20% хибну позитивну швидкість, тому існує декілька способів оцінити свої алгоритми.

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

Важливо зазначити, що кожен алгоритм, який корисний, повинен виконувати краще, ніж випадкові здогадки, інакше він марний для нас!

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

Кольорові відра

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

white
red
blue
green
black

(Очевидно, у вас була б більша роздільна здатність лічильників). Кожен раз, коли ви знаходите «червоний» піксель, ви збільшуєте червоний лічильник. Кожне відро може бути представником спектру кольорів, чим вище роздільна здатність, тим точніше, але ви повинні експериментувати з прийнятною різницею.

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

Виявлення країв

Як про використання виявлення краю . (джерело: wikimedia.org )alt текст

З двома подібними зображеннями виявлення країв має забезпечити вам корисний та досить надійний унікальний слід.

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

alt текст

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

Цікаві регіони

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

alt текст
(джерело: meetthegimp.org )

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

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

alt текст
(джерело: per2000.eu )

У нас є 3 чіткі області інтересу. Відстань між областю 1 та 2 може становити 200 пікселів, між 1 та 3 400 пікселями та 2 та 3 200 пікселями.

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

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

Морфінг

Морфінг двох зображень - це процес перетворення одного зображення в інший через набір кроків:

alt текст

Зауважте, це відрізняється від затінення одного зображення до іншого!

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

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

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

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

Блискавки

Відповідь Ова на це запитання відмінна, я пам’ятаю, читав про такі методики вивчення ШІ. Він досить ефективний при порівнянні лексиконів корпусу.

Однією цікавою оптимізацією при порівнянні корпусів є те, що ви можете видалити слова, які вважаються занадто поширеними, наприклад "З", "А", "І" тощо. Ці слова розбавляють наш результат, ми хочемо розібратися, наскільки два корпуси відрізняються. тому їх можна видалити перед обробкою. Можливо, є подібні поширені сигнали в зображеннях, які можна було зняти до стиснення? Це, можливо, варто заглянути.

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

Прозорість

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

Інвертування сигналів

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

alt текст
(джерело: themotorreport.com.au )

Інвертуйте зображення та додайте їх до іншого зображення. Повторно масштабуйте положення / цикл, поки не знайдете отримане зображення там, де достатньо пікселів білого кольору (або чорного кольору? Я буду називати це нейтральним полотном), щоб забезпечити вам позитивну чи часткову відповідність.

Однак розгляньте два рівні зображення, за винятком того, що одне з них має більш яскравий ефект, застосований до нього:

alt текст
(джерело: mcburrz.com )

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

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

Дерево структури даних

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

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

Це, мабуть, не вийшло, але це ідея. Структура даних трійки чудово підходить для зберігання лексиконів, наприклад диктатури. Це дерево префіксів. Можливо, можливо побудувати образ, еквівалент лексикону (я знову можу думати лише про кольори), щоб побудувати трійку. Якщо ви зменшили, скажімо, зображення розміром 300x300 на квадрати 5x5, то розкладіть кожен 5х5 квадрат на послідовність кольорів, з яких ви могли б побудувати трійку з отриманих даних. Якщо квадрат 2х2 містить:

FFFFFF|000000|FDFD44|FFFFFF

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

Порівнювати триєдні дерева слід досить просто, і це могло б дати ефективні результати.

Більше ідей

Я натрапив на цікавий статтю про класифікацію супутникових знімків :

Розглянутими фактурними заходами є: матриці текучості, різниці на рівні сірого, аналіз текстури та тону, характеристики, отримані з спектру Фур'є та фільтри Габора. Деякі функції Фур'є та деякі фільтри Габора виявились хорошим вибором, зокрема, коли для класифікації використовувався єдиний діапазон частот.

Можливо, варто вивчити ці вимірювання більш детально, хоча деякі з них можуть не відповідати вашому набору даних.

Інші речі для розгляду

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

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

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

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

Будьте обережні, щоб не впасти в спробу завершити ніколи не закінчений проект, удачі!


22
Дивовижна відповідь. Кудо за добре продуману і освічуючу відповідь.
Ендрю Хаббс

Дякую! Я сподіваюся розширити це завтра, у мене є ще кілька ідей, над якими я хотів би подумати і подивитися.
Том Ґуллен

Привіт Том - чи знаєш ти будь-яку бібліотеку виявлення крайок з відкритим кодом, преф у Java?
Річард Н

1
Привіт Річард, не шкода, але я впевнений, що там є якісь. Шукайте в Google по "Фільтри Java Gabor" або "Виявлення країв Java", і я впевнений, що ви натрапите на один-два.
Том Гуллен

Посилання на зображення ( blog.meetthegimp.orgwp-content / uploads / 2009/04 / 97.jpg ) стало поганим. Зауважте, що тепер stackoverflow має послугу розміщення зображень.
ThomasW

36

Прочитайте статтю: Porikli, Fatih, Oncel Tuzel та Peter Meer. “Коваріаційне відстеження за допомогою оновлення моделі на основі засобів на риманових колекторах”. (2006) IEEE Комп'ютерне бачення та розпізнавання образів.

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


1
@Satoru Logic: Google пошук шоу хіти на папері: google.com / ... .
Нік

34

Ідея:

  1. використовуйте детектори ключових точок, щоб знайти дескриптори інваріантності масштабу та перетворення деяких точок зображення (наприклад, SIFT, SURF, GLOH або LESH).
  2. спробуйте вирівняти ключові точки з подібними дескрипторами обох зображень (наприклад, при панорамному зшиванні), дозволіть деякі перетворення зображення, якщо це необхідно (наприклад, масштаб і поворот або пружне розтягування).
  3. якщо багато ключових точок добре вирівнюються (існує така трансформація, що помилка вирівнювання ключових точок низька; або "енергія" перетворення низька тощо), ви, ймовірно, маєте подібні зображення.

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

Варіанти:

  • Виявити краї або інші функції замість точок.

2
Я думаю, що і це правильний підхід. Лише деталь: SIFT, SURF, GLOH - це не ключові детектори. Вони дескриптори ключових точок. Поширені детектори ключових точок - детектори DoG, Harris або Eigenvalue (інваріантні за шкалою).
Нікі

Для кроку 2 ви можете скористатися найближчими сусідами, які використовують евклідову відстань між дескрипторами
MobileCushion

15

Це насправді набагато менш просто, ніж здається :-) Пропозиція Ніка - хороша.

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


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

http://en.wikipedia.org/wiki/RGB_color_space
http://upvector.com/index.php?section=tutorials&subsection=tutorials/colorspace


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

http://homepages.inf.ed.ac.uk/amos/hough.html
http://rkb.home.cern.ch/rkb/AN16pp/node122.html
http://en.wikipedia.org/wiki/ Hough_transform


8

У описаній вами формі проблема є жорсткою. Ви вважаєте копію, вставлення частини зображення в інше велике зображення копією? тощо.

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

Він стійкий до атак обробки сигналів ► Посилення сигналу - різкість, контрастність тощо ► Фільтрування - середня, низькочастотна, висока та ін. ► Адитивний шум - гауссова, рівномірна тощо ► Стиснення втрат - JPEG, MPEG тощо.

Він стійкий до геометричних атак ► афінних перетворень ► зменшення даних - обрізання, обрізання тощо ► випадкові локальні спотворення ► викривлення

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


5

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

Це призведе до помилкових позитивів, але, сподіваємось, неправдивих негативів.

  1. Змініть розмір обох зображень так, щоб вони були однакового розміру (я припускаю, що відношення ширини до довжин однакові в обох зображеннях).

  2. Стиснення растрових зображень обох зображень за допомогою алгоритму стиснення без втрат (наприклад, gzip).

  3. Знайдіть пари файлів, які мають однаковий розмір файлів. Наприклад, ви можете просто сортувати кожну пару файлів у вас за тим, наскільки схожі розміри файлів, і отримати верхній X.

Як я вже говорив, це, безумовно, породжує помилкові позитиви, але, сподіваємось, не помилкові негативи. Ви можете реалізувати це за п’ять хвилин, тоді як Porikil et. ін. певно, знадобиться велика робота.


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

Це питання: чи працює, якщо копія збережена з іншою роздільною здатністю?
Доктор Белісарій,

4

Я вважаю, що якщо ви готові застосувати підхід до будь-якої можливої ​​орієнтації та до негативних версій, гарним початком розпізнавання зображень (з хорошою надійністю) є використання власних інтерфейсів: http://en.wikipedia.org/wiki/Eigenface

Іншою ідеєю було б перетворення обох зображень у вектори їх компонентів. Хороший спосіб зробити це - створити вектор, який працює в розмірах x * y (x - ширина вашого зображення, а y - висота), причому значення для кожного виміру застосовується до значення (x, y) пікселя. Потім запустіть варіант K-Найближчих сусідів з двома категоріями: матч і без збігу. Якщо вона достатньо близька до оригінального зображення, вона впишеться в категорію відповідності, якщо ні, то не буде.

K Найближчих сусідів (KNN) можна знайти тут, в Інтернеті є й інші хороші пояснення: http://en.wikipedia.org/wiki/K-nevable_neighbor_algorithm

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


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

Якщо я неправильно зрозумію ваш намір використовувати
Том Галлен

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

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

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

1

Якщо ви готові взагалі розглянути інший підхід до виявлення незаконних копій ваших зображень, можете подумати про водяний маркування . (від 1,4)

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

Хоча це також складне поле, існують методи, які дозволяють зберегти інформацію про водяні знаки завдяки грубій зміні зображення: (від 1.9)

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

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


Будь-яка інформація про те, як водяне маркування зберігається після важкого редагування? Звучить дуже цікаво.
Том Ґуллен

1

Якщо ви працюєте з Linux, я б запропонував два інструменти:

align_image_stack від пакета hugin-tools - це програма командного рядка, яка може автоматично виправляти обертання, масштабування та інші спотворення (переважно призначена для складання фотографій HDR, але також працює для відеокадрів та інших документів). Більше інформації: http://hugin.sourceforge.net/docs/manual/Align_image_stack.html

порівняти з пакету imagemagick - програма, яка може знайти та підрахувати кількість різних пікселів у двох зображеннях. Ось акуратний підручник: http://www.imagemagick.org/Usage/compare/ використовуючи -fuzz N%, ви можете збільшити допуски до помилок. Чим вище N, тим вища толерантність до помилок все-таки рахувати два пікселі як однакові.

align_image_stack має виправити будь-яке зміщення, щоб команда порівняння фактично мала можливість виявити однакові пікселі.

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