2019年7月27日土曜日

相互相関関数

先輩から「これ、よかったよ」と勧められた図書です。

ディジタル画像処理編集委員会「ディジタル画像処理 [改訂新版]」

全く興味がなかったのですが、お借りして良かったですね。
フィルタ処理や領域処理等、各種画像処理の考え方が包括的に掲載されています。画像を xy 2次元+RGB 3次元の配列と考えると、線形代数等で扱われている処理がそのまま使えます。回転テンソル、固有値解析など。ベイズ統計やフーリエ変換も出てきました。
画像処理には何らかの数値処理を施しているとは思っていましたが、求める結果を得ることが先で、その中身まで深く考えたことはありませんでした。まさか領域分割の一つにカーネル密度関数とその極大位置が利用されているとは。興味を持たないというのは怖い。

特に興味を惹かれたのが、相互相関関数を利用した画像マッチング。ちょうど、「SPAC係数は自己相関でなく相互相関でない?」などと思案中でしたので、驚き。

残念ながらこの図書には実装できるまでの実用的な記載はありません(ソフトが処理してくれますから必要ないのです)。python だと 2D の相互相関関数もあるかな?と思って調べると、ありました。まさに画像マッチング。

scipy.signal.correlate2d
https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.correlate2d.html
コチラ↓はノーマライズしてます。地球統計学でも標準偏差で割っていた似た式がありました。
https://stackoverflow.com/questions/1819124/image-comparison-algorithm

correlate2d には mode が3種 (full, valid, same)あるようです。どのような結果になるのでしょうか?

このような結果でした↓

a=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
b=np.array([[1,1,1],[1,1,1],[1,1,1]])
print(a)
print(b)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]
 [13 14 15 16]]
[[1 1 1]
 [1 1 1]
 [1 1 1]]
cor2 = signal.correlate2d(a, b, mode='full')
print(cor2)
[[ 1  3  6  9  7  4]
 [ 6 14 24 30 22 12]
 [15 33 54 63 45 24]
 [27 57 90 99 69 36]
 [22 46 72 78 54 28]
 [13 27 42 45 31 16]]
cor2 = signal.correlate2d(a, b, mode='valid')
print(cor2)
[[54 63]
 [90 99]]
cor2 = signal.correlate2d(a, b, mode='same')
print(cor2)
[[14 24 30 22]
 [33 54 63 45]
 [57 90 99 69]
 [46 72 78 54]]
左上から順に重ね合わせる作業は3つとも同じ。返すarray の範囲が異なっているだけです。same が使えそうですね。
個人的には、最大値で該当箇所を見つけられる以上に、異なる次元のベクトルを比較して類似度を判定できる性質に、相互相関関数の価値を見出せそうです。

興味がないと割り切ってしまえば終わります。なんでも手を出してみるものですね。
先輩に感謝。

0 件のコメント:

コメントを投稿