python - 从python中的相关矩阵中找到峰值

标签 python correlation phase

我的主要问题解释如下: translation/rotation through phase correlation in python

具体来说,我想知道如何从相关矩阵中找到峰值,以及如何解释该值。从链接中,为那些感兴趣的人详细解释了整个问题,但主要要知道的是,我试图找出一个图像相对于另一个图像平移和旋转的距离(这是一个稍微修改的版本)另一个图像)。我正在尝试使用相位相关来实现这一点,这给了我一个相关矩阵(numpy 数组类型)作为结果。我尝试在相关矩阵上使用 argmax() ,这给了我一个数字(215),这对我来说没有任何意义。我期待两个数字,其中一个应该表示平移的偏移量,另一个表示一个图像相对于另一个图像的旋转。

简而言之:如何找到相关矩阵中的峰值(在 Python 中)?

import scipy as sp
from scipy import ndimage
from PIL import Image
from math import *
import numpy as np

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

def load_image( infilename ) :
    img = Image.open( infilename )
    img.load()
    data = np.asarray( img, dtype="int32" )
    return data

def save_image( npdata, outfilename ) :
    img = Image.fromarray( np.asarray( np.clip(npdata,0,255), dtype="uint8"), "L" )
    img.save( outfilename )

image = load_image("C:/images/testing_image1.jpg")[:,:,0] 
target = load_image("C:/images/testing_otherimage.jpg")[:,:,0] 

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

# Correlation through FFTs
Fcorr = np.fft.fft(lpimage)*np.fft.fft(lptarget)
correlation = np.fft.ifft(Fcorr)

max = np.argmax(correlation)

print max

最佳答案

这里的脚本可以满足您的要求:http://www.lfd.uci.edu/~gohlke/code/imreg.py.html 。它使用对数极坐标图像与 FFT 相结合,提供平移、旋转以及尺度不变图像共同配准。

关于python - 从python中的相关矩阵中找到峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19813917/

相关文章:

maven - Maven何时执行阶段、目标或生命周期?

python - Python中的时变带通滤波器

python - Django 使用整数字段作为外键字段

python - 如何在 Django Web 上使用 POST Rest API?想在 django 中使用用户注册的 API,这是我完成的代码

image-processing - 卷积与相关

python - 为什么 numpy fft 返回不正确的相位信息?

python - 在 Mac 上安装 basemap 时出错

python - Tensorflow初始化一个稀疏张量,只有一行/列不为零?

Pandas .corr() 返回 "__"

python - DataFrame 相关性产生 NaN,尽管它的值都是整数