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)
如果你在寻找一个快速的,标准化的一维或二维互相关 我建议使用openCV库(请参见
<>这是一个C++库,代码是用CMake维护的,并且有Python绑定,以便访问互相关函数是方便的。OpenCV也能很好地与numpy配合。如果我想从numpy数组开始计算一个二维互相关,我可以这样做。http://opencv.willowgarage.com/wiki/http://opencv.org/)。这个组维护的互相关代码是最快的,它将被规范化(结果介于-1和1之间)。对于一维互相关,创建一个形状等于(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的链接。
相关问题 更多 >
编程相关推荐