相関を使用できます。黒の値を -1 に設定し、白の値を 1 (またはその逆) に設定して、相関のピークの値を把握し、正しい文字でのみ発生するようにする必要があります。
次のコードは、私があなたが望むと思うことを行います。
import numpy
from scipy import signal
# Set up the inputs
a = numpy.random.randn(100, 200)
a[a<0] = 0
a[a>0] = 255
b = numpy.random.randn(20, 20)
b[b<0] = 0
b[b>0] = 255
# put b somewhere in a
a[37:37+b.shape[0], 84:84+b.shape[1]] = b
# Now the actual solution...
# Set the black values to -1
a[a==0] = -1
b[b==0] = -1
# and the white values to 1
a[a==255] = 1
b[b==255] = 1
max_peak = numpy.prod(b.shape)
# c will contain max_peak where the overlap is perfect
c = signal.correlate(a, b, 'valid')
overlaps = numpy.where(c == max_peak)
print overlaps
これ(array([37]), array([84]))
は、コードで設定されたオフセットの位置を出力します。
文字サイズに大きな配列のサイズを掛けたものが、おおよそ Nlog(N) よりも大きい場合、N は検索対象の大きな配列のサイズに対応する (各次元について) 場合、おそらく次のようになります。のようなfftベースのアルゴリズムを使用してスピードアップしscipy.signal.fftconvolve
ます(相関ではなく畳み込みを使用している場合は、データセットの1つの各軸を反転する必要があることに注意してください-flipud
およびfliplr
)。唯一の変更は、c: を割り当てることです。
c = signal.fftconvolve(a, numpy.fliplr(numpy.flipud(b)), 'valid')
上記のサイズのタイミングを比較します。
In [5]: timeit c = signal.fftconvolve(a, numpy.fliplr(numpy.flipud(b)), 'valid')
100 loops, best of 3: 6.78 ms per loop
In [6]: timeit c = signal.correlate(a, b, 'valid')
10 loops, best of 3: 151 ms per loop