Це не найкраще рішення, але це рішення. Я хотів би вивчити кращі методи:
Якщо вони не збираються повертати чи масштабувати, ви можете використовувати просту перехресну кореляцію зображень. Буде яскравий пік, де б не було малого зображення у великому зображенні.
Можна прискорити перехресну кореляцію за допомогою методу 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с
- ...
Поміщення зображення сірого масштабу до двійкового та його виконання може бути досить хорошим.
Хмара точок
Якщо джерело та ціль є обома шаблонами крапок, більш швидким методом було б знайти центри кожної точки (перехресно співвіднести один раз із відомою точкою, а потім знайти піки) та зберегти їх як набір точок, а потім співставити джерело для націлювання, обертаючи, перекладаючи та знаходячи найменшу помилку квадратів між найближчими точками у двох наборах.