代码之家  ›  专栏  ›  技术社区  ›  CupinaCoffee

在python中有效的二维互相关?

  •  2
  • CupinaCoffee  · 技术社区  · 7 年前

    我有两个尺寸的阵列 (n, m, m) ( n 大小图像数 (m,m) )我想在每个对应的 n 两个数组中的一个。

    例子: n=1 -gt; corr2d([m,m]<sub>1</sub>,[m,m]<sub>2</sub>) 我目前的方法包括在python中使用一组for循环:

    for i in range(len(X)):
        X_co = X[i,0,:,:]/(np.max(X[i,0,:,:]))
        X_x = X[i,1,:,:]/(np.max(X[i,1,:,:]))
        autocorr[i,0,:,:]=correlate2d(X_co, X_x, mode='same', boundary='fill', fillvalue=0)
    

    显然,当输入包含许多图像时,这是非常慢的,并且成为总运行时间的重要部分,如果 (m,m) << n.

    最明显的优化是跳过循环,直接将所有内容馈送到已编译的相关函数。现在我用的是scipy's correlate2d . 我环顾四周,但没有发现任何函数允许沿着某个轴或多个输入进行关联。

    有什么关于如何做西皮的提示吗? 相关二维 工作还是选择?

    1 回复  |  直到 7 年前
        1
  •  3
  •   CupinaCoffee    7 年前

    我决定改为通过FFT来实现它。

    def fft_xcorr2D(x):
        # Over axes (-2,-1) (default in the fft2 function)
        ## Pad because of cyclic (circular?) behavior of the FFT
        x = np.fft2(np.pad(x,([0,0],[0,0],[0,34],[0,34]),mode='constant'))
    
        # Conjugate for correlation, not convolution (Conv. Theorem)
        x[:,1,:,:] = np.conj(x[:,1,:,:])
    
        # Over axes (-2,-1) (default in the ifft2 function)
        ## Multiply elementwise over 2:nd axis (2 image bands for me)
        ### fftshift over rows and column over images
        corr = np.fft.fftshift(np.ifft2(np.prod(x,axis=1)),axes=(-2,-1))
    
        # Return after removing padding
        return np.abs(corr)[:,3:-2,3:-2]
    

    呼叫通过:

    ts=fft_xcorr2D(X)
    

    如果有人想使用它: 我的输入是4d数组: (N, 2, #Rows, #Cols)

    例如。 (500, 2, 30, 30) :500个图像,2个波段(例如极化),共 30x30 像素

    如果输入不同,请根据需要调整填充。 检查以使输入顺序与我的相同,否则更改中的轴参数 fft2 ifft2 函数、np.prod和 fftshift . 我用 快速换档 为了得到中间的最大值(否则在角落),所以如果这不是你想要的,要小心。

    为什么是最大值?从技术上讲,它不一定是,但就我的目的而言,它是。 快速换档 用于获取看起来像您习惯的相关性。否则,象限将被“内转外”。如果你不明白我的意思,把 快速换档 (只是 快速换档 部分,而不是它的参数),像以前一样调用函数,并绘制它。

    之后,它应该可以使用了。 Possibly x.prod(axis=1) is faster than np.prod(x,axis=1) 但这是一个古老的职位。我试了之后没有什么进步。