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


94

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

Чи існує бібліотека / інструмент, який це вже робить? Як би ви це реалізували?


1
У цьому іншому подібному питанні є кілька хороших відповідей: stackoverflow.com/questions/75891/…
blak


1
Час оновити відповіді у світлі останніх досягнень машинного навчання, а точніше "Глибокого навчання".
jldupont

Моя лабораторія також мала вирішити цю проблему, і використовувала описаний тут робочий процес: douglasduhaime.com/posts/…
duhaime

Відповіді:


73

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

Наприклад, ось кілька питань:

  • обрізані зображення проти не обрізаного зображення
  • зображення із доданим текстом порівняно з іншим без
  • дзеркальні зображення

Найпростіший і найпростіший алгоритм, який я бачив для цього, - це просто виконати такі дії для кожного зображення:

  1. масштабувати до чогось маленького, наприклад, 64x64 або 32x32, не враховуючи пропорції, використовуйте комбінуючий алгоритм масштабування замість найближчого пікселя
  2. масштабуйте діапазони кольорів так, щоб найтемніший був чорним, а найсвітлішим - білим
  3. поверніть і переверніть зображення так, щоб найсвітніший колір був у верхньому лівому куті, а потім верхній правий - наступний темніший, нижній лівий - наступний темніший (наскільки це можливо, звичайно)

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

Потім обчисліть середню відстань пікселів за пікселем між двома зображеннями.

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

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


14
Що таке "комбінуючий алгоритм масштабування"?
Грегг Лінд

32

"Класичний" спосіб вимірювання цього полягає у розбитті зображення на деяку канонічну кількість розділів (скажімо, сітка 10x10), а потім обчислення гістограми значень RGB всередині кожної комірки та порівняння відповідних гістограм. Цей тип алгоритму є кращим як завдяки його простоті, так і завдяки незмінності до масштабування та (малого!) Перекладу.


6
Чи не схоже це на те, щоб зробити одну гістограму для всього зображення, але з доданими недоліками - не бути стійкими до дзеркального відображення та обертання?
dodgy_coder

2 гістограми з 2-х половин зображення матимуть кращу точність відповідності, ніж 1 гістограма цілого. Хоча у нього є недоліки, про які ви згадали, це залежить від того, яку проблему ви вирішуєте.
psycho brm

25

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

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

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

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

Гістограми було б просто генерувати самостійно (припускаючи, що ви можете отримати доступ до значень пікселів), але якщо вам не подобається, бібліотека OpenCV - чудовий ресурс для такого роду робіт. Ось презентація в Powerpoint, яка показує, як створити гістограму за допомогою OpenCV.


14

Хіба алгоритми кодування відео, як MPEG, не обчислюють різницю між кожним кадром відео, щоб вони могли просто кодувати дельту? Ви можете вивчити, як алгоритми кодування відео обчислюють ці різниці кадрів.

Подивіться на цю програму пошуку зображень з відкритим кодом http://www.semanticmetadata.net/lire/ . Він описує кілька алгоритмів подібності зображень, три з яких відповідають стандарту MPEG-7: ScalableColor, ColorLayout, EdgeHistogram та Auto Color Correlogram.


1
Це не відповіло б на запитання тут. Питання не в порівнянні пікселів на піксель.
Kousha

@Kousha Правда, але все ж цікавий напрямок для роздумів.
значення має значення

13

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

У будь-якому випадку, ідея полягає в обчисленні нормованого точкового добутку двох матриць. C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2)).

Ця формула насправді є "косинусом" кута між матрицями (дивним). Чим більша подібність (скажімо Pij=Qij), C буде 1, а якщо вони абсолютно різні, скажімо, для кожного i,j Qij = 1(уникаючи нульового поділу) Pij = 255, то для розміру nxn, чим більше nбуде, тим ближче до нуля ми будемо отримати. (За приблизним розрахунком:) C=1/n^2.



7

Рубінове рішення можна знайти тут

З readme:

Phashion - це обгортка Ruby навколо бібліотеки pHash, "перцептивний хеш", який виявляє повторювані та майже повторювані мультимедійні файли


5

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

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


4

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

Якби у вас було два однакових зображення, ви отримали білу рамку, яка дуже добре стискалася б. Чим більше зображення відрізнялися, тим складнішим було б подання, а отже, і менш стисливим.

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


Подумайте про обертання на 90 градусів; зображення досі схожі.
значення має значення

3

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

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

І, схоже, ви також можете використовувати gqview .


2

Ну, щоб не відповідати прямо на ваше запитання, але я бачив, як це сталося. Нещодавно Microsoft запустила інструмент PhotoSynth, який робить щось дуже подібне для визначення ділянок, що перекриваються, у великій кількості зображень (які можуть мати різне співвідношення сторін).

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


1
Цей тех. було припинено.
Джозеф Россон,

2

щоб розширити нотатку Вайбхава , hugin - це «автошивальник» з відкритим кодом, який повинен мати певне розуміння проблеми.


2

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


1

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


0

Якщо це щось, що ви будете робити зрідка і не потребує автоматизації, ви можете зробити це в редакторі зображень, що підтримує шари, наприклад, Photoshop або Paint Shop Pro (ймовірно, GIMP або Paint.Net, але я я не впевнений у цьому). Відкрийте обидва знімки екрана та покладіть один як шар поверх іншого. Змініть режим змішування шарів на Різниця, і все, що однаково між ними, стане чорним. Ви можете переміщати верхній шар навколо, щоб мінімізувати будь-які відмінності у вирівнюванні.


Іншим інструментом, який робить цей тип різниці дуже простим, є kaleidoscopeapp.com
Michael Osofsky

0

Beyond Compare має порівняння пікселів за зображеннями, наприклад,

введіть тут опис зображення


@xilpex, ОП запитує: Чи існує бібліотека / інструмент, який це вже робить ? Моя відповідь містить посилання на таку бібліотеку / інструмент.
emallove

-1

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

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