2010-05-14 9 views
5

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

ответ

4

Входа полярная преобразование фактически поворот и масштаб инвариантный .. Вращение соответствует сдвигу в оси у и масштабирование соответствует сдвигу в оси х в журнале полярной трансформации

Так простые шаги являются для нахождения изображения х в изображение у:

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

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

  3. Поиск FFT х и у, скажем, F (X) и F (у)

  4. Поиск фазы корреляции F (х) и Р (у), назовем его R

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

Ссылки:

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

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

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

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

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) 
+0

Вы можете разместить полный исходный код (не только логполярный)? – mrgloom

+0

Извините за поздний ответ, я был афком какое-то время ... Я редактирую свой ответ прямо сейчас. – PhilMacKay

+0

Привет, Фил, я попробовал запустить вашу функцию, но у меня появляется ошибка времени выполнения. Вы не помогаете мне? http://stackoverflow.com/questions/16654083/ –

Смежные вопросы