【问题标题】:Find location where smaller array matches larger array the most查找较小数组与较大数组最匹配的位置
【发布时间】:2020-02-20 05:57:15
【问题描述】:

我需要找到一个较小的二维数组 array1 与另一个二维数组 array2 中最接近的位置匹配。

  • array1 的 grid_size 大小为 46x46 到 96x96。

  • array2 会更大 (184x184)。

我只能访问 numpy。

我目前正在尝试使用Tversky formula,但未绑定。

效率是最重要的部分,因为这将运行多次。下面显示的我当前的解决方案非常慢。

for i in range(array2.shape[0] - grid_size):
    for j in range(array2.shape[1] - grid_size):
        r[i, j] = np.sum(array2[i:i+grid_size, j:j+grid_size] == array1 ) / (np.sum(array2[i:i+grid_size, j:j+grid_size] != array1 ) + np.sum(Si[i:i+grid_size, j:j+grid_size] == array1 ))

编辑: 目标是找到一个较小的图像与另一个图像匹配的位置。

【问题讨论】:

  • 查看归一化互相关和卷积
  • “最接近”是什么意思?查找此匹配部分的预期目的是什么。数组中有什么?整数,浮点数?备用还是密集?值是否绑定到范围?
  • 我正在通过比较寻找一个元素。该数组是来自图像的整数
  • @MadPhysicist 我一直在尝试。我遇到的一个问题是,如果较小的数组全为 0,则卷积不会返回任何内容
  • 这不是实质上的图像配准(只用翻译)吗?

标签: python numpy python-3.4


【解决方案1】:

这是一种基于 FFT/卷积的方法,可以最小化欧几里得距离:

import numpy as np
from numpy import fft

N = 184
n = 46
pad = 192

def best_offs(A,a):
    A,a = A.astype(float),a.astype(float)
    Ap,ap = (np.zeros((pad,pad)) for _ in "Aa")
    Ap[:N,:N] = A
    ap[:n,:n] = a
    sim = fft.irfft2(fft.rfft2(ap).conj()*fft.rfft2(Ap))[:N-n+1,:N-n+1]
    Ap[:N,:N] = A*A
    ap[:n,:n] = 1
    ref = fft.irfft2(fft.rfft2(ap).conj()*fft.rfft2(Ap))[:N-n+1,:N-n+1]
    return np.unravel_index((ref-2*sim).argmin(),sim.shape)

# example
# random picture
A = np.random.randint(0,256,(N,N),dtype=np.uint8)
# random offset
offy,offx = np.random.randint(0,N-n+1,2)
# sub pic at random offset
# randomly flip half of the least significant 75% of all bits
a = A[offy:offy+n,offx:offx+n] ^ np.random.randint(0,64,(n,n))

# reconstruct offset
oyrec,oxrec = best_offs(A,a)
assert offy==oyrec and offx==oxrec

# speed?
from timeit import timeit
print(timeit(lambda:best_offs(A,a),number=100)*10,"ms")

# example with zero a
a[...] = 0
# make A smaller in a matching subsquare
A[offy:offy+n,offx:offx+n]>>=1

# reconstruct offset
oyrec,oxrec = best_offs(A,a)
assert offy==oyrec and offx==oxrec

示例运行:

3.458537160186097 ms

【讨论】:

  • 谢谢!这个解决方案正是我想要的。根据我的快速测试,它比我的解决方案快 150%。我认为 fft 可以工作,但我无法将所有部分放在一起。以后我会研究这段代码。
猜你喜欢
  • 2017-10-08
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多