9

黒 (0) と白 (255) のセルで構成される numpy 配列として表現された 100x200 の 2D 配列があります。ビットマップファイルです。次に、2D の黒と白のセルでもある 2D 形状 (文字と考えるのが最も簡単です) があります。

マトリックスを単純に反復できることはわかっていますが、これはコードの「ホット」な部分になるため、速度が懸念されます。numpy/scipy でこれを実行する高速な方法はありますか?

Scipy の相関関数について簡単に説明しました。私は「あいまい一致」には興味がなく、完全一致のみに興味があります。私はいくつかの学術論文も見ましたが、それらは私の頭の上にあります。

4

2 に答える 2

9

相関を使用できます。黒の値を -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
于 2012-06-18T08:54:16.707 に答える
9

要件の詳細に応じて、使用または適応できる方法を次に示します。とを使用ndimage.labelndimage.find_objectsます。

  1. これを使用して画像ndimage.labelにラベルを付けると、配列内のすべてのブロブが検出され、整数にラベル付けされます。
  2. を使用してこれらのブロブのスライスを取得しますndimage.find_objects
  3. 次に、交差の設定を使用して、がfound blobs対応するかどうかを確認しますwanted blobs

1.とのコード2.:

import scipy
from scipy import ndimage
import matplotlib.pyplot as plt

#flatten to ensure greyscale.
im = scipy.misc.imread('letters.png',flatten=1)
objects, number_of_objects = ndimage.label(im)
letters = ndimage.find_objects(objects)

#to save the images for illustrative purposes only:
plt.imsave('ob.png',objects)
for i,j in enumerate(letters):
    plt.imsave('ob'+str(i)+'.png',objects[j])

入力例:

ここに画像の説明を入力

ラベル:

ここに画像の説明を入力

テスト対象の分離されたブロブ:

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

于 2012-06-18T09:02:11.367 に答える