Методы, основанные на двумерных корреляциях, предоставляют богатый набор возможностей для распознавания и определения местоположения объектов и отражений.
Ниже приведен пример кода, который иллюстрирует, как это работает.Мы ищем отражения, переворачивая изображение, и в следующем мы используем roll (), чтобы проиллюстрировать, как смещения работают в системе координат.Затем двумерная корреляция дает вам меру того, как два входа выстраиваются в линию как функция смещения одного относительно другого.(Попробуйте поэкспериментировать с 1-ю данными, если это поможет вам легче понять, как это работает. В 2-м случае в этом нет ничего особенного, кроме количества измерений).
Здесь мы берем бруттоподходить и использовать все изображение.Так как мы работаем с преобразованиями Фурье, это нормально.Однако иногда вы можете улучшить производительность, если сможете идентифицировать и вырезать часть изображения для работы с ней в качестве эталона.
Существуют также методы, включающие проекцию на (в идеале) ортонормированный базисный набор, вейвлеты и т. Д.Эти методы работают лучше всего, когда базовый набор хорошо подходит для того, что вы хотите найти.Методы, основанные на преобразовании Фурье, хорошо работают, когда вы не выходите за пределы Найквиста и отвечаете основным соображениям SNR.Но, честно говоря, FT также является расширением базового набора.
Наконец, следует отметить, что никакой метод не может создать новую информацию.Если его нет во входных данных, никакой алгоритм и никакое количество кода не найдут его.
Хорошо, вот пример кода, демонстрирующий корреляции.
#!/usr/bin/python
import numpy as np
import matplotlib.pylab as plt
from scipy.signal import correlate2d
plt.figure( figsize=[6,8] )
im = plt.imread("temp.png")
# For simplicity of exposition, we just sum the three color channels.
im1 = np.sum(im,axis=2)
ny = 5
nx = 2
n1 = 1
ax = plt.subplot( ny, nx, n1 )
ax.imshow( im1 )
ax.set_title( 'raw' )
ax.set_aspect( 'equal' )
corr = correlate2d( im1, im1, boundary='symm', mode='same')
n1 += 1
ax = plt.subplot( ny, nx, n1 )
ax.contourf( corr, 20 )
ax.set_title( 'auto-correlation' )
ax.set_aspect( 'equal' )
for a in 0, 1:
imtest = np.roll(im1,4,axis=a)
corr = correlate2d( im1, imtest, boundary='symm', mode='same')
n1 += 1
ax = plt.subplot( ny, nx, n1 )
ax.imshow( imtest )
ax.set_title( 'roll axis %d'%a )
n1 += 1
ax = plt.subplot( ny, nx, n1 )
ax.contourf( corr, 20 )
ax.set_title( 'correlation, roll axis %d'%a )
ax.set_aspect( 'equal' )
imtest = np.flip(im1,axis=a)
corr = correlate2d( im1, imtest, boundary='symm', mode='same')
n1 += 1
ax = plt.subplot( ny, nx, n1 )
ax.imshow( imtest )
ax.set_title( 'flip axis %d'%a )
n1 += 1
ax = plt.subplot( ny, nx, n1 )
ax.contourf( corr, 20 )
ax.set_title( 'correlation, flip axis %d'%a )
ax.set_aspect( 'equal' )
plt.tight_layout()
plt.show()
Вот вывод с использованиемваше сырое изображение.Обратите внимание, где локальные максимумы встречаются в корреляциях, для самокорреляции и для бросков и бросков.
![Output from the sample code](https://i.stack.imgur.com/Dg9tJ.png)
См. Пример, приведенный внизу здесь: scipy.signal.correlate2d