2010-05-14 32 views
5

如何通过2个图像的相位相关性(使用fft)确定旋转角度?在http://en.wikipedia.org/wiki/Phase_correlation中给出的算法返回线性移位,而不是角度。它还提到图像必须转换为对数极坐标来计算旋转。这个转换是如何在python中实现的?和转换后做相同的步骤的算法举行?相位相关

回答

4

登录极性变换实际上是旋转和尺度不变..旋转对应于y轴的移位和缩放对应于x轴移位在数极坐标变换

所以简单的步骤是寻找在图像x如下图像Y:在图像Y

  1. 查找图像x(直角坐标系中使用阶段的相关性)

  2. 计算日志x和y的极性变换(这是一个整体的其他问题,请参考s),请确保以两张图像中的相同特征为中心。

  3. x和y的查找FFT,说F(X)和F(Y)的F

  4. 查找相位相关(x)和F(y)时,调用它ř

  5. 查找R的IFFT(反FFT)。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(),它可以很容易地适应于处理彩色图像。

编辑:现在,执行关联的代码很简单。在将脚本导入这两个图像作为imagetarget,请执行下列操作:

# 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的,你可以简单地使用numpy的的np.correlate()功能:

# Conversion to log-polar coordinates 
lpimage = logpolar(image) 
lptarget = logpolar(target) 

# Correlation 
correlation = np.correlate(lpimage,lptarget) 
+0

你可以发布完整的源代码(不仅是logpolar)吗? – mrgloom 2012-12-13 07:23:13

+0

对不起,我迟到了一段时间......我正在编辑我的答案。 – PhilMacKay 2013-01-25 17:14:47

+0

嘿菲尔,我试着运行你的函数,但我得到一个运行时错误。你介意帮我吗? http://stackoverflow.com/questions/16654083/ – 2013-05-20 16:40:02