【问题标题】:Efficient 2D cross correlation in Python?Python中高效的2D互相关?
【发布时间】:2018-07-25 22:02:24
【问题描述】:

我有两个大小为(n, m, m) 的数组(n 大小为(m,m) 的图像数量)。我想在两个数组的每个对应的n 之间执行互相关。

示例:n=1 -> 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 的correlate2d。 我环顾四周,但没有找到任何允许沿某个轴或多个输入进行关联的函数。

关于如何使 scipy 的 correlate2d 工作或替代方案的任何提示?

【问题讨论】:

    标签: python optimization scipy


    【解决方案1】:

    我决定改为通过 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 像素

    如果您的输入不同,请根据自己的喜好调整填充 检查您的输入顺序是否与我的相同,否则更改fft2ifft2 函数、np.prod 和fftshift 中的轴参数。我使用fftshift 来获得中间的最大值(否则在角落),所以如果这不是你想要的,请小心。

    为什么是最大值?从技术上讲,它不一定是,但出于我的目的,它是。 fftshift 用于获得看起来像您习惯的相关性。否则,象限将“由内向外”翻转。如果您想知道我的意思,请删除 fftshift(只是 fftshift 部分,而不是它的参数),像以前一样调用函数,然后绘制它。

    之后,它应该可以使用了。 Possibly x.prod(axis=1) is faster than np.prod(x,axis=1) 但这是一个旧帖子。尝试后对我来说没有任何改善。

    【讨论】:

      猜你喜欢
      • 2011-10-28
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 2015-10-12
      • 2020-04-01
      • 2017-12-28
      • 1970-01-01
      • 2015-04-01
      相关资源
      最近更新 更多