Розпізнавання точкових шаблонів


46

Маючи два різних розміри наборів точок (2D для простоти), розподілених у межах двох квадратів різного розміру, питання полягає в наступному:

1- як знайти будь-яке виникнення малого через велике?
2- Будь-яка ідея, як класифікувати події, як показано на наступному малюнку?

Ось проста демонстрація питання та бажане рішення: введіть тут опис зображення


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

Стосовно коментарів застосовуються такі властивості:

  • точне розташування балів доступно
  • точний розмір балів доступний
    • розмір може бути нульовим (~ 1) = лише крапка
  • всі точки чорні на білому тлі
  • немає ефекту сірого нальоту / антизгладжування

Ось моя реалізація методу, представленого endolithдеякими невеликими змінами (я обертав ціль замість джерела, оскільки вона менша та швидша в обертанні). Я прийняв відповідь "ендоліту", тому що раніше про це думав. Про RANSAC я поки що не маю досвіду. Крім того, реалізація RANSAC вимагає багато коду. введіть тут опис зображення


1
Ви шукаєте рішення для відповідності таких крапок або для більш складних зображень? Скільки крапок може бути на малюнках?

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

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

1
Чи будуть просто чорні та білі точки? Ви отримуєте їх з камери / сканера / чогось іншого? Двійкові значення можуть зробити обчислення набагато швидшими.
ендоліт

Чи є у вас проблеми з пошуком центрів крапок або просто з пошуком мініатюри на великій картині, знаючи положення крапок?

Відповіді:


17

Це не найкраще рішення, але це рішення. Я хотів би вивчити кращі методи:

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

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

Джерело:

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

Ціль:

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

Перехресна кореляція:

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

Дві яскраві плями - це місця, які відповідають.

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

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

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

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

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

Приклад швидкого Python, використовуючи метод відтінків сірого та FFT:

from __future__ import division
from pylab import *
import Image
import ImageOps

source_file = 'dots source.png'
target_file = 'dots target.png'

# Load file as grayscale with white dots
target = asarray(ImageOps.invert(Image.open(target_file).convert('L')))

close('all')
figure()
imshow(target)
gray()
show()

source_Image = ImageOps.invert(Image.open(source_file).convert('L'))

for angle in (0, 180):
    source = asarray(source_Image.rotate(angle, expand = True))
    best_match = max(fftconvolve(source[::-1,::-1], source).flat)

    # Cross-correlation using FFT
    d = fftconvolve(source[::-1,::-1], target, mode='same')

    figure()
    imshow(source)


    # This only finds a single peak.  Use something that finds multiple peaks instead:
    peak_x, peak_y = unravel_index(argmax(d),shape(d))

    figure()    
    plot(peak_y, peak_x,'ro')
    imshow(d)

    # Keep track of all these matches:
    print angle, peak_x, peak_y, d[peak_x,peak_y] / best_match

1-кольорові растрові карти

Однак для одноколірних растрових зображень це було б набагато швидше. Перехресна кореляція стає:

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

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

Хмара точок

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


1
Саме так, для проблеми, яку слід досліджувати, масштабування не існує, але обертання може статися. Дякуємо за посилання та відповідь.
Розробник

@Developer: Ну, це спрацює тоді, але, мабуть, є кращий спосіб. Якщо це просто двійкове зображення, перехресна кореляція буде набагато швидшою. (Чи існує таке поняття, як FFT для бінарного сигналу?) Чи є обертання довільним? Вам доведеться експериментувати з набором значень обертання, що дає хороші результати, наприклад, збільшення на 1 градус, або на 5 градусів тощо.
ендоліт

1
Так, це бінарна проблема. Я також десь пам’ятаю, що був такий метод пошуку коротшого сигналу, модульованого на більш тривалому сигналі з різною амплітудою. Я пам’ятаю, незалежно від складності, з якою вона працювала, дуже добре показуючи кращі пункти як початкові точки подій. Оскільки проблема в 2D, мені незрозуміло, як використовувати подібну концепцію. Це також складно через обертання, яке застосовується в 2D.
розробник

1
Так, це стає нездійсненним при додаванні свободи обертання. Саме тому були розроблені такі методи, як RANSAC. Я думаю, що це допомагає думати поза коробкою DSP на цьому.
Метт М.

@MattM. Це працює, це просто повільно. :)
endolith

22

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

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

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

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

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


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

1
Схоже, це справді проблема RANSAC / гомографії :)
Метт М.

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

Простий Q: Чи можливо / доцільно застосувати метод RANSAC / гомографії до хмари 3D-точок?
Розробник

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

3

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

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


1
Ви б навели приклад з більш детальним поясненням своєї ідеї? Поточна версія вашої відповіді мене бентежить.
Розробник

3

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

Ось що я пропоную:

  1. Візьміть шаблон і створіть R-таблицю , індексуючи краї шаблону. Вибрані краї є такими:

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

  1. Використовуйте реалізацію за замовчуванням OpenCV узагальненого перетворення Hough для отримання: введіть тут опис зображення

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

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


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