How to find correlation between two images using Numpy
这是受这个问题的启发。
我正在尝试使用 Numpy 查找两个灰度图像之间的相关性。使用 SciPy\\'s correlate2d 我们可以找到这个。我找到了 Numpy 的 corrcoef,但是当我与 correlate2d 进行比较时,结果有所不同。因此这个问题 - Numpy 中是否有 correlate2d 等价物?
- SciPys correlate2d 可能只是在底层使用 NumPy。您可以尝试复制相关的源代码(以及它所依赖的 SciPy 中的所有其他内容)。最有可能的correlation2d将利用相关性和卷积之间的相似性来计算具有翻转和共轭输入的2d卷积。
-
为什么不直接使用 scipy?单独使用 NumPy 会非常困难,它会涉及大量的傅立叶变换,最好的情况是你重新发明了 scipy.correlate2d。 np.corrcoef 根本不是你想要的——有 np.correlate 但它是一维的。
-
根据我更好的判断,我在没有 scipy 的情况下尝试了它:)
-
@kwinkunks 我不反对使用 SciPy,我想知道它是如何在幕后完成的。谢谢。
-
如果您对使用 SciPy 等开源软件如何在后台完成工作感兴趣,请不要犹豫直接查看源代码。像 Pycharm 这样的优秀 IDE 可以让您经常使用单个命令直接跳转到源代码。
-
@kwinkunks 谢谢。我会记住这一点。
-
@Trilarion 是的,你是对的。通过对翻转的输入数组之一执行卷积来找到相关性 - 进行调用 sigtools._convolve2d(in1, in2.conj(), 0, val, bval, fillvalue)。函数定义:sigtools._convolve2d(in1, in2, flip, mode, boundary, fillvalue)
据我所知,这会产生与 scipy.correlate2d() 相同的结果,其中 img1 和 img2 是表示灰度(即单通道)图像的二维数组:
1 2 3 4 5 6 7 8
| import numpy as np
pad = np.max(img1.shape) // 2
fft1 = np.fft.fft2(np.pad(img1, pad))
fft2 = np.fft.fft2(np.pad(img2, pad))
prod = fft1 * fft2.conj()
result_full = np.fft.fftshift(np.fft.ifft2(prod))
corr = result_full.real[1+pad:-pad+1, 1+pad:-pad+1] |
单像素裁剪调整不是很优雅,但对你来说这是 FFT:很繁琐。
我只想说 scipy 非常好用,我强烈推荐它。话虽如此,对于我尝试过的单个案例,这种方法似乎确实要快得多。
- 使用 Numpy 版本运行代码 - 1.15.4 会引发 TypeError: pad() missing 1 required positional argument: mode。使用默认值 constant 显式指定参数 mode 可以纠正它 - mode="constant"。除此之外,这个答案是完美的。谢谢你。