Фазовая корреляция

Как угол поворота можно определить по фазовой корреляции (используя fft) из 2 изображений? Алгоритм, приведенный в http://en.wikipedia.org/wiki/Phase_correlation, возвращает линейный сдвиг, а не угловой. Он также упоминает, что изображения должны быть преобразованы в лог-полярные координаты для вычисления вращения. Как это преобразование достигается в python? А пост-преобразование выполняет те же шаги, что и алгоритм?

  • Как получить все значения слова, используя python NLTK?
  • Как создать полный сжатый файл tar с помощью Python?
  • Модельный подход наследования с ORM Django
  • Как преобразовать pandas DataFrame в TimeSeries?
  • Как избавиться от фиктивного выбора, созданного RadioSelect of Django Form
  • Проблема определения Python
  • Как создать словарь Python с двойными кавычками в качестве формата котировки по умолчанию?
  • Многопроцессорность Python: отчет о ходе процессов
  • 3 Solutions collect form web for “Фазовая корреляция”

    Лог-полярное преобразование фактически является поворотным и масштабным инвариантом. Вращение соответствует смещению по оси y, а масштабирование соответствует сдвигу по оси х в логарифмическом полярном преобразовании

    Итак, простые шаги для поиска изображения x в изображении y:

    1. Найти изображение x в изображении y (использовать фазовую корреляцию в декартовых координатах)

    2. Вычислите полярные преобразования логов как x, так и y (это целая другая проблема, см. Ссылки ниже), убедитесь, что они сосредоточены на одной и той же функции на обоих изображениях.

    3. Найти FFT от x и y, скажем F (X) и F (y)

    4. Найти фазовую корреляцию F (x) и F (y), назовем ее R

    5. Найти IFFT (обратный БПФ) R. Пиковое значение R соответствует отклонению вращения в оси Y и к отклонению шкалы в оси X от исходного изображения.

    Рекомендации:

    1. http://etd.lsu.edu/docs/available/etd-07072005-113808/unrestricted/Thunuguntla_thesis.pdf

    Некоторое время я работал над той же проблемой. Я взял уик-энд, чтобы написать это. Это не самый чистый код, но я физик, а не программист …

    Сама фазовая корреляция проста: используйте свой любимый алгоритм свертки для свертки двух изображений. Положение пика дает вам разность вращения / масштабирования. Это хорошо объяснено в Википедии (в ссылке, упомянутой в вопросе).

    Моя проблема заключалась в том, что я не мог найти хороший лог-полярный конвертер, поэтому я написал один. Это не безупречно, но он выполняет свою работу. Любой, кто хочет переписать его, чтобы сделать его более ясным, пожалуйста, сделайте это!

    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 массива должна содержать пик, координаты которого – разность размеров и разность углов. Кроме того, вместо использования FFT вы можете просто использовать 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 . Я нашел, что для поиска сходства между двумя изображениями 128×128 требуется 0.035 секунд.

    Interesting Posts

    Python: преобразовать список словарей python в массив объектов JSON

    Нормализация строк матричного питона

    Как наносить нулями тензор вдоль некоторой оси (Python)

    Chaco MultiLinePlot – не может получить простой график для отображения, задаваясь вопросом, не сломался ли пакет?

    Почему я не могу изменить или переназначить значения переменных в списках с помощью цикла for (python)?

    Сообщение флэш-флэш-памяти больше не работает при использовании ajax

    Как подключить пользовательский сигнал к слоту в pyside с новым синтаксисом?

    Общая реализация дерева?

    Определение цвета изображения с использованием python

    webdriverprefs.json не найден – pyinstaller

    Запись данных в файл hdf с использованием многопроцессорности

    Python в браузере: как выбрать между Brython, PyPy.js, Skulpt и Transcrypt?

    Numpy: увеличивать элементы массива с учетом индексов, необходимых для увеличения

    Python: преобразовать «список кортежей» в 1 плоский список или 1 матрицу

    Как я могу получить dict из запроса sqlite?

    Python - лучший язык программирования в мире.