【问题标题】:Phase correlation相位相关
【发布时间】:2010-05-14 02:34:50
【问题描述】:

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

【问题讨论】:

    标签: python correlation fft


    【解决方案1】:

    对数极坐标变换实际上是旋转和尺度不变的。在对数极坐标变换中,旋转对应于 y 轴的偏移,而缩放对应于 x 轴的偏移

    在图像y中寻找图像x的简单步骤如下:

    1. 在图像 y 中查找图像 x(使用笛卡尔坐标中的相位相关性)

    2. 计算 x 和 y 的对数极坐标变换(这是另一个问题,请参阅下面的参考资料),确保在两个图像中都以相同的特征为中心。

    3. 求 x 和 y 的 FFT,比如 F(X) 和 F(y)

    4. 求F(x)和F(y)的相位相关,称之为R

    5. 求 R 的 IFFT(逆 FFT)。R 的峰值对应于 Y 轴的旋转偏差和 X 轴与原始图像的 Scaling 偏差。

      李>

    参考资料:

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

    【讨论】:

    • 链接好像失效了。
    【解决方案2】:

    我一直在研究同一个问题。我花了一个周末来写这篇文章。这不是最干净的代码,但我只是物理学家,不是程序员……

    相位相关本身很简单:使用您喜欢的卷积算法对两张图像进行卷积。峰值位置为您提供旋转/缩放差异。 Wikipedia 上有很好的解释(在问题中提到的链接中)。

    我的问题是我找不到好的对数极坐标转换器,所以我写了一个。这不是万无一失的,但它可以完成工作。任何愿意重写它以使其更清晰的人,请这样做!

    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 应该包含一个峰,其坐标是大小差和角度差。此外,您可以简单地使用 numpy 的 np.correlate() 函数,而不是使用 FFT:

    # Conversion to log-polar coordinates
    lpimage = logpolar(image)
    lptarget = logpolar(target)
    
    # Correlation
    correlation = np.correlate(lpimage,lptarget)
    

    【讨论】:

    • 抱歉,回复晚了,我有一段时间没用了……我现在正在编辑我的答案。
    • 嘿 Phil,我尝试运行您的函数,但出现运行时错误。你介意帮帮我吗? stackoverflow.com/questions/16654083
    • 嗨,保罗,我注意到你的问题得到了答案。我更新了我的答案以警告彩色图像,感谢您发现该错误!另外,不要在这个答案中复制我的风格,经过几个月的 python 工作,我现在看到它有多糟糕!
    【解决方案3】:

    这是一个实现:http://www.lfd.uci.edu/~gohlke/code/imreg.py.html。我发现找到两张 128x128 图像之间的相似性需要 0.035 秒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 2013-02-24
      • 1970-01-01
      相关资源
      最近更新 更多