计算互相关函数?

2024-05-23 17:36:25 发布

您现在位置:Python中文网/ 问答频道 /正文

R中,我使用ccfacf来计算成对互相关函数,以便找出哪个移位给我最大值。从它的外观来看,R给了我一个标准化的值序列。Python的scipy中是否有类似的东西,或者我应该使用fft模块来完成它?目前,我的做法如下:

xcorr = lambda x,y : irfft(rfft(x)*rfft(y[::-1]))
x = numpy.array([0,0,1,1])
y = numpy.array([1,1,0,0])
print xcorr(x,y)

Tags: 模块lambda函数fftnumpy序列scipyarray
3条回答

如果你在寻找一个快速的,标准化的一维或二维互相关 我建议使用openCV库(请参见http://opencv.willowgarage.com/wiki/http://opencv.org/)。这个组维护的互相关代码是最快的,它将被规范化(结果介于-1和1之间)。

<>这是一个C++库,代码是用CMake维护的,并且有Python绑定,以便访问互相关函数是方便的。OpenCV也能很好地与numpy配合。如果我想从numpy数组开始计算一个二维互相关,我可以这样做。

import numpy
import cv

#Create a random template and place it in a larger image
templateNp = numpy.random.random( (100,100) )
image = numpy.random.random( (400,400) )
image[:100, :100] = templateNp

#create a numpy array for storing result
resultNp = numpy.zeros( (301, 301) )

#convert from numpy format to openCV format
templateCv = cv.fromarray(numpy.float32(template))
imageCv = cv.fromarray(numpy.float32(image))
resultCv =  cv.fromarray(numpy.float32(resultNp))

#perform cross correlation
cv.MatchTemplate(templateCv, imageCv, resultCv, cv.CV_TM_CCORR_NORMED)

#convert result back to numpy array
resultNp = np.asarray(resultCv)

对于一维互相关,创建一个形状等于(N,1)的二维数组。尽管要转换成openCV格式还需要一些额外的代码,但scipy的速度还是相当惊人的。

我刚刚完成了我自己的N维数组的标准化互相关优化实现。您可以从here获取它。

它将使用scipy.ndimage.correlate直接计算互相关,或者在频域中使用scipy.fftpack.fftn/ifftn计算互相关,具体取决于哪个最快。

要交叉关联1d数组,请使用numpy.correlate

对于二维数组,使用scipy.signal.correlate2d

还有scipy.stsci.convolve.correlate2d

还有基于numpy.correlate的matplotlib.pyplot.xcorr

有关不同实现的一些链接,请参见this post on the SciPy mailing list

编辑:@user333700在注释中添加了指向SciPy ticket for this issue的链接。

相关问题 更多 >