Как угол поворота можно определить по фазовой корреляции (используя fft) из 2 изображений? Алгоритм, приведенный в http://en.wikipedia.org/wiki/Phase_correlation, возвращает линейный сдвиг, а не угловой. Он также упоминает, что изображения должны быть преобразованы в лог-полярные координаты для вычисления вращения. Как это преобразование достигается в python? А пост-преобразование выполняет те же шаги, что и алгоритм?Фазовая корреляция
ответ
Входа полярная преобразование фактически поворот и масштаб инвариантный .. Вращение соответствует сдвигу в оси у и масштабирование соответствует сдвигу в оси х в журнале полярной трансформации
Так простые шаги являются для нахождения изображения х в изображение у:
поиск изображения х в образе у (использование фазовой корреляции в декартовых координатах)
Compute войти полярные преобразования обоих х и у (это совсем другая проблема, см ссылку s ниже), не забудьте сосредоточиться на одной и той же функции на обоих изображениях.
Поиск FFT х и у, скажем, F (X) и F (у)
Поиск фазы корреляции F (х) и Р (у), назовем его R
Найти IFFT (обратный БПФ) R. Пиковое значение R соответствует отклонению вращения в оси Y и к отклонению масштабирования по оси X от исходного изображения.
Ссылки:
я работал на одной и той же задачи на некоторое время. Я взял уик-энд, чтобы написать это. Это не самый чистый код, но я физик, а не программист ...
Сама фазовая корреляция проста: используйте свой любимый алгоритм свертки, чтобы сверлить два изображения. Положение пика дает вам разность вращения/масштабирования. Это хорошо объяснено в Википедии (в ссылке, упомянутой в вопросе).
Моя проблема заключалась в том, что я не мог найти хороший лог-полярный конвертер, поэтому я написал один. Это не безупречно, но он выполняет свою работу. Любой, кто хочет переписать его, чтобы сделать его более ясным, пожалуйста, сделайте это!
import scipy as sp
from scipy import ndimage
from math import *
def logpolar(input,silent=False):
# This takes a numpy array and returns it in Log-Polar coordinates.
if not silent: print("Creating log-polar coordinates...")
# Create a cartesian array which will be used to compute log-polar coordinates.
coordinates = sp.mgrid[0:max(input.shape)*2,0:360]
# Compute a normalized logarithmic gradient
log_r = 10**(coordinates[0,:]/(input.shape[0]*2.)*log10(input.shape[1]))
# Create a linear gradient going from 0 to 2*Pi
angle = 2.*pi*(coordinates[1,:]/360.)
# Using scipy's map_coordinates(), we map the input array on the log-polar
# coordinate. Do not forget to center the coordinates!
if not silent: print("Interpolation...")
lpinput = ndimage.interpolation.map_coordinates(input,
(log_r*sp.cos(angle)+input.shape[0]/2.,
log_r*sp.sin(angle)+input.shape[1]/2.),
order=3,mode='constant')
# Returning log-normal...
return lpinput
Предупреждение: этот код предназначен для изображений в оттенках серого. Он легко может быть адаптером для работы с цветными изображениями, обводя линию с помощью map_coordinates()
на каждой отдельной цветовой рамке.
EDIT: теперь код для корреляции прост. После того, как ваш сценарий импортировала оба изображения, как image
и target
, сделайте следующее:
# Conversion to log-polar coordinates
lpimage = logpolar(image)
lptarget = logpolar(target)
# Correlation through FFTs
Fcorr = np.fft.fft2(lpimage)*np.conj(np.fft.fft2(lptarget))
correlation = np.fft.ifft2(Fcorr)
Массив correlation
должен содержать пик, координаты которых разница в размере и разница в угол.Кроме того, вместо того, чтобы использовать БПФ, вы могли бы просто использовать функцию np.correlate()
Numpy в:
# Conversion to log-polar coordinates
lpimage = logpolar(image)
lptarget = logpolar(target)
# Correlation
correlation = np.correlate(lpimage,lptarget)
Вот реализация: http://www.lfd.uci.edu/~gohlke/code/imreg.py.html. Я нашел, что для поиска сходства между двумя изображениями 128x128 требуется 0.035 секунд.
- 1. Фазовая корреляция char
- 2. фазовая корреляция с использованием FFTW
- 3. фазовая корреляция 2D (строчка 2D в изображенииJ) для сшивания изображений
- 4. фазовая корреляция для сшивания изображений (с использованием окна Хэмминга)
- 5. Фазовая диаграмма в R
- 6. фазовая выборка в OFDM-сигнале
- 7. Корреляция изображения
- 8. Корреляция IComMethodEvents
- 9. Взвешенная корреляция
- 10. Параллельная корреляция на питоне медленнее, чем одна корреляция процесса
- 11. Автоматическая корреляция в JMeter
- 12. Корреляция Пирсона в Python
- 13. Корреляция между столбцами NA
- 14. множественная корреляция numpy - векторизация
- 15. Матричная корреляция перестановки столбцов
- 16. pandas spearman корреляция странная?
- 17. FIND формулы корреляция Таблица
- 18. Корреляция в R; numeric
- 19. Корреляция массивных матриц
- 20. Циркулярная корреляция в Theano
- 21. Корреляция Спирмена и галстуки
- 22. MATLAB - Корреляция с векторами
- 23. Liferay p_auth корреляция
- 24. корреляция в matlab
- 25. Корреляция Пирсона в PHP
- 26. Корреляция Пирсона после нормализации
- 27. Корреляция Corrplot Конфигурация
- 28. Простая корреляция в R
- 29. Свертывание Vs Корреляция
- 30. Агрегированная корреляция (R :: dplyr)
Вы можете разместить полный исходный код (не только логполярный)? – mrgloom
Извините за поздний ответ, я был афком какое-то время ... Я редактирую свой ответ прямо сейчас. – PhilMacKay
Привет, Фил, я попробовал запустить вашу функцию, но у меня появляется ошибка времени выполнения. Вы не помогаете мне? http://stackoverflow.com/questions/16654083/ –