見出し画像

Lesson 5 Quiz Find Template 1D: Numpy.correlate マッチングを推定する

Lesson 5、Quiz。Cross-correlationとは相互相関。
2つの1次元配列をcorrelationを使ってマッチングするところがあるかを調べます。Lesson内で出てきた結果とは過ごし違うのですが、MATLABとNumpyの実装の違い??大体あっているので良しとします。画像のマッチングってこうやってやってるんだっていう概念が分かりました。

import numpy as np

def find_template_1D(template, signal):
       # npの配列に変換
       t = np.array(template)
       s = np.array(signal)

       # 平均値を0にする処理
       t = t - t.mean()
       s = s - s.mean()
       print(template)
       print(t)

       # correlation配列はlen(t)-1長くなっている
       correlation = np.correlate(s, t, 'full')

       print('correlation(' + str(len(correlation)) + '):' + str(correlation));
       index = correlation.argmax() - (len(t)-1)
       print('index:' + str(index))
       print('\n')
       return index

結果はこんな感じ。signalの中にtemplateがあるかどうかの相関を調べて、一番相関が高いところのindexを返しています。

Signal(14):[-1, 0, 0, 1, 1, 1, 0, -1, -1, 0, 1, 0, 0, -1]

Template(3):[1, 1, 0]
[ 0.33333333  0.33333333 -0.66666667]
correlation(16):[ 6.66666667e-01 -3.33333333e-01 -3.33333333e-01 -6.66666667e-01
-3.33333333e-01  1.11022302e-16  6.66666667e-01  1.00000000e+00
 3.33333333e-01 -6.66666667e-01 -1.00000000e+00  3.33333333e-01
 3.33333333e-01  6.66666667e-01 -3.33333333e-01 -3.33333333e-01]
index:5

Template(4):[0, -1, -1, 0]
[ 0.5 -0.5 -0.5  0.5]
correlation(17):[-0.5  0.5  0.5  0.   0.  -0.5 -0.5 -0.5  0.5  1.   0.5 -1.  -0.5  0.
 0.5  0.5 -0.5]
index:6

Template(5):[1, 1, 1, 0, 0]
[ 0.4  0.4  0.4 -0.6 -0.6]
correlation(18):[ 0.6  0.6 -0.4 -1.  -1.6 -0.8  0.2  1.8  2.   0.6 -1.4 -1.4  0.   1.
 1.  -0.4 -0.4 -0.4]
index:4


Tip1: signalとtemplateで平均値を0にする処理をしている。
Tip2: correlationの配列はsignalの配列より、len(template)-1長くなっているので、それを引くようにしている。
Tip3: 3つ目のtemplateは、signal内に一致するものは見られないが、この辺りに似ているところがあると高い相関値を返している。当たり前なんだけど、なるほど〜

### 参考


この記事が気に入ったらサポートをしてみませんか?